已经知道了不能信任用户输入,还应该知道不应该信任机器上配置 PHP 的方式。例
如,要确保禁用 register_globals。如果启用了 register_globals,就可能做一些粗心的事情,
比如使用 $variable 替换同名的 GET 或 POST 字符串。通过禁用这个设置,PHP 强迫您在
正 确 的 名 称 空 间 中 引 用 正 确 的 变 量 。 要 使 用 来 自 表 单 POST 的 变 量 , 应 该 引 用
$_POST['variable']。这样就不会将这个特定变量误会成
cookie、会话或 GET 变量。
规则 3:如果不能理解它,就不能保护它
一些开发人员使用奇怪的语法,或者将语句组织得很紧凑,形成简短但是含义模糊
的代码。这种方式可能效率高,但是如果您不理解代码正在做什么,那么就无法决定如何
保护它。例如,您喜欢下面两段代码中的哪一段?
清单 4. 使代码容易得到保护
//obfuscated code
$input = (isset($_POST['username']) ? $_POST['username']:”);
//unobfuscated code
$input = ”;
if (isset($_POST['username'])){
$input = $_POST['username'];
}else{
$input = ”;
}
在第二个比较清晰的代码段中,很容易看出 $input 是有瑕疵的,需要进行清理,然
后才能安全地处理。
规则 4 “
”
: 纵深防御 是新的法宝
本教程将用示例来说明如何保护在线表单,同时在处理表单的 PHP 代码中采用必要
的措施。同样,即使使用 PHP regex 来确保 GET 变量完全是数字的,仍然可以采取措施
确保 SQL 查询使用转义的用户输入。纵深防御不只是一种好思想,它可以确保您不会陷
入严重的麻烦。既然已经讨论了基本规则,现在就来研究第一种威胁:SQL 注入攻击。
◆防止 SQL 注入攻击
在 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>