如果通過網(wǎng)頁獲取用戶輸入的數(shù)據(jù)并將其插入?MySQL
?數(shù)據(jù)庫,那么就有可能發(fā)生?SQL
注入攻擊的安全問題
作為研發(fā),有一條鐵律需要記住,那就是
永遠(yuǎn)不要相信用戶的數(shù)據(jù),哪怕他一再承諾是安全的
SQL 注入式攻擊
SQL
?注入,就是通過把?SQL
?命令插入到?Web
?表單遞交或輸入域名或頁面請求的查詢字符串,最終達(dá)到欺騙服務(wù)器執(zhí)行惡意的?SQL
?命令
比如有一個表單,用戶可以輸入?name
<?php $name = $_GET['name']; $dbh->query("SELECT * FROM users WHERE name='{$name}'");
那么當(dāng)用戶輸入的?name
?為?Python'; DELETE FROM user;'
?時會變成什么?
SELECT * FROM users WHERE name='Python'; DELETE FROM user;'';
這條語句運行一下,會發(fā)現(xiàn)什么? 我們的?user
?表被清空啦,很可怕,對不對
所以我們需要對用戶的輸入進(jìn)行過濾處理
例如下面的 PHP 語句,要求用戶輸入的名稱?name
?必須是字母、數(shù)字及下劃線的組合,且用戶名長度為 8 到 20 個字符之間
<?php if (preg_match("/^\w{8,20}$/", $_GET['name'], $matches)) $dbh->query("SELECT * FROM tbl_language WHERE name=$matches[0]"); else echo "username 輸入異常";
防止 SQL 注入要訣
防止?SQL
?注入,我們需要注意以下幾個要點
-
永遠(yuǎn)不要信任用戶的輸入
對用戶的輸入進(jìn)行校驗,可以通過正則表達(dá)式,或限制長度;對單引號和雙 "-" 進(jìn)行轉(zhuǎn)換等
-
永遠(yuǎn)不要使用動態(tài)拼裝 SQL ,可以使用 SQL 預(yù)處理語句
-
永遠(yuǎn)不要使用管理員權(quán)限的數(shù)據(jù)庫連接,為每個應(yīng)用使用單獨的權(quán)限有限的數(shù)據(jù)庫連接
-
不要把機(jī)密信息直接存放,加密或者 hash 掉密碼和敏感的信息
-
應(yīng)用的異常信息應(yīng)該給出盡可能少的提示,最好使用自定義的錯誤信息對原始錯誤信息進(jìn)行包裝
-
SQL 注入的檢測方法一般采取輔助軟件或網(wǎng)站平臺來檢測
防止 SQL 注入
Perl
和?PHP
?中可以對用戶輸入的數(shù)據(jù)進(jìn)行轉(zhuǎn)義從而來防止 SQL 注入
PHP 中可以使用?PHP_PDO
?的?PDO:prepare()
?方法來預(yù)處理 SQL 語句,然后使用?PDOStatement::bindParam()
?方法綁定參數(shù),或者在?PDOStatement::execute()
?傳入?yún)?shù)來預(yù)防 SQL 注入
<?php $stmt = $dbh->prepare("SELECT * FROM tbl_language WHERE name=?"); $stmt->execute(array$_GET['name']));
LIKE 子句語句中的 SQL 注入
使用?LIKE
?子句查詢時,如果用戶輸入的值有?_
?或?%
,則會出現(xiàn)下面這種情況
用戶本來只是想查詢?abcd%
,查詢結(jié)果中卻有?abcd_
、abcde
、abcdf
?等等文章來源:http://www.zghlxwxcb.cn/news/detail-432637.html
PHP 腳本中,我們首先要使用?addcslashes($name,"%_")
?對輸入的字符進(jìn)行轉(zhuǎn)義,然后使用?PHP_PDO
?的?PDO:prepare()
?方法來預(yù)處理 SQL 語句,然后使用?PDOStatement::bindParam()
?方法綁定參數(shù),或者在?PDOStatement::execute()
?傳入?yún)?shù)來預(yù)防 SQL 注入文章來源地址http://www.zghlxwxcb.cn/news/detail-432637.html
$name = 'thon%'; $name = addcslashes($name,"%_"); $stmt = $dbh->prepare("SELECT * FROM tbl_language WHERE name LIKE ? "); $stmt->execute(array( '%'.$name));
到了這里,關(guān)于MySQL 安全及防止 SQL 注入攻擊的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!