Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Security http头的安全性_Security_Http_Http Headers_Escaping_Base64 - Fatal编程技术网

Security http头的安全性

Security http头的安全性,security,http,http-headers,escaping,base64,Security,Http,Http Headers,Escaping,Base64,在发送http头之前,我们要仔细检查它们的安全性。显然,我们不能允许出现'\r'或'\n',因为这将允许内容注入 我在这里只看到两个选项: 截断换行符处的值 从标题值中删除无效字符 另外,从阅读来看,似乎只有ascii可打印字符对http头值有效,我是否也应该对其他154个可能的无效字节遵循相同的策略 或者,在这个主题上是否有任何权威的现有技术?简单地删除新行\n将阻止。即使CRLF在RFC中用作分隔符,所有浏览器都可以识别新行 您仍然需要担心集cookie或内容类型中的用户内容。这些元素中的属

在发送http头之前,我们要仔细检查它们的安全性。显然,我们不能允许出现'\r'或'\n',因为这将允许内容注入

我在这里只看到两个选项:

  • 截断换行符处的值
  • 从标题值中删除无效字符
  • 另外,从阅读来看,似乎只有ascii可打印字符对http头值有效,我是否也应该对其他154个可能的无效字节遵循相同的策略


    或者,在这个主题上是否有任何权威的现有技术?

    简单地删除新行
    \n
    将阻止。即使CRLF在RFC中用作分隔符,所有浏览器都可以识别新行


    您仍然需要担心
    集cookie
    内容类型
    中的用户内容。这些元素中的属性使用
    分隔,攻击者可能会将内容类型更改为UTF-7并绕过IE用户(且仅限于IE用户)的XSS保护。攻击者还可能创建新的cookie,从而引入会话固定的可能性

    头字段中允许使用非ASCII字符,尽管规范没有明确说明它们的含义;因此,发送者和接收者需要在语义上达成一致

    是什么让你产生了相反的想法?

    这种攻击被称为“头拆分”或

    OWASP链接指出,仅删除CRLF是不够的<代码>\n
    可能同样危险

    若要成功利用此漏洞,应用程序必须允许在标头中输入包含CR(回车,也由0x0D或\r给出)和LF(换行,也由0x0A或\n给出)字符的输入

    (我不知道为什么OWASP(和其他页面)将
    \n
    列为漏洞,或者这是否只适用于预解码的查询片段。)

    在任何试图设置头键或值中包含规范不允许的字符的头时提供500是完全合理的,并且允许您在日志中识别攻击性请求。当您知道过滤器出现故障时,快速故障是一个很好的策略

    如果您使用的语言允许,您可以将HTTP响应对象包装成一个在看到错误头时引发异常的对象,或者您可以更改响应对象以进入无效状态,将响应代码设置为500,然后关闭响应体流

    编辑:

    我应该去掉非ASCII输入吗

    我更喜欢在接收可信输入的层中进行这种规范化,除非有明确的类型转换,就像实体转义将纯文本转换为HTML转义一样。如果是类型转换,我会在需要输出类型时进行转换,但如果不是类型转换,我会尽早进行转换,以便该类型数据的所有使用者都能看到一致的值。我发现这种方法使调试和文档编制变得更容易,因为输入处理下面的层不必担心非规范化的输入

    在实现HTTP响应包装器时,我会使它在所有非ascii字符上失败(包括非ascii换行符,如U+85、U+2028、U+2029)然后确保我的应用程序测试包括对每个第三方URL输入的测试,以确保在位置到达
    setHeader
    之前,对任何
    位置
    头进行了正确的编码,以及类似地,对可能到达请求头的其他输入进行编码


    如果您的cookie包含用户id或电子邮件地址之类的内容,我会确保测试的虚拟帐户包含一个虚拟帐户,该帐户的用户id或电子邮件地址包含非ASCII字母。

    标题定义为文本,文本为“除CTL外的任何八位字节,但包括LWS”。CTL是“(八位字节0-31)和DEL(127)”。这似乎允许八位字符>127,但我怀疑这是有意的。我看到一些允许通过“编码字”进行非iso-8859-1编码,但它接着说,“只有可打印和空白字符数据应使用此方案进行编码”,在这种情况下,我宁愿使用ascii。bukzor:我认为这是有意的,我知道它偶尔会被使用。还需要中间产物让所有8位通过,否则将来某个时候就不可能使用UTF-8作为头字段编码。我认为utf8已经过时了,因为明确禁止使用八位字节0-31和127。bukzor:不,这只是意味着不能使用CTL或DEL。这不会影响其他字符集。你能进一步扩展与UTF7相关的XSS吗,或者给出一个参考吗?@Rook,我相信如果你控制
    内容类型
    头,你可以在IE之外的浏览器上进行UTF-7攻击。只有IE在没有指定编码时才会猜测UTF-7,但其他浏览器仍应遵守UTF-7标头。ha.ckers.org在自动检测并强烈暗示其他浏览器尊重标题的浏览器中包括“IE渲染引擎模式下的Netscape 8.1”。@bukzor,请参阅:
    +ADw脚本+AD4警报('XSS')中标题为“UTF-7编码”的部分+ADw-/SCRIPT+AD4-
    @Mike Samuel好极了,你试过在firefox或chrome上执行这段代码吗?UTF-7用于SMTP,而不是HTTP,IE是唯一支持它的,他们在IE9中放弃了UTF-7内容嗅探。xss备忘单已经有5年历史了,几乎没用了。@Rook。我还没有在非微软浏览器的最新版本上尝试过。我同意UTF-7的目的。我的理解是,浏览器在某些时候使用字节[]->UTF-16[]编码的标准库,而UTF-7在许多库中都可用。如果较新的浏览器对编码持怀疑态度,那就太好了,但是我们这些在框架上工作的人需要支持那些想要支持IE 6和Safari较早版本的应用程序开发人员。我们应该去掉非ascii可打印字符吗?谢谢你提供的详细信息