mysql_real_escape_string()真正做了什么?

时间:2011-06-13 07:27:13

标签: php mysql

有时候我讨厌文档的一件事(当你是初学者时)是用英语描述事物的方式。有人会介意为我翻译这些文档吗?我想知道这究竟是什么让黑客更难以插入字符。

http://php.net/manual/en/function.mysql-real-escape-string.php

此外,如果是这种情况,黑客将如何尝试插入字符?

6 个答案:

答案 0 :(得分:70)

该函数在传入函数的字符串中的某些潜在危险字符之前添加一个转义字符,即反斜杠\。转义的字符是

  

\ x00,\ n,\ r,\,',“和\ x1a。

这可以帮助防止SQL注入攻击,这些攻击通常通过使用'字符将恶意代码附加到SQL查询来执行。

答案 1 :(得分:47)

假设您要将字符串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照顾的几个这样的角色。

在编程语言BTW中,转义是一个非常普遍的事情,所有这些都是相同的。如果你想在PHP中输入上面的句子,你也需要将其转义,原因相同:

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

答案 2 :(得分:14)

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正常工作。

答案 3 :(得分:7)

最好解释一下。

  

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 users WHERE user ='aidan'AND password =''OR''=''

这样任何人都可以在没有有效密码的情况下登录。

答案 4 :(得分:3)

mysql_real_escape_string()可帮助您转义用户可能提交给您的脚本的特殊字符,例如单引号等。你需要逃避这些角色,因为当你想要避免SQL Injection时,它会派上用场。

我建议你查看:

<强> mysql_real_escape_string() versus Prepared Statements

为了更加安全,您需要选择准备好的陈述,如上文所示。

答案 5 :(得分:1)

mysqli_real_escape_string()函数转义字符串中的特殊字符,以便在SQL语句中使用。