在 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 站点
都在使用这样的代码。它错在哪里?
“
”
好,记住 不能信任用户输入 。这里没有