PHP中的mysql_real_escape_string函數

來源:互聯網
上載者:User

根據你的使用目的我覺得這個函數有兩方面的用途:

  1. 防止SQL Injection攻擊,也就是你必須驗證使用者的輸入
  2. 操作資料的時候避免不必要的字元導致錯誤

mysql_real_escape_string() 函數轉義 SQL 陳述式中使用的字串中的特殊字元。

下列字元受影響:

  • /x00
  • /n
  • /r
  • /
  • '
  • "
  • /x1a

如果成功,則該函數返回被轉義的字串。如果失敗,則返回 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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.