2013-07-29 56 views
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; 
?> 

它显示:mysql如何解释转义字符串?

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

问:

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

+0

MySQL中的转义序列与PHP中的转义序列几乎相同。即使堆栈溢出的语法荧光笔给出了一个很好的线索...... –

回答

1

它会找到记录,其中密码完全匹配' OR ''='

反斜杠正在逃避单个引号,以便$pwd不能突破包含引号的外部。

以这种方式转义是一种防止SQL注入的原始方法。 Prepared Statements是非常受欢迎的,因为不需要转义,MySQL引擎将变量作为参数单独接收到查询中,因此不需要级联,并且不会有SQL注入的可能性。

0

password等于\还是什么?”

不,因为\总是会逃避以下字符。所以在你的情况下password将等于' OR ''='\确保以下字符不被解释为单引号而是字符串。这就是mysql_real_escape_string()的用法。你甚至可以在你的例子的SO-highlight中看到。

更多关于主题SQL Injection和一些示例可以是found here

0

MYSQL折腾这样的:

SELECT '\'1' - 返回'1因为\关闭'人品

如此特殊的意义在你的例子你password='\' OR \'\'=\''被interprated为' OR ''='