我正在编写一个java类,它将由servlet过滤器调用,并检查基于Struts的java Web应用程序的注入攻击尝试和XSS。 InjectionAttackChecker类使用正则表达式和java.util.regex.Pattern类,根据正则表达式中指定的模式验证输入。
话虽如此,我有以下问题:
我希望我已经清楚地提到了这个问题。但如果我没有,我道歉只是我的第二个问题。如果需要澄清,请告诉我。
答案 0 :(得分:7)
根据您的问题,我假设您正在尝试过滤不良值。我个人认为这种方法可以非常快速地变得非常复杂,并建议将编码值作为替代方法。以下是关于该主题的IBM文章,其中列出了两种方法的优缺点,http://www.ibm.com/developerworks/tivoli/library/s-csscript/。
为了避免SQL注入攻击,只需使用预准备语句而不是创建SQL字符串。
答案 1 :(得分:3)
如果您尝试清理输入中的所有数据,那么您将面临非常困难的时间。有大量涉及字符编码的技巧,这样可以让人们绕过你的过滤器。这个impressive list只是SQL注入可以做的无数事情中的一部分。您还必须防止HTML注入,JS注入以及其他可能的注入。唯一确定的方法是对应用程序中使用的数据进行编码。对您写入网站的所有输出进行编码,编码所有SQL参数。请特别注意后者,因为正常编码不适用于非字符串SQL参数,如该链接中所述。使用参数化查询是完全安全的。另请注意,理论上您可以在用户输入数据时对数据进行编码并将其编码存储在数据库中,但只有在您始终以使用该类型编码的方式使用数据时(仅限HTML)编码,如果它只会与HTML一起使用;如果它在SQL中使用,你就不会受到保护)。这就是为什么经验法则永远不会将编码数据存储在数据库中并始终在使用时进行编码的原因。
答案 2 :(得分:2)
必须验证和绑定所有数据。执行客户端和服务器端验证,因为10%的人在浏览器中关闭JavaScript。
杰夫阿特伍德有一个关于这个主题的nice blog,可以让你了解它的复杂性。答案 3 :(得分:1)
这个主题非常广泛article。
我认为你不会在这里有一个圣杯。我还建议尝试以某些标准方式(uuencode,base64)
对接收到的文本进行编码/解码答案 4 :(得分:1)
不要过滤或屏蔽值。
默认情况下,好的html模板语言会被转义。如果您正在生成XML / HTML,那么有时候使用DOM工具比使用模板语言更好。如果你使用DOM工具,那么它会消除很多这些问题。不幸的是,与模板相比,DOM工具通常是废话:)
答案 5 :(得分:0)
看看AntiSamy project [www.owasp.org]。我认为这正是你想要的;您可以设置过滤器来阻止某些标记。他们还提供策略模板,slashdot策略将是一个良好的开端,然后添加您需要的标签。
此外,www.osasp.org网站上有关于保护您的申请的丰富知识。
还应该执行用户'nemo'关于使用预准备语句和编码的说法。