ProcessWire如何防御CSRF攻击?
CSRF跨站点请求伪造(Cross—Site Request Forgery),跟XSS攻击一样,存在巨大的危害性,不做过多说明。
防御CSRF攻击主要有三种策略:
- 验证
HTTP Referer
字段; - 在请求地址中添加
token
并验证; - 在
HTTP
头中自定义属性并验证。
本文以ProcessWire为例用token验证实现表单提交防CSRF攻击的方法,其实PW强大的API中内置了CSRF防御机制,我们看看怎么使用的。
<?php $tokenName = $session->CSRF->getTokenName(); $tokenValue = $session->CSRF->getTokenValue(); try { if($input->post->username) { if($session->CSRF->validate()) { echo $input->post->username; } } } catch (WireCSRFException $e) { echo "Processing aborted. Suspected attempt to forge the submission. IP logged." . $e->getMessage(); /* * Some code to execute whenever the token gets spoofed * Like sending a notification mail with the spoofer's IP address */ die(); // live a great life and die() gracefully. } ?> <!doctype html> <html> <head> <meta charset="utf-8"> <title>无标题文档</title> </head> <body> <form method="post" action="/input-test/"> <?php echo '<input type="hidden" id="_post_token" name="' . $tokenName . '" value="' . $tokenValue . '"/>'; ?> <input type="text" name="username" value="leoric"> <input type="submit" value="POST"> </form> </body> </html>
是不是很简单?