无效令牌与Joomla自定义组件(Invalid token with Joomla custom

2019-08-06 12:50发布

我建立一个自定义的Joomla组件和我在模板(如default.php)文件(它使用的是HTTP POST)将此添加到我的表格:

echo JHTML::_( 'form.token' ); //add hidden token field to prevent CSRF vulnerability

然后我检查令牌在我的控制器:

JRequest::checkToken() or die( 'Invalid Token' );

但无论我做什么,我得到一个无效的令牌。 我已经验证了一个隐藏式带有令牌在我的表单创建的,当我查看HTML页面源。 我也验证了,在控制器中,代币的价值是一样的:

print_r(JUtility::getToken());

所以,如果令牌是一样的价值,为什么地球上是否与无效令牌消息退出?

编辑:有是我没有提到的一个关键部分。 我的形式在在我view.html.php增加了一个单独的js文件jQuery的AJAX处理。 这就是AJAX POST的样子:

jQuery.ajax({
    type: 'POST',
    url: 'index.php?option=com_recordings&task=deletevideos&format=raw',
    data: {checkedarray:checked},
    success: function(data){
               //delete row
    }
});

控制器处理这样的:

function deletevideos()
{

    $video_list = JRequest::getVar('checkedarray', 0, 'post', 'array');
    //print_r(JUtility::getToken());
    JRequest::checkToken() or jexit( 'Invalid Token' );     

    $model = &$this->getModel();
    return $model->setDeleteVideos($video_list);
}

这就去,做数据库更新模型。 我看到这个老帖子 ,可能是相关的。 这是我不清楚如何/在哪里我生成令牌和地方/我如何验证令牌。 该职位似乎相当复杂,因为它会针对用户以及我不认为需要在我的情况。 或者,也许我误会?

编辑#2

好了,所以令牌丢失,我需要它传递到我的js文件。 所以,我想我可以加入到我的view.html.php:

    $addtoken = JUtility::getToken();
    $addtokenjs = 'jQuery(function() {
                    var token="'.$addtoken.'";
                    });';
    $doc->addScriptDeclaration( $addtokenjs );
    $doc->addScript(JURI::base()."components/com_recordings/js/recordings.js");

我必须把这个文档准备功能,因为显然addScriptDeclaration不把任何东西我提前文件recordings.js的。 然后,通过将令牌的ajax调用:

jQuery.ajax({
    type: 'POST',
    url: 'index.php?option=com_recordings&task=deletevideos&format=raw'+token+'=1',
    data: {checkedarray:checked},
    success: function(data){
               //delete row
    }
});

:显然当我得到这个错误,我不这样做的权利ReferenceError: token is not defined

Answer 1:

它似乎没有要传递令牌值在阿贾克斯request.And这就是为什么你得到这个错误。

你可以 - 1)追加令牌这样的网址

url: 'index.php?option=com_recordings&task=deletevideos&format=raw&'. JUtility::getToken() .'=1'

2)或者通过发送整个形式序列化 。

编辑2: -您可以创建一个名为为gettoken喜欢这-功能

 $addtokenjs = 'function getToken() {
                    var token="'.$addtoken.'";
                    return token;
                    };';

而在URL,而不是调用token可以调用getToken()

url: 'index.php?option=com_recordings&task=deletevideos&format=raw'+getToken()+'=1'

希望这会工作。



Answer 2:

尝试使用

JSession::checkToken() or die( JText::_( 'Invalid Token' ) );

而不是JRequest。 我喜欢JSession更多的原因是因为它guarentees的Joomla 2.5 / 3.0的兼容性,而不必考虑JRequest被弃用。 在的Joomla 2.5该函数使用JRequest和3.0使用JInput。


编辑

对于AJAX OU实际需要跨越与传递数据POST 。 您的数据,目前只是要成为checkedarray:checked ,即检查的数据,而不是在AJAX请求令牌。 你需要跨越与序列化的数据传递,如果你想使用POST方法。 但是请注意,序列化将会把数据在URL进不去。 然后,您可以处理此令牌

// Check for request forgeries using one of either JRequest of JSession
JRequest::checkToken( 'get' ) or jexit( 'Invalid Token' );
//Alternative
JSession::checkToken( 'get' ) or jexit( 'Invalid Token' );

只是completelness你给的链接使用GET方法。 在他的整个用户名通过(对他来说),并在URL中的令牌,你可以在他的AJAX功能的第三行看到

function check_username(username, token) {
  var url = 'index.php?option=com_user&task=check_user';
  data = 'username=' + username + '&' + token;     //TOKEN INSERTED INTO URL HERE
 $.ajax({
  type: "GET",
  url: url,
  data: data,
  success: function(xml) {
    var result = $(xml).find('response').text();
    if (result == 'found') {
       alert( 'Please select a different username, ' + username + ' already exists' );
   }
   }
  }); // ajax
}

再经过这就是它是微不足道的使用来处理刚

// Check for request forgeries using one of either JRequest of JSession
JRequest::checkToken( 'get' ) or jexit( 'Invalid Token' );
//Alternative
JSession::checkToken( 'get' ) or jexit( 'Invalid Token' );

无论哪种方式,它可能会涉及一些调整你的模型 - 为您的整个经过1个多变量 - 虽然它不应该是很难做到的。 希望这可以帮助!



Answer 3:

如果表单数据提交为$_GET

JRequest::checkToken('get') or jexit( 'Invalid Token' );;

如果表单数据提交为$_POST

JRequest::checkToken('post') or jexit( 'Invalid Token' );;

否则,您可以使用下面这是首选

JRequest::checkToken('request') or jexit( 'Invalid Token' );

阅读更多



Answer 4:

与您最初的代码中的明显的问题是,你是不是在传送令牌到控制器。

data: {checkedarray:checked}可能包含只是要删除ID数组。

伊尔凡的版本是最容易实现的,它应该工作。 我已经成功地使其发挥作用。

这里是一个与工作代码要点 (请注意,这不是生产做好准备的代码,它只是为了测试令牌的问题)。 但我测试,它为我工作。



Answer 5:

就在未来使用的情况下:在的Joomla! 3.X JUtility::getToken()已被替换JSession::getFormToken()

在这里看到: http://api.joomla.org/cms-3/classes/JSession.html#method_getFormToken



文章来源: Invalid token with Joomla custom component