0

我已经在我的服务器上运行了安全扫描并收到了一些 CRLF 漏洞利用警告。

因此,按照建议,我已经清理了所有查询参数输入,如下所示。

var encodedStringSafeFromCRLF = Server.UrlDecode(Request.QueryString["address"])
                         .Replace("\r", string.Empty)
                         .Replace("%0d", string.Empty)
                         .Replace("%0D", string.Empty)
                         .Replace("\n", string.Empty)
                         .Replace("%0a", string.Empty)
                         .Replace("%0A", string.Empty);

假设一个真正的用户通过“地址”查询参数向我发送地址。

例子 -

https://mywebsite.com/details?instId=151711&address=24%20House%20Road%0aSomePlace%0aCountry

由于将从上述字符串中删除“%0A”,因此地址现在将变为“24HouseRoadSomePlaceCountry”,这不是我的预期。

我应该如何处理?如果我对 CRLF 进行代码更改,这会改变输入的解释方式。如果输入字符串没有被清理,那么它将打开我的服务器进行 CRLF 攻击。

这里有什么建议吗?

4

1 回答 1

1

如果您确实需要用户提供带有 CRLF 序列的数据,那么我不会过滤这些。与往常一样,永远不要以任何方式信任用户提供的数据:不要使用它来生成 HTTP 标头、响应或写入日志文件。

一般来说,反过来过滤会更安全:指定您愿意接受的所有字符,并过滤掉其他所有字符。

如果您需要将数据写入日志,例如,您可以先对数据进行 URL 编码,以便永远不会在那里写入“裸”CR LF。

我可能会在内部指定只使用 \n 作为换行符,并在内部将所有 \r、\n 和 \r\n 转换为仅一种表示形式 \n。因此其余代码不必处理所有版本。

于 2022-02-14T15:39:08.933 回答