我正在努力确保我的webforms ASP。. NET应用程序是尽可能安全的,它接收用户输入数据并将其存储到SQL数据库(通常的东西),仅供登录用户使用,因此不对一般公众可用。
通过禁用输入页面的ValidateRequest
,我意识到有XSS攻击的风险-所有的SQL查询都是参数化的,所以是安全的SQL注入(正确?)。
我可以在输入文本上使用HTMLencode
而不是使用Anti-XSS库吗?然后我存储HTMLencode
d字符串吗?
还是我看错了?我是否应该逐字存储用户输入,然后在将其输出到浏览器时存储HTMLencode
或XSS-HTMLencode
?
好的,阅读周围似乎普遍的智慧是逐字存储输入,不做任何调整,只是参数化以防止SQL注入。
这里有一些很好的评论:在PHP站点中避免xss攻击的最佳实践是什么
然后,要么使用HTML Encode(看起来很脆弱),要么使用XSS-Library对输出进行编码——正如上面的链接所述,数据的目的地在以后的某个时刻可能不是浏览器。
然后使用这里的XSS攻击示例:https://www.owasp.org/index.php/XSS_Filter_Evasion_Cheat_Sheet将其中的一些输入到数据库中,并返回到浏览器。使用正确的编码,您应该看到文本,而不是执行脚本。
考虑到注入和跨站攻击在OWASP前10名中占据两个位置,你需要非常小心,然后在asp.net中禁用请求验证。
首先,除非真的需要,否则不要禁用请求验证。你必须有理由去做。请求验证是针对XSS类型攻击的原生机制。
第二,总是对所有输入字段进行白名单验证,这允许只通过可接受的字符。
在某些情况下,您需要忽略像'<'或'>'这样的字符,这是潜在的危险。
因此,如果要在页面上显示输出,则必须始终对输出进行编码。总是这样。这可以防止JavaScript(如果插入到输入中)被执行。
参数化查询必须与上述白名单验证和输出编码一起使用,以防止sql注入攻击。也不要在sql存储过程中构造动态查询(动态sql)
并确保所有的DB用户和sql存储过程对DB资源具有适当的访问权限(最小可能的访问权限方法)