background image

在 SQL

 

注入攻击中,用户通过操纵表单或 GET 查询字符串,将信息添加到

数据库查询中。例如,假设有一个简单的登录数据库。这个数据库中的每个记
录都有一个用户名字段和一个密码字段。构建一个登录表单,让用户能够登录。

<html> 
<head> 
<title>Login</title> 
</head> 
<body> 
<form action=”verify.php” method=”post”> 
<p><label for=’user’>Username</label> 
<input type=’text’ name=’user’ id=’user’/> 
</p> <p><label for=’pw’>Password</label> 
<input type=’password’ name=’pw’ id=’pw’/> 
</p> <p><input type=’submit’ value=’login’/></p> 
</form> 
</body> 
</html> 
这个表单接受用户输入的用户名和密码,并将用户输入提交给名为
verify.php 的文件。在这个文件中,PHP 处理来自登录表单的数据,如下所示:

 

清单 5. 

 

不安全的 PHP 

 

表单处理代码

<?php 
$okay = 0; 
$username = $_POST['user']; 
$pw = $_POST['pw']; 
$sql = “select count(*) as ctr from users where username=’”.
$username.”‘ and password=’”. $pw.”‘ limit 1 ; 

$result = mysql_query($sql); 
while ($data = mysql_fetch_object($result)){ 
if ($data->ctr == 1){ 
//they’re okay to enter the application! 
$okay = 1; 


if ($okay){ 
$_SESSION['loginokay'] = true; 
header(“index.php”); 
}else{ 
header(“login.php”); 

?> 
这段代码看起来没问题,对吗?世界各地成百(甚至成千)  

的 PHP/MySQL 站点

都在使用这样的代码。它错在哪里?

 “

好,记住 不能信任用户输入 。这里没有