溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

使用PHP怎么在登錄環(huán)節(jié)防止sql注入

發(fā)布時(shí)間:2021-02-08 16:31:36 來(lái)源:億速云 閱讀:177 作者:Leah 欄目:開(kāi)發(fā)技術(shù)

使用PHP怎么在登錄環(huán)節(jié)防止sql注入?相信很多沒(méi)有經(jīng)驗(yàn)的人對(duì)此束手無(wú)策,為此本文總結(jié)了問(wèn)題出現(xiàn)的原因和解決方法,通過(guò)這篇文章希望你能解決這個(gè)問(wèn)題。

登錄代碼:

if($l = @mysql_connect('localhost', 'root', '123')) or die('數(shù)據(jù)庫(kù)連接失敗');
mysql_select_db('test');
mysql_set_charset('utf8');
$sql = 'select * from test where username = "$username" and password = "$password"';
$res = mysql_query($sql);
if(mysql_num_rows($res)){
header('Location:./home.php');
}else{
die('輸入有誤');
}

注意上面的sql語(yǔ)句,存在很大的安全隱患,如果使用以下萬(wàn)能密碼和萬(wàn)能用戶名,那么可以輕松進(jìn)入頁(yè)面:

$sql = 'select * from test where username = "***" and password = "***" or 1 = "1"';

很明顯,針對(duì)這條sql語(yǔ)句的萬(wàn)能密碼是: ***" or 1 = "1

$sql = 'select * from test where username ="***" union select * from users/* and password = "***"';

正斜線* 表示后面的不執(zhí)行,mysql支持union聯(lián)合查詢,因此直接查詢出所有數(shù)據(jù); 所以針對(duì)這條sql語(yǔ)句的萬(wàn)能用戶名是:***" union select * from users/*

但是,此注入只針對(duì)代碼中的sql語(yǔ)句,如果

$sql = "select * from test where username = $username and password = $password";

上面的注入至少已經(jīng)不管用了,不過(guò)方法是一樣的;
在使用PDO之后,sql注入完全可以被避免,而且在這個(gè)快速開(kāi)發(fā)的時(shí)代,框架橫行,已然不用過(guò)多考慮sql注入問(wèn)題了。
下面整理了兩個(gè)防止sql注冊(cè)函數(shù)

/* 過(guò)濾所有GET過(guò)來(lái)變量 */
foreach ($_GET as $get_key=>$get_var)
{
if (is_numeric($get_var)) {
$get[strtolower($get_key)] = get_int($get_var);
} else {
$get[strtolower($get_key)] = get_str($get_var);
}
}
/* 過(guò)濾所有POST過(guò)來(lái)的變量 */
foreach ($_POST as $post_key=>$post_var)
{
if (is_numeric($post_var)) {
$post[strtolower($post_key)] = get_int($post_var);
} else {
$post[strtolower($post_key)] = get_str($post_var);
}
}
/* 過(guò)濾函數(shù) */
//整型過(guò)濾函數(shù)
function get_int($number)
{
return intval($number);
}
//字符串型過(guò)濾函數(shù)
function get_str($string)
{
if (!get_magic_quotes_gpc()) {
return addslashes($string);
}
return $string;
}

另外還有一些博客會(huì)這樣寫

<?php  
function post_check($post) 
{ 
if (!get_magic_quotes_gpc()) // 判斷magic_quotes_gpc是否為打開(kāi) 
{ 
$post = addslashes($post); // 進(jìn)行magic_quotes_gpc沒(méi)有打開(kāi)的情況對(duì)提交數(shù)據(jù)的過(guò)濾 
} 
$post = str_replace("_", "\_", $post); // 把 '_'過(guò)濾掉 
$post = str_replace("%", "\%", $post); // 把' % '過(guò)濾掉 
$post = nl2br($post); // 回車轉(zhuǎn)換 
$post= htmlspecialchars($post); // html標(biāo)記轉(zhuǎn)換 
return $post; 
} 
?>

看完上述內(nèi)容,你們掌握使用PHP怎么在登錄環(huán)節(jié)防止sql注入的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI