joomla 防CSRF攻击


在正常的展示页面,我们是不需要做处理的,因为任何人都可以访问。

我们需要处理的地方主要有两个部分,第一个是提交表单,另外一个是Ajax请求操作。

提交表单

如果使用POST提交,在Joomla中只需要在表单的页面增加一行代码

<?php echo JHtml::_( 'form.token' ); ?>

这段代码会在表单中增加一个的token.如何审查元素,可以看到如下的代码:

当提交表单后,我们需要在后台增加一个校验,以检查token是否匹配。

检验token的方法也非常的简单

JSession::checkToken() or die( 'Invalid Token' );//在这个之后写逻辑代码

如果是GET提交表单,你需要在链接中增加如下的代码:

<?php 
  echo JRoute::_( 'index.php?option=com_example&controller=object1&task=save&'. JSession::getFormToken() .'=1' ); // JSession::getFormToken() .'=1' 是我们增加的token
?>

针对于GET提交表单,后端的校验代码需要修改如下:

JSession::checkToken( 'get' ) or die( 'Invalid Token' );

如果使用Ajax提交表单,或者做一些数据操作,也是可以增加token的;

首先需要在页面中添加如下代码:

JHtml::_('jquery.token');

这个代码会在提交Ajax请求的时候自动将token设置在请求的参数中。主要的代码片段如下:

$(function(){
    $.ajaxSetup({
        headers: {
            'X-CSRF-Token': $('meta[name="{$name}"]').attr('content')
        }
    });
}

上面的代码Joomla 就是 JHtml::_('jquery.token'); 产生的。

在服务端检查token的方法如下:

//校验CSRF 
if(!JSession::checkToken())
{
    die("Invalid_TOKEN");
}

Joomla中 JSession::checkToken() 用法:

JSession::checkToken('get');//适应get提交
JSession::checkToken('post');//适应post提交
JSession::checkToken('request');//适应所有提交
JSession::checkToken();//与request作用一样,适应所有提交
声明 本人博客的所有东西,部分源于网络书籍和视频,其他的是个人的理解感悟,经过自己整理撰写成博客。 本人博客均只用于个人学习、复习,不作为商业用途,如有侵权,请联系我修改或删除。 联系邮箱:15121014713@163.com