首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP mysql_real_escape_string 使用陷阱與最佳實踐

     編輯:PHP 相關知識

mysql_real_escape_string() 轉義 SQL 特殊字符(\x00, \n, \r, \\, ', ", \x1a),防止 SQL 注入。但有一個關鍵前提:必須先建立資料庫連線,否則報錯。

基本用法

$con = mysql_connect("localhost", "user", "pass");
$user = mysql_real_escape_string($_POST['user']);
$pwd  = mysql_real_escape_string($_POST['pwd']);
$sql = "SELECT * FROM users WHERE user='$user' AND password='$pwd'";

未轉義導致的注入示例

$_POST['user'] = 'john';
$_POST['pwd']  = "' OR ''='";
// SQL 變為: SELECT * FROM users WHERE user='john' AND password='' OR ''=''

任意密碼即可登入。

正確防禦封裝

function check_input($value) {
    if (get_magic_quotes_gpc()) $value = stripslashes($value);
    $value = mysql_real_escape_string($value);
    return $value;
}
$user = check_input($_POST['user']);
$pwd  = check_input($_POST['pwd']);
$sql = "SELECT * FROM users WHERE user='$user' AND password='$pwd'";

mysql_escape_string() 差異

  • mysql_real_escape_string():需連線資源,依當前字元集轉義。
  • mysql_escape_string():無需連線,不考慮字元集,不轉義 % 和 _。

建議統一使用 mysqli_real_escape_string()(mysqli 版本)並配合預處理語句,徹底杜絕注入風險。

實戰範例

$link = mysql_connect('host', 'user', 'pass') or die(mysql_error());
$query = sprintf("SELECT * FROM users WHERE user='%s' AND password='%s'",
    mysql_real_escape_string($user),
    mysql_real_escape_string($password)
);
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved