【问题标题】:Would this stop Cross-site request forgery attempt?这会阻止跨站点请求伪造尝试吗?
【发布时间】:2013-11-27 14:23:27
【问题描述】:

我正在考虑一种方法来阻止跨站点请求伪造攻击作为我的安全编码课程的一部分。

我在想,如果我可以阻止尝试使用与该页面所在的地址不同的地址连接到我的网站……但这会起作用吗?如果没有,有什么更好的方法?

如果我尝试这样做会怎样:

// assuming my page is still on 192.168.195.128
if($_SERVER['REQUEST_METHOD'] == 'POST' && 
    $_SERVER["HTTP_HOST"] != "192.168.195.128")
{
    echo 'Cross-site request forgery attempt!';
}
else
{
    // continue normal execution
}

【问题讨论】:

    标签: php security csrf


    【解决方案1】:

    不,这不会阻止 CSRF。

    您需要的是某种类型的令牌,该令牌传递给用户以在表单提交时发回。此令牌只能在特定位置使用一次。

    CSRF 的工作原理是向用户当前所在的不同站点发送通用请求,通常利用他们已经过身份验证以及站点上没有被攻击的内容这一事实。这些请求来自用户的浏览器,看起来就像普通请求一样。可以查看referrer,但是一般认为通过表单传递的简单token比较好。

    【讨论】:

    • 我会说 - 永远不要相信推荐人,只使用令牌。
    • 澄清一下,所有请求数据都可以被欺骗,其中包括Referer: 标头。令牌更好的原因是它必须首先发送给客户端,让合法的客户端代码知道邪恶代码不知道的东西。
    • @Brad,关于我的代码的一个快速问题。假设攻击者对欺骗任何标头信息不感兴趣......我在 CSRF 上发布的代码会有什么影响?这意味着假设攻击者会尝试将来自不同地址的请求发布为正确的 CSRF(来自 192.168.195.1 地址和隐藏字段 [和所有] 的页面)攻击......我只是对为什么我的代码不起作用感兴趣。由于我对 PHP 没有太多经验,HTTP_HOST 会返回 192.168.195.1 地址并禁止 POST 请求吗??
    • 您的代码完全没有任何效果。您所做的只是验证您的代码正在运行的服务器是否是您期望的服务器,通常情况下应该如此。如果您想验证任何内容,您将验证 Referer 标头是否来自您的站点。如果标头没有被欺骗,那么 Referer 将来自您自己的域,这意味着请求不是来自另一个页面。
    • 好的,太好了!谢谢解释!
    猜你喜欢
    • 2014-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-26
    • 2014-06-21
    • 2015-07-14
    • 1970-01-01
    • 2020-08-25
    相关资源
    最近更新 更多