標籤:
1.首先將magic_quotes_gpc設定為On,display_errors設定為Off.
2.項目正式上線後,調用 mysql_query 等 mysql 函數時,前面應該加上 @,即 @mysql_query(...) ,這樣 mysql 錯誤不會被輸出。同理以免讓攻擊者分析出有用的資訊。
3.在php.ini裡把register_globals = On該成register_globals = Off, 這點的好處就是讓你php中的變數不能直接從get/post等地方擷取,而是由你自己程式上擷取
4.安全參數擷取函數:
<?php
define("XH_PARAM_INT",0);
define("XH_PARAM_TXT",1);
function PAPI_GetSafeParam($pi_strName, $pi_Def = "", $pi_iType = XH_PARAM_TXT)
{
if ( isset($_GET[$pi_strName]) )
$t_Val = trim($_GET[$pi_strName]);
else if ( isset($_POST[$pi_strName]))
$t_Val = trim($_POST[$pi_strName]);
else
return $pi_Def;
// INT
if ( XH_PARAM_INT == $pi_iType)
{
if (is_numeric($t_Val))
return $t_Val;
else
return $pi_Def;
}
// String
$t_Val = str_replace("&", "&",$t_Val);
$t_Val = str_replace("<", "<",$t_Val);
$t_Val = str_replace(">", ">",$t_Val);
if ( get_magic_quotes_gpc() )
{
$t_Val = str_replace("\\\"", """,$t_Val);
$t_Val = str_replace("\\‘‘", "'",$t_Val);
}
else
{
$t_Val = str_replace("\"", """,$t_Val);
$t_Val = str_replace("‘", "'",$t_Val);
}
return $t_Val;
}
在這個函數中,有三個參數:
$pi_strName: 變數名
$pi_Def: 預設值
$pi_iType: 資料類型。取值為 XH_PARAM_INT, XH_PARAM_TXT, 分別表示數值型和文本型。 如果請求是數值型,那麼調用 is_numeric() 判斷是否為數值。如果
不是,則返回程式指定的預設值。簡單起見,對於文本串,我將使用者輸入的所有危險字元(包括HTML代碼),全部轉義。由於 php 函數 addslashes()存在漏
洞,我用 str_replace()直接替換。get_magic_quotes_gpc() 函數是 php 的函數,用來判斷 magic_quotes_gpc 選項是否開啟。
剛才樣本,代碼可以這樣調用:
<?php
if ( isset($_POST["f_login"] ) )
{
// 串連資料庫...
// ...代碼略...
// 檢查使用者是否存在
$t_strUid = PAPI_GetSafeParam("f_uid", 0, XH_PARAM_INT);
$t_strPwd = PAPI_GetSafeParam("f_pwd", "", XH_PARAM_TXT);
$t_strSQL = "SELECT * FROM tbl_users WHERE uid=$t_strUid AND password = ‘$t_strPwd‘ LIMIT 0,1";
if ( $t_hRes = mysql_query($t_strSQL) )
{
// 成功查詢之後的處理. 略...
}
}
?>
1. 防範可以從兩個方面著手,一個就是伺服器,二個就是代碼本身,介紹伺服器配置的文章很多了,無非就是把magic_quotes_gpc設定為On,display_errors設定為Off
2.代碼入手
1)我們可以通過使用者輸入的使用者名稱去擷取到該使用者名稱在資料庫中的密碼,然後和輸入的密碼進行比對,如果相同則說明輸入的密碼是正確的,否則有問題
2)更好的方式是使用pdo的PDO::prepare() 預先處理操作來防止sql注入漏洞PDO::prepare()主要是預先處理操作,需要通過$rs->execute()來執行預先處理裡面的SQL語句,
這個方法可以綁定參數,功能比較強大 。綁定參數有兩種方式: 通過名字綁定,或者是通過?號來綁定均可.
3.搜尋引擎中sql注入問題過濾%和_防止所有的資料被查詢出來.
PHP防sql注入