我在服务器上运行了安全扫描,收到了一些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序列的数据,那么我不会过滤这些数据。一如既往,永远不要以任何方式信任用户提供的数据:不要使用它来生成HTTP标头、响应或写入日志文件。
一般来说,用另一种方式过滤更安全:指定你愿意接受的所有字符,并过滤掉其他所有字符。
如果你需要将数据写入日志,你可以先对数据进行URL编码,这样";裸的";CR LF从未写在那里。
我可能会在内部指定使用just作为换行符,并在内部将所有、和转换为一个表示形式。因此,代码的其余部分不必处理所有版本。