ProcessWire如何防御CSRF攻击?

CSRF跨站点请求伪造(Cross—Site Request Forgery),跟XSS攻击一样,存在巨大的危害性,不做过多说明。

攻击者利用CSRF伪装成用户登录的过程

防御CSRF攻击主要有三种策略:

  1. 验证HTTP Referer字段;
  2. 在请求地址中添加token并验证;
  3. 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>

是不是很简单?

Post Comment