2010-07-01 36 views
0

我的查询用PHP编写的是:SQL注入的PHP

$sql="SELECT * FROM ".TABLE_PREFIX."login WHERE username ='".$username."' 
     AND password='".$password."'"; 
$res_id = mysql_query($sql); 
$num_rows = mysql_num_rows($res_id); 
echo $num_rows; 

,当我从它好的工作表单中输入有效的用户名和密码。

在i输入一些SQL注入代码查询输出是:

SELECT * FROM form_login WHERE username ='' or '1'='1' AND password='' or '1'='1' 

这是一个有效的SQL statement.But它给出了一个输出(即行数)为0(零)。

如果我写的程序本身相同的输出sql语句原样

$sql="SELECT * FROM form_login WHERE username ='' or '1'='1' 
    AND password='' or '1'='1'"; 

它工作正常,并给出了一些结果(例如3)。

我怎样才能得到正确的结果通过输入sql注入代码?

+0

什么是你的用户名和密码框输入确切的文本? – cjk 2010-07-01 07:31:58

回答

0

在查询中使用任何变量之前,请将其传递给mysql_real_escape_string

+2

我认为在这种情况下,他希望有一个SQL注入;) – DrColossos 2010-07-01 07:41:52

+0

不是“任何变量”,而是变量,只能用引号引起来。所以,剩下的一定有一些东西。 – 2010-07-01 07:54:14

1

尝试回显SQL语句。这可能不是你想象的那样,特别是如果启用了magic_quotes_gpc

+0

我回应了sql语句,我的sql语句就像我在问题中给出的一样。 SELECT * FROM form_login WHERE username =''or'1'='1'AND password =''or'1'='1',但结果不是来的。 – Sitansu 2010-07-01 09:05:55

1

或更好的是,从来没有CONCATENATE SQL!

尝试使用PDO库prepared sql statements

值是在这种模式本质安全。

0

您需要输入' OR 1=1; --(注意后面的空格)进入用户名。
之后,你输入密码并不重要,因为它会被注释掉。

这将转化成下面的SQL语句:

SELECT * FROM form_login WHERE username ='' or 1 = 1; -- AND password= 'whatever'