登录  /  注册

PHPCMS表单提交及CSRF防护

XuPing.Yang
2023-05-04 13:23:57 242

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);
}



XuPing.Yang
总阅读量:242
关注
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2024 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号

等待您完成支付...

请在支付页面继续完成支付

支付完成
重新选择支付方式