數(shù)據(jù)庫(kù)- mysql
連接 mysql 服務(wù)器
本地服務(wù)器:mysql -u root -p
遠(yuǎn)程服務(wù)器:mysql -h remote_host -u username -p
mysql的數(shù)據(jù)安全性控制
設(shè)置僅允許受信任的主機(jī)連接到mysql數(shù)據(jù)庫(kù)
登錄到MySQL:使用MySQL的管理員用戶(通常是root)登錄到MySQL服務(wù)器。
mysql -u root -p
創(chuàng)建數(shù)據(jù)庫(kù)用戶:如果沒有已經(jīng)創(chuàng)建的用戶,可以使用以下命令創(chuàng)建一個(gè)新用戶。將username和password替換為所需的用戶名和密碼。
CREATEUSER'username'@'localhost' IDENTIFIED BY'password';
這將創(chuàng)建一個(gè)只能從本地連接到MySQL的用戶。如果需要從其他主機(jī)連接,需要修改 'localhost' 部分。
授權(quán)用戶:現(xiàn)在,將權(quán)限授予這個(gè)用戶,使其可以連接到數(shù)據(jù)庫(kù)。如果你只希望這個(gè)用戶能夠連接到特定的數(shù)據(jù)庫(kù),使用以下命令:
GRANTALL PRIVILEGES ON your_database_name.*TO'username'@'localhost';
如果你希望允許從特定IP地址的主機(jī)連接,將 'localhost' 更改為要允許連接的主機(jī)的IP地址或主機(jī)名,例如:
GRANTALL PRIVILEGES ON your_database_name.*TO'username'@'192.168.1.100';
如果你要允許從任何主機(jī)連接,可以使用通配符'%':
GRANTALL PRIVILEGES ON your_database_name.*TO'username'@'%';
刷新權(quán)限:在更改了訪問控制后,需要刷新MySQL的權(quán)限以使更改生效。
FLUSH PRIVILEGES;
退出MySQL:
exit;
現(xiàn)在,只有在受信任的主機(jī)或IP地址上,使用給定的用戶名和密碼才能連接到MySQL數(shù)據(jù)庫(kù)。確保你的MySQL服務(wù)器的端口(默認(rèn)是3306)對(duì)于不受信任的主機(jī)是關(guān)閉的或不可訪問的,以增加安全性。這有助于保護(hù)數(shù)據(jù)庫(kù)免受未經(jīng)授權(quán)的訪問。
sql注入攻擊
就是在輸入框中輸入機(jī)器語(yǔ)言,使得識(shí)別一直為true,繞過校驗(yàn)。
可以通過在接口的查詢語(yǔ)句中,設(shè)置輸入?yún)?shù)化,不直接使用輸入內(nèi)容,將輸入內(nèi)容賦予參數(shù),這個(gè)過程中解析參數(shù)會(huì)過濾掉機(jī)器語(yǔ)言。
SQL注入攻擊是一種常見的網(wǎng)絡(luò)安全威脅,攻擊者試圖通過在應(yīng)用程序中插入惡意SQL代碼來(lái)訪問或修改數(shù)據(jù)庫(kù)中的數(shù)據(jù)。以下是一個(gè)簡(jiǎn)單的SQL注入攻擊示例:
假設(shè)你有一個(gè)基于Web的應(yīng)用程序,用于用戶身份驗(yàn)證,其中包含以下PHP代碼:
$username = $_POST['username']; $password = $_POST['password']; $query = "SELECT * FROM users WHERE username='$username' AND password='$password'"; $result = mysqli_query($conn, $query); if ($result) { // 認(rèn)證成功// 允許用戶登錄 } else { // 認(rèn)證失敗// 拒絕訪問 }
這個(gè)應(yīng)用程序使用用戶提供的用戶名和密碼來(lái)查詢數(shù)據(jù)庫(kù)以進(jìn)行身份驗(yàn)證。然而,它存在嚴(yán)重的SQL注入漏洞,因?yàn)樗苯訉⒂脩糨斎耄?username和$password)插入到SQL查詢中,而不進(jìn)行適當(dāng)?shù)倪^濾和驗(yàn)證。
攻擊者可以通過輸入惡意的用戶名和密碼來(lái)利用這個(gè)漏洞,例如:
Username: ' OR '1'='1 Password: ' OR '1'='1
在這種情況下,構(gòu)造的SQL查詢變成了:
SELECT*FROM users WHERE username=''OR'1'='1'AND password=''OR'1'='1'
由于 '1'='1' 始終為真,所以這個(gè)SQL查詢會(huì)返回所有用戶的記錄,使攻擊者成功繞過身份驗(yàn)證。
為了防止SQL注入攻擊,應(yīng)該使用參數(shù)化查詢或預(yù)處理語(yǔ)句來(lái)構(gòu)建SQL查詢,如下所示:
$username = $_POST['username']; $password = $_POST['password']; $query = "SELECT * FROM users WHERE username=? AND password=?"; $stmt = mysqli_prepare($conn, $query); mysqli_stmt_bind_param($stmt, "ss", $username, $password); mysqli_stmt_execute($stmt); $result = mysqli_stmt_get_result($stmt); if ($result) { // 認(rèn)證成功// 允許用戶登錄 } else { // 認(rèn)證失敗// 拒絕訪問 }
使用參數(shù)化查詢或預(yù)處理語(yǔ)句將用戶輸入與SQL查詢分開,從而有效地防止了SQL注入攻擊。在這種情況下,不再允許攻擊者插入惡意SQL代碼來(lái)繞過身份驗(yàn)證。