如何允许换行符但仍然防止 CRLF 攻击?

How to allow newline characters but still prevent CRLF attack?

我已经 运行 在我的服务器上进行了安全扫描,并收到了一些 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 攻击。

这里有什么建议吗?

如果你真的需要用户提供带有 CRLF 序列的数据,那么我不会过滤那些。一如既往,永远不要以任何方式信任 user-supplied 数据:不要使用它来生成 HTTP headers、响应或写入日志文件。

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

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

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