mysql_real_escape_string()真正做了什么?

loc*_*boy 49 php mysql

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

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

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

Jam*_*ice 75

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

\ x00,\n,\ r,\,',"和\ x1a.

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

  • 我真的很喜欢这篇文章如何实际指定哪些字符被转义.非常有用.+1 (5认同)
  • 是.您可以使用'字符来结束应该执行的查询,并执行您自己的SQL代码(在最糟糕的情况下,这可能类似于`drop tableName`) (2认同)
  • 那么,它不会逃脱`%`字符?如果我有类似"SELECT user_id FROM users WHERE username LIKE'$ username';`?我可以简单地注入一个`%`字符来绕过检查吗? (2认同)

dec*_*eze 51

假设您要将字符串保存I'm a "foobar"在数据库中.
您的查询看起来像INSERT INTO foos (text) VALUES ("$text").
随着$text变量替换,这将是这样的:

INSERT INTO foos (text) VALUES ("I'm a "foobar"")
Run Code Online (Sandbox Code Playgroud)

现在,字符串到底在哪里?可能知道,SQL解析器没有.这不仅会破坏此查询,还会滥用它来注入您不想要的SQL命令.

mysql_real_escape_string通过转义对SQL解析器具有特殊含义的字符,确保不会出现这种歧义:

mysql_real_escape_string($text)  =>  I\'m a \"foobar\"
Run Code Online (Sandbox Code Playgroud)

这变为:

INSERT INTO foos (text) VALUES ("I\'m a \"foobar\"")
Run Code Online (Sandbox Code Playgroud)

这使得该陈述明确且安全.\以下字符不作为字符串终止符的特殊含义的信号.有一些这样的角色mysql_real_escape_string需要照顾.

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

$text = 'I\'m a "foobar"';
// or
$text = "I'm a \"foobar\"";
Run Code Online (Sandbox Code Playgroud)


Gum*_*mbo 14

PHP的mysql_real_escape_string函数只是MySQL mysql_real_escape_string函数的包装器.它基本上通过转义某些字符来准备输入字符串,以便在MySQL字符串声明中安全使用,这样它们就不会被误解为字符串分隔符或转义序列分隔符,从而允许某些注入攻击.

与之相反的实际情况是由于它还将当前字符编码考虑在内,因为风险字符在不同的字符编码中不是均等编码的.但是,你需要正确指定字符编码的变化,以获得正常工作.mysql_real_escape_stringmysql_escape_stringmysql_real_escape_string


Rak*_*kar 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;
?>
Run Code Online (Sandbox Code Playgroud)

黑客可以发送如下查询:

SELECT*FROM users WHERE user ='aidan'AND password =''OR''=''

这将允许任何人在没有有效密码的情况下登录.


Sar*_*raz 6

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

我建议你检查一下:

mysql_real_escape_string() 与准备好的语句

为了更安全,您需要使用准备好的语句,而不是如上面的文章所示。