CSRF(Cross Site Request Forgery, 跨站请求伪造)是一种挟制终端用户在当前已登录的Web应用程序上执行非本意的操作的攻击方法,是目前比较广泛的一种服务器操作漏洞。很多网站的检测都检测出了此类问题。最近我们客户的一个网站就检测除了类似的问题,此客户的网站是用PHPCMS制作的,小编根据CSRF攻击方式以及多种尝试,现将修补方法提供如下,希望对各位有所帮助。
CSRF漏洞,攻击者伪造目标用户的HTTP请求,然后此请求发送到有CSRF漏洞的网站,网站执行此请求后,引发跨站请求伪造攻击。攻击者利用隐蔽的HTTP连接,让目标用户在不注意的情况下单击这个链接,由于是用户自己点击的,而他又是合法用户拥有合法权限,所以目标用户能够在网站内执行特定的HTTP链接,从而达到攻击者的目的。所以为了避免发生此问题,小编的思路如下,首先随机生成一个Token值,并将Token值存入Session中,然后随同表单一起提交至后台,后台获取保存的session值和表单提交的Token值进行比较,如果相同,则为正常提交,如果不相同,则为伪造提交。这里以PHPCMS的搜索为例。
首先,进入/phpcms/modules/content/index.php文件,在init方法,大概32行左右的地方添加如下代码,设置Session值,如下:
//生成Token令牌 $token = $this->Encryption(32); $this->_session_start(); $_SESSION['token']=$token;
然后进入前端页面,在需要提交的表单页面添加如下代码
<input type="hidden" name="token" value="{$token}">
第三步,打开/phpcms/modules/search/index.php,在init方法,大概34行左右的地方添加如下代码
$this->_session_start(); $token = $_SESSION['token']; $post_token = $_GET['token']; if($post_token != $token){ showmessage("不合法的搜索信息",'https://yjsc.gszy.edu.cn/'); } unset($_SESSION['token']);
这样表单验证即可完成,下面是其中涉及到的方法
获取一个随机的32位字符串,如下:
public function Encryption( $length = 6 ) { $chars = array('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l','m', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y','z', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L','M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y','Z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9'); // 在 $chars 中随机取 $length 个数组元素键名 $keys = array_rand($chars, $length); $password = ''; for($i = 0; $i < $length; $i++) { // 将 $length 个数组元素连接成字符串 $password .= $chars[$keys[$i]]; } return $password; } 开启session,如下: private function _session_start() { $session_storage = 'session_'.pc_base::load_config('system','session_storage'); pc_base::load_sys_class($session_storage); }
Copyright 2014-2023 https://www.php.cn/ All Rights Reserved | 苏州跃动光标网络科技有限公司 | 苏ICP备2020058653号-1
| 本站CDN由 数掘科技 提供
请在支付页面继续完成支付