1
<?php
$user = 'john';
$pwd = "' OR ''='";
$sql = "SELECT * FROM users WHERE
user='" . $user . "' AND password='" . $pwd . "'";
echo $sql.'<br />';
// escape username and password for use in SQL
$user = mysql_real_escape_string($user);
$pwd = mysql_real_escape_string($pwd);

$sql_escaped = "SELECT * FROM users WHERE
user='" . $user . "' AND password='" . $pwd . "'";

echo $sql_escaped;
?> 

表明:

SELECT * FROM users WHERE user='john' AND password='' OR ''=''
SELECT * FROM users WHERE user='john' AND password='\' OR \'\'=\'' 

问题:

mysql如何解释这一行:password='\' OR \'\'=\''password等于\还是什么?

4

3 回答 3

1

它将找到密码完全匹配的记录' OR ''='

反斜杠正在转义单引号,以便$pwd不能脱离外部包含的引号。

以这种方式转义是防止 SQL 注入的原始方法。Prepared Statements是首选,因为不需要转义,MySQL 引擎将变量作为参数单独接收到查询,因此不需要连接,也没有 SQL 注入的可能性。

于 2013-07-29T09:42:55.660 回答
0

password等于\还是什么?”

不,因为 a\总是转义后面的字符。所以在你的情况下password等于' OR ''='. \确保以下字符不被解释为单引号而是字符串。这就是该方法mysql_real_escape_string()的用途。您甚至可以在示例中的 SO-highlighting 中看到这一点。

有关SQL 注入主题的更多信息和一些示例,请参见此处

于 2013-07-29T09:40:48.023 回答
0

MYSQL 这样做:

SELECT '\'1'-'1因为\关闭 ' 字符的特殊含义而返回

所以在你的例子中你password='\' OR \'\'=\'' 被解释为' OR ''='

于 2013-07-29T09:41:06.693 回答