如何防止header manipulation

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何防止header manipulation相关的知识,希望对你有一定的参考价值。

以下情况中会出现 Header Manipulation 漏洞:

1. 数据通过一个不可信赖的数据源进入 Web 应用程序,最常见的是 HTTP 请求。

2. 数据包含在一个 HTTP 响应头文件里,未经验证就发送给了 Web 用户。

如同许多软件安全漏洞一样,Header Manipulation 只是通向终端的一个途径,它本身并不是终端。从本质上看,这些漏洞是显而易见的:一个攻击者将恶意数据传送到易受攻击的应用程序,且该应用程序将数据包含在 HTTP 响应头文件中。

其中最常见的一种 Header Manipulation 攻击是 HTTP Response Splitting。为了成功地实施 HTTP Response Splitting 盗取,应用程序必须允许将那些包含 CR(回车,由 %0d 或 \r 指定)和 LF(换行,由 %0a 或 \n 指定)的字符输入到头文件中。攻击者利用这些字符不仅可以控制应用程序要发送的响应剩余头文件和正文,还可以创建完全受其控制的其他响应。

如今的许多现代应用程序服务器和框架可以防止 HTTP 头文件感染恶意字符。例如,Microsoft 的 .NET 框架的最新版本会在 CR、LF 和 NULL 字符被传送给 HttpResponse.AddHeader() 方法时将其转换为 %0d、%0a 和 %00。如果您正在使用的最新的 .NET 框架不允许使用新行字符设置头文件,则应用程序便不会容易受到 HTTP Response Splitting 攻击。然而,单纯地过滤换行符可能无法保证应用程序不受 Cookie Manipulation 或 Open Redirects 的攻击,因此必须在设置带有用户输入的 HTTP 头文件时采取措施。
参考技术A 在设置响应头的时候不要使用用户传入的参数
public void download(@RequestParam String fileName)
//查询fileInfo的信息
FileInfo fileInfo = service.getFileInfo(fileName);
//处理业务逻辑
//设置响应头,这一行不要直接使用用户入参的fileName以避免http响应被攻击者分割,一定要使用自己系统中定义的名称,如果使用用户(攻击者)的入参进行响应,存在风险。如果代理服务器将攻击者的分割响应挂起(缓存),攻击者再次进行请求的时候会导致用户的下一次响应的缓存命中,这样风险很大,可能导致用户浏览器数据泄露给攻击者
//设置响应头入参时,一定要使用自己系统中的可靠参数
response.setHeader("Content-disposition","attachment;fileName=" + fileInfo.getFileName());

如何防止 node-gyp 从 Internet 下载 node-headers.tar.gz 和 node.lib?

【中文标题】如何防止 node-gyp 从 Internet 下载 node-headers.tar.gz 和 node.lib?【英文标题】:How to prevent node-gyp from downloading node-headers.tar.gz and node.lib from internet? 【发布时间】:2017-08-01 00:55:39 【问题描述】:

node-gyp 在安装和构建原生模块(如 iconv、ref、ffi 等)期间从 Internet 下载以下文件:https://nodejs.org/download/release/v6.10.0/node-v6.10.0-headers.tar.gzhttps://nodejs.org/download/release/v6.10.0/win-x86/node.libhttps://nodejs.org/download/release/v6.10.0/win-x64/node.libhttps://nodejs.org/download/release/v6.10.0/SHASUMS256.txt

如何让 node-gyp 使用来自本地文件夹而不是来自 Internet 的这些文件?

我找到了以下解决方案: 1. 下载https://nodejs.org/download/release/v6.10.0/node-v6.10.0-headers.tar.gz 2. 解压到本地文件夹。 3. 在这个本地文件夹中创建文件夹Release。 4. 下载文件https://nodejs.org/dist/v6.10.0/win-x64/node.lib到Release文件夹中。 5. 在 .npmrc 中设置属性 nodedir 将指向带有解压标题的文件夹: nodedir=D:\tools\node_src\node-v6.10.0-headers

现在 npm 安装包,node-gyp 构建本地包,无需从 Internet 下载节点头文件和库。 这是一个正确的方法吗?

我在文档中找不到我应该下载 node.lib 并将其放入 Release 目录。 在分析了node-gyp的痕迹和node-gyp的代码后,我决定这样做。 是否可以使用一些 npm_config_xxx 属性设置 node.lib 的位置?

【问题讨论】:

这篇文章救了我。谢谢。 当你决定更新你的节点版本时不要忘记这一点。花了半个小时把我的头撞在桌子上,因为>> npm rebuild node-sass 没用:D 【参考方案1】:

以下对我有用:

# download for private repo, probably you're behind firewall
curl -k -o node-v8.9.4-headers.tar.gz -L https://nexus.com/repository/binaries/node/v8.9.4/node-v8.9.4-headers.tar.gz

# capture the absolute path
TARBALL_PATH=$(pwd)

# configure tarball in npm config
npm config set tarball $TARBALL_PATH/node-v8.9.4-headers.tar.gz

# The below command should pass without gyp error
npm install

【讨论】:

非常感谢!在本地,我通过全局安装 node-gyp 然后运行 ​​node-gyp rebuild --dist-url=https://url/to/your/binaries/" 来解决这个问题......这将在您的机器上安装必要的标头。然后就可以正常运行了。但是,这在 CI 构建中不起作用,因此非常感谢您的解决方案!【参考方案2】:

正如这里所建议的,您可以为 node-gyp 使用 --tarball 选项 https://github.com/nodejs/node-gyp/issues/1133

【讨论】:

这不适用于 --tarball 选项不加载“node.lib”文件,仅加载标题的窗口【参考方案3】:

对于那些在 --tarball 无用的 Windows 上运行的用户,因为 node-gyp 随后想要下载 node.lib 文件...

这是我的解决方案,希望能帮助其他陷入公司障碍的人。我以 v16.2.0 为例,请换成你合适的节点版本。

创建一个您乐于存放 16.2.0 数据的文件夹,并使用终端命令指向它。我选择了%USERPROFILE%\.node-gyp\16.2.0。不必在.node-gyp

在该文件夹中创建两个子文件夹:Releasesrc

下载:https://nodejs.org/download/release/v16.2.0/win-x64/node.lib 和 https://nodejs.org/download/release/v16.2.0/node-v16.2.0-headers.tar.gz

node.lib 放在Release 子文件夹中。

打开 headers.tar.gz 文件。我用的是 7zip。进入 tar 后,导航到 include/node。

将两个.gypi 文件解压到您的基本文件夹中。

将其他所有内容提取到 src 子文件夹中。

使用--nodedir=%USERPROFILE%\.node-gyp\16.2.0(如果您与我不同,则使用您的等效文件夹)运行

【讨论】:

以上是关于如何防止header manipulation的主要内容,如果未能解决你的问题,请参考以下文章

如何防止 node-gyp 从 Internet 下载 node-headers.tar.gz 和 node.lib?

如何防止页脚占据太多高度? [复制]

使用passport-http Basic + passport-local组合时如何防止www-authenticate header

如何防止在包含的文件中包含两次相同的文件?

当我的应用程序需要等待用户点击链接时,如何防止 "java.IOException.HTTP1.1 header parser received no bytes"?当我需要等待用

如何让nginx修改Response HTTP Header中的server的值