English 中文(简体)
Java Web 应用程序中防止 SQL 注入攻击和 XSS 的方式
原标题:
  • 时间:2009-01-27 20:12:16
  •  标签:

我正在编写一个Java类,它将由Servlet过滤器调用,并检查基于Struts的Java网络应用程序的注入攻击尝试和XSS。InjectionAttackChecker类使用regex和java.util.regex.Pattern类来根据regex中指定的模式验证输入。

说那么多,我有以下问题:

  1. What all special characters and character patterns (for example <>, ., --, <=, ==,>=) should be blocked so that injection attack could be prevented.
  2. Is there any existing regex pattern which I could use as is?
  3. I have to allow some of the special character patterns in some specific cases, some example values (to be allowed) are (used pipe | character as a separator of different values) *Atlanta | #654,BLDG 8 #501 | Herpes simplex: chronic ulcer(s) (>1 mo. duration) or bronchitis, pneumonitis, or esophagitis | FUNC & COMP(date_cmp), "NDI & MALKP & HARS_IN(icd10, yes)" . What strategy should I adopt so that injection attack and XSS could be prevented but still allowing these character patterns.

我希望我已经清楚地提出了问题。但如果没有,对不起,这只是我的第二个问题。如果需要任何澄清,请让我知道。

问题回答

基于你的问题,我假设你正在尝试过滤不良数值。我个人认为这种方法可能会非常复杂,建议将值编码为另一种方法。这是一篇IBM文章,讨论了两种方法的优缺点,http://www.ibm.com/developerworks/tivoli/library/s-csscript/

为了避免 SQL 注入攻击,只需使用预处理语句而不是创建 SQL 字符串即可。

如果您试图对所有输入数据进行消毒,将会非常困难。有很多技巧涉及字符编码等,将允许人们规避您的过滤器。这个令人印象深刻的清单只是SQL注入可能发生的众多事情之一。您还必须防止HTML注入、JS注入和其他潜在的问题。唯一确定的方法是在应用程序中使用数据时进行编码。对您编写到网站的所有输出进行编码,对SQL参数进行编码。要特别小心后者,因为普通编码对于非字符串SQL参数不起作用,如该链接中所解释的那样。使用参数化查询可以完全保险。还要注意,理论上可以在用户输入数据时对数据进行编码并将其编码存储在数据库中,但这仅适用于始终使用该类型的编码使用数据的情况(即,如果只与HTML一起使用,则使用HTML编码;如果在SQL中使用,您将无法得到保护)。这部分是为什么经验法则是不要在数据库中存储已编码的数据,而总是在使用时进行编码。

验证和绑定所有数据是必要的。执行客户端和服务器端的验证,因为有10%的人在其浏览器中关闭JavaScript。

Jeff Atwood写了一篇关于防止CSRF和XSRF攻击的不错的博客,可以让你了解其复杂性。

这是一篇非常详尽的文章,请点击查看

我不认为你会在这里找到圣杯。我还建议尝试用一些标准方式对接收到的文本进行编码/解码(如uuencode、base64)。

不要过滤或屏蔽值。

  1. you should ensure that when combining bits of text you do the proper type conversions :) ie: if you have a piece a string which is type HTML and a string which is type TEXT you should convert TEXT to HTML instead of blindly concatenating them. in haskell you can conveniently enforce this with the type system.

好的HTML模板语言默认会进行转义。如果您正在生成XML/HTML,则有时最好使用DOM工具而不是模板语言。如果使用DOM工具,则可以消除许多这些问题。不幸的是,与模板相比,DOM工具通常很烂 :)

  1. if you take strings of type HTML from users you should sanitize it with a library to remove all not-good tags/attributes. there are lots of good whitelist html filters out there.
  2. you should always use parameterized queries. ALWAYS! if you have to build up queries dynamically then build them up dynamically with parameters. don t ever combine non-SQL typed strings with SQL typed strings.

Take a look at the AntiSamy project [www.owasp.org]. I think it is exactly what you want; you can setup a filter to block certain tags. They also supply policy templates, the slashdot policy would be a good start, then add on the tags you require.

Also, there is a wealth of knowledge on the www.osasp.org website about securing your application.

What user nemo says about using prepared statements and encoding should also be performed.





相关问题
热门标签