php層防止sql注入的方法

Talk is cheap,show me the code.
問(wèn)題代碼:

<?php
$servername="127.0.0.1";
$dbuser="muke_user";
$dbpassword="9Gcag71Gaa";
$dbname="muke";

$mysqli = new mysqli($servername,$dbuser,$dbpassword,$dbname); //配置MySQL連接

if($mysqli->connect_error){
        die('connect error:'.$mysqli->connect_errno);
}
$mysqli->set_charset('UTF-8'); // 設(shè)置數(shù)據(jù)庫(kù)字符集
$username = isset($_GET['username']) ? $_GET['username'] : '';
$password = isset($_GET['password']) ? $_GET['password'] : '';
$sql = "select * from t24 where username='$username' and password= '$password'";
echo "$sql<br/>";
$result = $mysqli->query("$sql");

$data = $result->fetch_all(); // 從結(jié)果集中獲取所有數(shù)據(jù)
if (empty($data))
{
        echo "登錄失敗";
} else {
        echo "登錄成功";
}
echo "<br/>";
print_r($data);
?>

sql注入攻擊:
http://localhost/index.php?username=tmd' or '1=1
sql語(yǔ)句變?yōu)椋?br> select * from d_table where username = 'tmd' or '1=1' and password=''
登錄成功!

解決方案:

1.參數(shù)的過(guò)濾

<?php
$servername="127.0.0.1";
$dbuser="muke_user";
$dbpassword="9Gcag71Gaa";
$dbname="muke";

$mysqli = new mysqli($servername,$dbuser,$dbpassword,$dbname); //配置MySQL連接

if($mysqli->connect_error){
        die('connect error:'.$mysqli->connect_errno);
}
$mysqli->set_charset('UTF-8'); // 設(shè)置數(shù)據(jù)庫(kù)字符集
$username = isset($_GET['username']) ? $_GET['username'] : '';
$password = isset($_GET['password']) ? $_GET['password'] : '';

//增加對(duì)輸入用戶名密碼的判斷,如果不是字母或者數(shù)字,就直接提示格式錯(cuò)誤而退出。
if( !preg_match("/^[a-zA-Z0-9]{1,}$/",$username) || !preg_match("/^[a-zA-Z0-9]{1,}$/",$password) ) {
        die("You input username and password  format error ");
}

$sql = "select * from t24 where username='$username' and password= '$password'";
echo "$sql<br/>";
$result = $mysqli->query("$sql");

$data = $result->fetch_all(); // 從結(jié)果集中獲取所有數(shù)據(jù)
if (empty($data))
{
        echo "登錄失敗";
} else {
        echo "登錄成功";
}
echo "<br/>";
print_r($data);
?>

對(duì)用戶輸入的用戶名和密碼,進(jìn)行了正則的匹配,不符合規(guī)則的終止程序執(zhí)行,參數(shù)校驗(yàn)不要忘記!

  1. addslashes()函數(shù)轉(zhuǎn)義特殊字符
$sql = "select * from t24 where username='" . addslashes($username) . "' and password= '" . addslashes($password) . "'";

再次攻擊:
http://localhost/index.php?username=tmd' or '1=1
sql語(yǔ)句變?yōu)椋?br> select * from d_table where username = 'tmd\'or\'1=1' and password=''
登錄失敗!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容