同前文:' OR 1=1 # 繞過登入、UNION SELECT 竊取資料。
開啟後字串型欄位受保護,但數值型欄位(uid=1001)無引號包裹,仍可注入:
uid=1001 OR 1=1 # → WHERE uid=1001 OR 1=1 #
MySQL 5.x 預設關閉自動型別轉換,數值欄位不接受引號字串,但此攻擊不需引號即可生效。
display_errors = Off、@mysql_query() 抑制錯誤輸出,避免洩漏結構資訊。define('DEBUG_MODE', 0);define('XH_PARAM_INT', 0);
define('XH_PARAM_TXT', 1);
function papi_getsafeparam($name, $def='', $type=XH_PARAM_TXT) {
$val = trim(isset($_GET[$name]) ? $_GET[$name] : (isset($_POST[$name]) ? $_POST[$name] : $def));
if ($type === XH_PARAM_INT) {
return is_numeric($val) ? $val : $def;
}
// 字串型:全轉 HTML 實體
$val = str_replace(['&','<','>'], ['&','<','>'], $val);
if (get_magic_quotes_gpc()) {
$val = str_replace(['"',"''"], ['"','''], $val);
} else {
$val = str_replace(['"',"'"], ['"','''], $val);
}
return $val;
}
$uid = papi_getsafeparam('f_uid', 0, XH_PARAM_INT);
$pwd = papi_getsafeparam('f_pwd', '', XH_PARAM_TXT);
$sql = "SELECT * FROM tbl_users WHERE uid=$uid AND password='$pwd'";