根據你的使用目的我覺得這個函數有兩方面的用途:
- 防止SQL Injection攻擊,也就是你必須驗證使用者的輸入
- 操作資料的時候避免不必要的字元導致錯誤
mysql_real_escape_string() 函數轉義 SQL 陳述式中使用的字串中的特殊字元。
下列字元受影響:
如果成功,則該函數返回被轉義的字串。如果失敗,則返回 false。
攻擊的例子[1]
例子 1
<?php$con = mysql_connect("localhost", "hello", "321");if (!$con){die('Could not connect: ' . mysql_error());}// 獲得使用者名稱和密碼的代碼// 轉義使用者名稱和密碼,以便在 SQL 中使用$user = mysql_real_escape_string($user);$pwd = mysql_real_escape_string($pwd);$sql = "SELECT * FROM users WHEREuser='" . $user . "' AND password='" . $pwd . "'"// 更多代碼mysql_close($con);?>例子 2
資料庫攻擊。本例示範如果我們不對使用者名稱和密碼應用 mysql_real_escape_string() 函數會發生什麼:
<?php$con = mysql_connect("localhost", "hello", "321");if (!$con){die('Could not connect: ' . mysql_error());}$sql = "SELECT * FROM usersWHERE user='{$_POST['user']}'AND password='{$_POST['pwd']}'";mysql_query($sql);// 不檢查使用者名稱和密碼// 可以是使用者輸入的任何內容,比如:$_POST['user'] = 'john';$_POST['pwd'] = "' OR ''='";// 一些代碼...mysql_close($con);?>
那麼 SQL 查詢會成為這樣:
SELECT * FROM users WHERE user='john' AND password='' OR ''=''
這意味著任何使用者無需輸入合法的密碼即可登陸。
例子 3預防資料庫攻擊的正確做法:
<?phpfunction check_input($value){// 去除斜杠if (get_magic_quotes_gpc()){$value = stripslashes($value);}// 如果不是數字則加引號if (!is_numeric($value)){$value = "'" . mysql_real_escape_string($value) . "'";}return $value;}$con = mysql_connect("localhost", "hello", "321");if (!$con){die('Could not connect: ' . mysql_error());}// 進行安全的 SQL$user = check_input($_POST['user']);$pwd = check_input($_POST['pwd']);$sql = "SELECT * FROM users WHEREuser=$user AND password=$pwd";mysql_query($sql);mysql_close($con);?>
對於情況2,當使用PHP准別資料插入的時候,如果插入資料包含單引號或者雙引號,會導致插入失敗。通過mysql_real_escape_string就可以避免這種錯誤。我的經驗是,這個錯誤不太容易發現,前天花了2個小時才找到這個錯誤。而且這個函數並不會增加欄位的長度[2]。
參考:
[1]http://www.w3school.com.cn/php/func_mysql_real_escape_string.asp
[2]http://php.net/manual/en/function.mysql-real-escape-string.php