<?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
等于\
或什么?
答案 0 :(得分:1)
它会找到密码与' OR ''='
反斜杠正在转义单引号,以便$pwd
无法突破外部引号。
以这种方式转义是一种防止SQL注入的原始方法。 Prepared Statements是首选,因为不需要转义,MySQL引擎将变量作为参数分别接收到查询,因此不需要连接,也不会出现SQL注入。
答案 1 :(得分:0)
“password
等于\
或什么?”
不,因为\
始终会转义以下字符。因此,在您的情况下,password
将等于' OR ''='
。 \
确保以下字符不被解释为单引号而是字符串。这就是方法mysql_real_escape_string()
的用途。您甚至可以在示例中的SO突出显示中看到它。
有关主题SQL Injection的更多信息,一些示例可以是found here。
答案 2 :(得分:0)
MYSQL是这样的:
SELECT '\'1'
- 返回'1
因为\
关闭'character
因此,在您的示例中,password='\' OR \'\'=\''
被视为' OR ''='