【发布时间】:2012-12-26 11:17:21
【问题描述】:
我正在构建一个自定义 Joomla 组件,并将它添加到我的模板 (default.php) 文件中的表单中(它使用的是 HTTP POST):
echo JHTML::_( 'form.token' ); //add hidden token field to prevent CSRF vulnerability
然后我检查控制器中的令牌:
JRequest::checkToken() or die( 'Invalid Token' );
但无论我做什么,我都会得到一个无效的令牌。当我在 html 页面上查看源代码时,我已经验证了在我的表单中创建了一个带有令牌的隐藏类型。我也验证了,在控制器中,token的值是一样的:
print_r(JUtility::getToken());
那么,如果令牌是相同的值,为什么它会以 Invalid Token 消息退出?
编辑:我没有提到一个关键部分。我的表单是在一个单独的 js 文件中使用 jquery ajax 处理的,该文件添加到我的 view.html.php 中。这是 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);
}
然后转到执行数据库更新的模型。我看到这个旧的post 可能是相关的。我不清楚如何/在哪里生成令牌以及在哪里/如何验证该令牌。这篇文章似乎很复杂,因为它也会检查用户,我认为在我的情况下不需要。还是我理解错了?
编辑#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。
【问题讨论】:
-
您的表单是通过 HTTP GET 还是通过 POST 提交的?
-
@Jim DeLaHunt 这是 HTTP POST
-
@Tom:我已经更新了答案。看看,如果它不起作用,请告诉我。