我正在尝试确保我的webforms ASP.NET应用程序尽可能安全,它只接收具有登录名的用户将用户输入数据接收并存储到SQL数据库(通常的东西),因此不可用于一般公众。
通过禁用ValidateRequest
输入页面,我感谢存在XSS攻击的风险 - 所有SQL查询都是参数化的,因此从SQL注入是安全的(正确吗?)。
我可以在输入文本上使用HTMLencode
,而不是使用Anti-XSS库吗?然后我会存储HTMLencode
d字符串吗?
或者我是以错误的方式看待它?我应该逐字存储用户输入,然后随时将HTMLencode
或XSS-HTMLencode
输出到浏览器吗?
答案 0 :(得分:3)
好的,阅读它似乎常见的知识是逐字存储输入,不做任何调整,只需参数化以防止SQL注入。
这里有一些好评:What are the best practices for avoiding xss attacks in a PHP site
然后使用HTML Encode(似乎可以使用),或者使用XSS-Library对输出进行编码 - 如上面的链接中所述,数据的目标可能在稍后的某个时间点不是浏览器。
然后在这里使用XSS攻击示例:https://www.owasp.org/index.php/XSS_Filter_Evasion_Cheat_Sheet将其中一些输入到数据库,并回读浏览器。使用正确的编码,您应该看到文本,而不是执行脚本。
答案 1 :(得分:1)
考虑到注入和XSS攻击在OWASP top 10中有两个第一个位置,您需要非常小心,然后在asp.net中禁用请求验证。
首先不要禁用请求验证,除非确实需要。你必须有理由这样做。请求验证是针对XSS类型攻击的本机机制。
对于所有输入字段,第二个总是white list validation,只允许通过可接受的章程。
然后你需要放过像'<'这样的字符。或'>',这有潜在危险。
因此,如果您在页面上显示输出,则必须始终对输出进行编码。总是。这是为了防止JavaScript(如果插入到输入中)将被执行。
参数化查询必须与上述白名单验证和输出编码一起使用,以防止sql注入攻击。
也不要在sql存储过程中做任何动态查询构造(动态sql)。
确保所有数据库用户和SQL存储过程都具有对数据库资源的适当级别访问权限(尽可能少的访问权限方法)。