2013-05-03 111 views
2

我已经在php中编写了一个代码,可以让管理员登录。密码信息从表格中提取。我知道编写这样的代码并不是一个好习惯,我应该使用准备好的语句或mysqli_,但我只想了解sql查询漏洞。我只想知道我的代码如何容易受到SQL注入的影响?我如何绕过密码限制。我尝试在密码字段中输入password ='anything'或'x'='x',但它并未绕过它。这是我的代码: -SQL注入的测试查询

if(isset($_POST["Submit"])) 
{ 
include 'db_connect.php'; 
$user=$_POST['user']; 
$pass=$_POST['pass']; 
$checkquery="select * from adminlogin where password='$pass' "; 
$queryex= mysql_query($checkquery); 
$row= mysql_fetch_array($queryex); 
$checkcasepass = $row['password']; 
if($user=='admin' && strcmp($checkcasepass,$pass)==0) 
{ 
setcookie("admin",$user); 
setcookie ("student", "", time() - 3600); 
header("location: admin option.php"); 
} 
else 
{ 
echo "Sorry User Name and Password is Wrong"; 
} 
} 

我改变了我的查询字符串,以此为测试目的: -

$checkquery="select * from adminlogin where password='$pass' OR 1=1 "; 

,但没有奏效。这是否可以归功于魔术引号?但我正在使用PHP 5.4.3,并且魔术报价已折旧。我想知道为什么SQL注入不起作用。 ?

+1

如果你可以帮忙,你应该使用'PDO','mysql_ *'函数被官方弃用。学习[*准备的语句*](http://j.mp/T9hLWi),并使用[PDO](http://php.net/pdo)或[MySQLi](http://php.net/ mysqli的)。看看[这个比较](http://j.mp/QEx8IB),如果你选择PDO,[这里是一个很好的教程](http://j.mp/PoWehJ)。 – 2013-05-03 16:33:34

+0

@dirt虽然你非常正确地说明这一点,但用户明确表示他们理解并希望了解注入是如何工作的 – RMcLeod 2013-05-03 16:43:35

+0

为什么不只是**回显**生成的查询并将其发布到此处? – 2013-05-03 16:48:09

回答

1

你选择的方式测试注射是错误的。

此代码允许注入所有权利,但验证代码不会检查找到的行数,但会返回值。

但是,再次说到SQL注入 - 这段代码很好,注入了所有权利。

+0

是!当我仔细检查代码时,我明白了。它是注入式的,但代码将字符串的值与查询中提取的列值进行匹配。 – 2013-05-04 05:35:56

1

变化'anything' OR 'x'='x'anything' OR 'x'='x领先“和尾随”已经存在,实际上你想查询的样子

select * from adminlogin where password=''anything' OR 'x'='x'' 

这是不合法的SQL

+0

它不起作用。它显示错误的密码信息。 – 2013-05-03 16:44:23

+0

使用var_dump得到这个: - string'select * from adminlogin where password ='anything'OR'x'='x''(length = 62) – 2013-05-03 16:55:18

+0

得到这个: - string'select * from adminlogin where password ='anything' OR 1 = 1''(length = 59) – 2013-05-03 16:59:32