Web开发中,CSFT是一个非常重要的安全概念。CSFT即Cross-site Request Forgery的缩写,其中Cross-site意为跨站,在网络中可以理解为攻击者伪造一个请求,让一个已经登录的用户去执行它。例如,一个电商网站有一个修改用户密码的操作,攻击者就可能伪造一条包含修改密码的请求,然后通过邮件或者其他方式诱导用户去点击这个请求。
PHP作为一种非常流行的Web开发语言,理所当然地有着很好的CSFT保护机制。虽然PHP在最初的设计中没有直接支持CSFT攻击的预防,但是随着Web技术的发展和安全意识的普及,PHP社区也在不断地开发和推广更好的CSFT防范方案。
<form action="example.php" method="post">
<input name="name" value="Jane">
<input type="submit" value="Submit">
</form>
在PHP中,第一个推荐的方案是使用Token(或者CSRF Token,CSRF Prevention Token)作为CSFT攻击的防范手段。具体来说,一个Token是一串绑定到用户认证信息上的随机字符串,在一个表单中设置Token可以达到防范CSFT攻击的目的。
<form action="example.php" method="post">
<input type="hidden" name="csrf_token" value="xxxxxx">
<input name="name" value="Jane">
<input type="submit" value="Submit">
</form>
在这个例子中,用户在提交表单时会自动添加Token作为表单数据的一部分。后端的PHP代码就可以检验Token并且防范CSFT攻击。
除了Token以外,PHP还有其他的一些防范方案。例如POST-Redirect-GET(PRG)也可以被用于防范CSFT攻击。在这个模式中,一个POST请求会随后被一个重定向指令GET取代。由于GET请求不会对服务器上的数据产生任何影响,所以攻击者就无法伪造出一个危险的请求。
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
// Validate the request and redirect if success
header('Location: /success');
exit;
}
无论是使用Token还是PRG,PHP的CSFT预防能力都差不多。但是考虑到在现实中CSFT攻击可能会被结合其他漏洞绕过,就应该尽量使用这两种防范方案的组合。例如,添加一个Token并且使用PRG来让CSFT攻击变得更加困难。
总结一下,PHP中可以非常简单地防范CSFT攻击。PHP社区中已经有了很好的防范方案,只需要开发者们去合理使用它们即可。