s a valid response to a yes/no answer..." />
<input type="submit" value="Save" name="submit" />
</form>
</body>
</html>
思考一下:如果拥有限制用户输入量的下拉框或单选按钮,您可能会认为不用担心验证输入的问题。毕竟,输入表单将确保用户只能输入某些数据,对吧?要限制表单欺骗,需要进行验证以确保发布者的身份是真实的。您可以使用一种一次性使用标记,虽然这种技术仍然不能确保表单绝对安全,但是会使表单欺骗更加困难。由于在每次调用表单时都会更改标记,因此想要成为攻击者就必须获得发送表单的实例,去掉标记,并把它放到假表单中。使用这项技术可以阻止恶意用户构建持久的 Web 表单来向应用程序发布不适当的请求。清单 16 提供了一种表单标记示例。
清单 16. 使用一次性表单标记
复制代码 代码如下:
<?php
session_start();
?>
<html>
<head>
<title>SQL Injection Test</title>
</head>
<body>
<?php
echo ''Session token='' .
编写安全 PHP应用程序的七个习惯深入分析_网学
浏览:
SESSION[''token''];
echo ''<br />'';
echo ''Token from form='' .
编写安全 PHP应用程序的七个习惯深入分析_网学
浏览:
POST[''token''];
echo ''<br />'';
if (
编写安全 PHP应用程序的七个习惯深入分析_网学
浏览:
SESSION[''token''] ==
编写安全 PHP应用程序的七个习惯深入分析_网学
浏览:
POST[''token'']) {
/* cool, it''s all good... create another one */
} else {
echo ''<h1>Go away!</h1>'';
}
$token = md5(uniqid(rand(), true));
编写安全 PHP应用程序的七个习惯深入分析_网学
浏览:
SESSION[''token''] = $token;
?>
<form id="myFrom" action="<?php echo
编写安全 PHP应用程序的七个习惯深入分析_网学
浏览:
SERVER[''PHP_SELF'']; ?>"
method="post">
<div><input type="hidden" name="token" value="<?php echo $token; ?>" />
<input type="text" name="myText"
value="<?php echo(isset(
编写安全 PHP应用程序的七个习惯深入分析_网学
浏览:
POST[''myText'']) ?
编写安全 PHP应用程序的七个习惯深入分析_网学
浏览:
POST[''myText''] : ''''); ?>" />
<input type="submit" value="Save" name="submit" /></div>
</form>
</body>
</html>
针对 CSRF 进行保护
跨站点请求伪造(CSRF 攻击)是利用用户权限执行攻击的结果。在 CSRF 攻击中,您的用户可以轻易地成为预料不到的帮凶。清单 17 提供了执行特定操作的页面示例。此页面将从 cookie 中查找用户登录信息。只要 cookie 有效,Web 页面就会处理请求。
清单 17. CSRF 示例
复制代码 代码如下:
<img src="http://www.example.com/processSomething?id=123456789" />
CSRF 攻击通常是以 <img> 标记的形式出现的,因为浏览器将在不知情的情况下调用该 URL 以获得图像。但是,图像来源可以是根据传入参数进行处理的同一个站点中的页面 URL。当此 <img> 标记与 XSS 攻击结合在一起时 — 在已归档的攻击中最常见 — 用户可以在不知情的情况下轻松地对其凭证执行一些操作 — 因此是伪造的。
为了保护您免受 CSRF 攻击,需要使用在检验表单 post 时使用的一次性标记方法。此外,使用显式的
编写安全 PHP应用程序的七个习惯深入分析_网学
浏览:
POST 变量而非
编写安全 PHP应用程序的七个习惯深入分析_网学
浏览:
REQUEST。清单 18 演示了处理相同 Web 页面的糟糕示例 — 无论是通过 GET 请求调用页面还是通过把表单发布到页面中。
清单 18. 从
编写安全 PHP应用程序的七个习惯深入分析_网学
浏览:
REQUEST 中获得数据
复制代码 代码如下:
<html>
<head>
<title>Processes both posts AND gets</title>
</head>
<body>
<?php
if (
编写安全 PHP应用程序的七个习惯深入分析_网学
浏览:
REQUEST[''submit''] == ''Save'') {
echo("<p>I am processing your text: ");
echo(htmlentities(
编写安全 PHP应用程序的七个习惯深入分析_网学
浏览:
REQUEST[''text'']));
echo("</p>");
}
?>
</body>
</html>
清单 19 显示了只使用表单 POST 的干净页面。
清单 19. 仅从
编写安全 PHP应用程序的七个习惯深入分析_网学
浏览:
POST 中获得数据
复制代码 代码如下:
<html>
<head>
<title>Processes both posts AND gets</title>