[英]Protect against SQL injection
我正在開發一個網站,我正在努力保護連接部分。
我在$login
上使用了addslashes
函數來停止SQL注入,但有些朋友告訴我安全性不夠。 但是,他們沒有告訴我如何利用此漏洞。
我怎么能/你能破壞這段代碼? 我該如何保護它?
<?php
if ( isset($_POST) && (!empty($_POST['login'])) && (!empty($_POST['password'])) )
{
extract($_POST);
$sql = "SELECT pseudo, sex, city, pwd FROM auth WHERE pseudo = '".addslashes($login)."'";
$req = mysql_query($sql) or die('Erreur SQL');
if (mysql_num_rows($req) > 0)
{
$data = mysql_fetch_assoc($req);
if ($password == $data['pwd'])
{
$loginOK = true;
}
}
}
?>
您應該使用mysql_real_escape_string在查詢中轉義字符串輸入參數。 使用類型轉換來清理數字參數和白名單以清理標識符。
在引用的PHP頁面中,有一個登錄表單中的sql注入示例。
您以明文存儲密碼! 如果我看到一個,這是一個重大的安全問題。 怎么辦有關:至少使用密碼的(每用戶)鹽漬哈希,因為看到如這里 。
采用:
mysql_real_escape_string($inputToClean);
還有另一個巨大的安全漏洞 - extract
。 它可以避免輸入幾個字符,但是打開了太多無法提及的漏洞,因為它會覆蓋任何全局變量。
如果我發布這個會怎么樣?
$_POST {
'login' => 'Admin',
'loginOK' => 1
}
猜猜看,$ loginOK現在是== 1,我將以管理員身份登錄。
以后可以節省很多時間,只使用你想要使用的變量,而不是依賴於extract
的可怕黑客。
除了使用addslashes()
,這些是本代碼中的一些隨機問題:
isset($_POST)
始終為TRUE
,除非您從命令行運行它。 你可以刪除它。 empty()
非常棘手。 例如,如果$password = '0'
empty($password)
為TRUE 。 if( isset($_POST['login']) && $_POST['login']!='' ){}
extract($_POST)
是一個巨大的漏洞:任何人都可以從外部設置代碼中的變量。 $password == $data['pwd']
表示您將純文本密碼存儲在數據庫中。 那是一種可怕的做法。 谷歌為“鹽漬密碼”。 $loginOK = $password == $data['pwd'];
。 你明白為什么嗎? ;-) 你應該使用mysql_real_escape_string
而不是addslashes
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.