好的,所以我将他们的任务存储在一个会话中:

Session::get('token', 'randomtokenstringhere');


在每种表单上,无论是否成功,我都会生成一个新令牌,并更新其会话令牌,例如说user 1位于更新配置文件页面上,然后我序列化一个表单,页面加载上的令牌会回显该令牌变量),然后他们提交运行ajax的表单,该表单要么完成要么出现错误,我的系统生成一个新令牌,但是现在在编辑配置文件页面上,他们仍在使用旧令牌,因此现在他们的令牌将永不匹配。

如何解决此问题以提高安全性?

这是我的ajax的一个例子:

<!-- accept, reject, add and cancel friend requests -->
$('.add_friend').click(function(event) { // bind function to submit event of form
    event.preventDefault();
    $.ajax({
        url: $(this).attr('href'),
        success: function(responseText) {
            if($(event.target).text() == 'Add as friend'){
                $(event.target).attr("href", "<?php echo Config::get('URL'); ?>friends/cancel_request/" + $(event.target).attr('id') + "/<?php echo System::escape(Session::get('token')); ?>");
                $(event.target).text('Cancel Request');
                $(event.target).removeClass("add_friend btn btn-success").addClass("cancel_request btn btn-info");
            }else{
                $(event.target).attr("href", "<?php echo Config::get('URL'); ?>friends/addfriend/" + $(event.target).attr('id') + "/<?php echo System::escape(Session::get('token'));?>");
                $(event.target).text('Add as friend');
                $(event.target).removeClass("cancel_request btn btn-info").addClass("add_friend btn btn-success");
            }
        }
    });
    return false;
});
<!-- End Like a status -->


当然,哪个运行以下链接:

<a class="add_friend btn btn-success" id="<?php echo System::escape($likes->timeline_likes_id); ?>" href="<?php echo Config::get('URL'); ?>friends/addfriend/<?php echo System::escape($likes->user_id).'/'.System::escape(Session::get('token')); ?>"><?php echo System::translate("Add as friend"); ?></a>


他们的令牌是:System::escape(Session::get('token')); ?>仅在页面刷新时加载,这不符合我使用ajax的原因

最佳答案

要更新javascript中的值,您需要进行一些修改。

这样的事情应该可以让您走上正轨

<!-- accept, reject, add and cancel friend requests -->
$('.add_friend').click(function(event) { // bind function to submit event of form
    event.preventDefault();
    var token = <?php echo System::escape(Session::get('token'));?>;
    $.ajax({
        url: $(this).attr('href'),
        success: function(responseText) {
            if($(event.target).text() == 'Add as friend'){
                $(event.target).attr("href", "<?php echo Config::get('URL'); ?>friends/cancel_request/" + $(event.target).attr('id') + "/" + token);
                $(event.target).text('Cancel Request');
                $(event.target).removeClass("add_friend btn btn-success").addClass("cancel_request btn btn-info");
            }else{
                $(event.target).attr("href", "<?php echo Config::get('URL'); ?>friends/addfriend/" + $(event.target).attr('id') + "/" + token);
                $(event.target).text('Add as friend');
                $(event.target).removeClass("cancel_request btn btn-info").addClass("add_friend btn btn-success");
            }
            token = responseText;
        }
    });
    return false;
});
<!-- End Like a status -->


现在,您要做的就是在$(this).attr('href')处修改表单处理程序以回显新的会话令牌。 JS会将令牌值设置为新令牌,并在后续请求中使用它。

这样做是将令牌放置在一个变量中,该变量可以在每次调用后进行更新,以便您可以在成功请求后对其进行更改。

关于javascript - 我正在通过jquery字符串发送跨站点伪造 token ,但是在下一页上,我将生成一个新 token ,然后它们的 token 将永远不匹配,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32235715/

10-10 23:40
查看更多