【问题标题】:How to Implement Generic CSRF Tokens with JQuery AJAX?如何使用 JQuery AJAX 实现通用 CSRF 令牌?
【发布时间】:2012-01-13 14:47:31
【问题描述】:

我目前正在开发 jquery 代码,通过 ajax 将数据发送到服务器,然后根据请求参数插入数据库。

但是,我很担心这可能会被 CSRF 攻击滥用,这会使事情变得相当不安全。我试图对此进行研究,并且只找到特定框架(例如 django 和 rails)的答案,而我只是在使用 PHP 的通用实现之后才找到答案。

我已经读到您可以使用 JQuery.ajaxsend() 函数来实现代码,以便随每个 AJAX 请求发送一个令牌,但是我不知道如何实现这一点,因为 JavaScript 显然无法访问 PHP会话变量。使用 cookie 是否足够安全?

基本上我需要能够检查请求的来源,以确保请求是真实的,而不是用于利用系统的伪造请求。

如果有人能指出我正确的方向,那将不胜感激!

【问题讨论】:

    标签: php javascript jquery ajax csrf


    【解决方案1】:

    好吧,要知道$.ajax 似乎会随请求一起发送cookie,包括PHP 会话cookie。使用该功能可以将您的攻击从 CSRF 更改为会话劫持,但这只是一个开始。接下来,如果可以避免会话劫持,请通过 SSL 运行您的服务。

    我确信还有其他方法可以做到这一点,但对于普通 PHP,这似乎可行。如果我错了,请有人纠正我。

    【讨论】:

    • 这假定 AJAX 请求由会话中的某些东西进行身份验证。
    • 那么用户需要登录才能获得访问权限。因此将检查 PHP 会话以进行身份​​验证。
    • 此外,似乎没有任何会话 cookie 信息与 $.ajax 一起发送。
    • @MichaelMior 是的,我提到“JavaScript 显然无法访问 PHP 会话变量”是指有一个 PHP 会话可用于验证请求。
    • @DanielWest Hrm... 我昨晚写了一些依赖于这种情况的东西,它至少在 Chrome 中工作,方法是POST。哪个浏览器?
    【解决方案2】:

    这是在 Django 中的实现方式,但没有特定于框架的内容(除了将 cookie 中的 CSRF 令牌设置为“csrftoken”):https://docs.djangoproject.com/en/1.3/ref/contrib/csrf/#ajax

    【讨论】:

    • 所以我猜可以使用 PHP 在登录时生成令牌并将其添加到 cookie 中?因为在他们的示例代码中没有生成令牌的功能。
    • Django 使用中间件将 CSRF 令牌添加到每个页面视图的 cookie 中(如果它还没有的话)。所述中间件还检查每个表单帖子以验证 CSRF 令牌是否存在且正确(在 POST 参数或 X-CSRFToken 标头中)。
    猜你喜欢
    • 2016-02-11
    • 2019-11-30
    • 2014-01-23
    • 2011-06-13
    • 2016-02-08
    • 2018-02-22
    • 2013-11-15
    • 2016-04-07
    • 2014-04-13
    相关资源
    最近更新 更多