2011-06-13 36 views

回答

58

函數在傳遞給函數的字符串中的某些潛在危險字符之前添加一個轉義字符反斜槓\。逃脫字符是

\ X00,\ n,\ r,\,」,「和\ X1A。

這有助於防止這往往是通過執行SQL注入攻擊的性格惡意代碼附加到SQL查詢。

+0

它是如何工作的?這是如何防止這種攻擊的? – locoboy 2011-06-13 07:36:21

+2

閱讀SQL注入 - http://www.unixwiz.net/techtips/sql-injection.html。正如我在回答中所說的那樣,該功能通過轉義會導致惡意代碼執行的字符來工作。 – 2011-06-13 07:44:56

+1

所以我讀了部分鏈接,但似乎注入只是發送字符串的一部分。 Mysql_real_escape_string如何防止此攻擊?它只是把\放在\之前\'? – locoboy 2011-06-13 21:18:16

3

mysql_real_escape_string()幫助,當你想避免SQL Injection你逃避特殊字符,如單引號等用戶,可以向你的腳本,你需要逃避這樣的人物,因爲就派上用場了。

我會sugggest你看看:

mysql_real_escape_string() versus Prepared Statements

要在更安全的一面,你需要去預處理語句,而不是通過上面的文章證明。

+1

這篇文章錯過了[你不應該使用'SET CHARACTER SET'但是'mysql_set_charset'](http://stackoverflow.com/questions/5288953/is-mysql-real-escape-string-broken/5289141#5289141)。 – Gumbo 2011-06-13 07:41:13

6

最好在這裏解釋。

http://www.w3schools.com/php/func_mysql_real_escape_string.asp

http://www.tizag.com/mysqlTutorial/mysql-php-sql-injection.php

它通常它有助於避免SQL注入,例如考慮下面的代碼:

<?php 
// Query database to check if there are any matching users 
$query = "SELECT * FROM users WHERE user='{$_POST['username']}' AND password='{$_POST['password']}'"; 
mysql_query($query); 

// We didn't check $_POST['password'], it could be anything the user wanted! For example: 
$_POST['username'] = 'aidan'; 
$_POST['password'] = "' OR ''='"; 

// This means the query sent to MySQL would be: 
echo $query; 
?> 

和黑客可以發送一個查詢,如:

SELECT * FROM用戶WHERE USER = '艾' 和密碼= '' 或 ''= ''

這將允許任何人登錄沒有有效的密碼。

8

PHP的mysql_real_escape_string function只是MySQL’s mysql_real_escape_string function的包裝。它基本上準備了輸入字符串,通過轉義某些字符來安全地使用MySQL string declaration,以便它們不會被誤解爲字符串分隔符或轉義序列分隔符,從而允許certain injection attacks

mysql_real_escape_string真實在相反mysql_escape_string是由於這樣的事實,它也需要在當前字符編碼成帳戶作爲危險字符不是在不同的字符編碼同樣編碼。但是您需要specify the character encoding change properly才能使mysql_real_escape_string正常工作。

38

假設您要將字符串I'm a "foobar"保存在數據庫中。
您的查詢將會看起來像INSERT INTO foos (text) VALUES ("$text")
隨着$text變量替換,這將是這樣的:

INSERT INTO foos (text) VALUES ("I'm a "foobar"") 

現在,正是它的字符串結束? 您可能知道,SQL解析器沒有。這不僅會破壞這個查詢,還會被濫用注入你不想要的SQL命令。

mysql_real_escape_string確保這種含糊不清不通過轉義字符有特殊意義的SQL語法分析程序發生:

mysql_real_escape_string($text) => I\'m a \"foobar\" 

這將成爲:

INSERT INTO foos (text) VALUES ("I\'m a \"foobar\"") 

這使得語句明確和安全。 \表示以下字符不能被其特殊含義視爲字符串終止符。有幾個這樣的字符mysql_real_escape_string照顧。

在編程語言順便說一句,轉義是一個非常普遍的事情。如果你想在字面上PHP類型上面的句子,你需要逃脫它也出於同樣的原因:

$text = 'I\'m a "foobar"'; 
// or 
$text = "I'm a \"foobar\""; 
0

mysqli_real_escape_string()功能在SQL語句中使用的字符串轉義特殊字符。

相關問題