background image

  已经知道了不能信任用户输入,还应该知道不应该信任机器上配置  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>