2012-01-18 85 views
10

我有一些用户输入。在我的代码确保下面唱被转义:HTML-Entity转义防止XSS

& -> & 
< -> &lt; 
> -> &gt; 

OWASP我看,有更多的字符转义。

的属性我做了另一种转义的:

& -> &amp; 
" -> &quot; 

可以保证,所有的属性由”封闭这使我确信我的HTML的属性,但不是HTML本身

我在想,如果我的转义就足够了。我读过this post,但我仍然不知道我的关心。

(JavaScript的转义与OWASP-库)

+0

''→''和'% - > &perc;'(对于XSS,每%34等编码字符) – 2012-01-18 11:58:43

+0

@JoopEggen在什么情况下用'&perc;'代替'%'有用? – Gumbo 2012-01-18 12:26:58

+0

@Gumbo'&perc;'确实对XSS的用处不大,但它可能会混淆网址。浏览器不会为其字符使用%代码,即:''不会调用JavaScript。 – 2012-01-19 04:15:38

回答

25

我使用OWASP(ESAPI)库,以及,为了躲避针对不同类型的显示器,使用字符串:

String html = ESAPI.encoder().encodeForHTML("hello <how> are 'you'"); 
String html_attr = ESAPI.encoder().encodeForHTMLAttribute("hello <how> are 'you'"); 
String js = ESAPI.encoder().encodeForJavaScript("hello <how> are 'you'"); 

HTML(假设JSP)

<tag attr="<%= html_attr %>" onclick="alert('<%= js %>')"><%= html %></tag> 

更新()

由于ESAPI编码器被认为是legacy,更好的替代品已经创建并且正在积极维护,我强烈建议使用OWASP Java Encoder来代替。

如果您的项目已经使用ESAPI,则添加了integration,它允许您使用此库进行编码。

的用法是在他们wiki page解释,但完成的缘故,这是你可以用它来上下文编码您的数据:

// HTML Context 
String html = Encoder.forHtml("u<ntrus>te'd'"); 

// HTML Attribute Context 
String htmlAttr = Encoder.forHtmlAttribute("u<ntrus>te'd'"); 

// Javascript Attribute Context 
String jsAttr = Encoder.forJavaScriptAttribute("u<ntrus>te'd'"); 

HTML(假设JSP)

<div data-attr="<%= htmlAttr %>" onclick="alert('<%= jsAttr %>')"> 
    <%= html %> 
</div> 

PS:存在更多上下文并且由库支持

+0

正如我所提到的,我使用OWASP来转义Javascript-Strings。但是我有一些遗留代码,它是由apache cocoon生成的。正如我所描述的,该代码正在进行转义。我的问题是:这是否足够逃脱?如果不是(并且只有没有),我将不得不逐行修改〜200 XSL-Stylesheet。 – 2012-01-18 12:47:57

+0

恕我直言,我不认为这是足够的,只是通过检查这个网站(http://ha.ckers.org/xss.html),你已经可以确定你的逃跑是不够的 – epoch 2012-01-18 12:55:17

+0

感谢您的资源。 – 2012-01-18 15:00:26

1

我建议你使用Appache常见Lang库逃避串,对于〔实施例逃脱HTML:

String escapedString = org.apache.commons.lang.StringEscapeUtils.escapeHtml(String str); 

库中有许多有用的方法,HTML,XML,JavaScript来逃避。

+0

我不认为常用的lang lib是以与ESAPI相同的方式进行故意恶意输入测试的。 – avgvstvs 2014-07-25 18:00:12

+5

实际上,StringEscapeUtils不会将单引号'''转换为''',所以它不适用于HTML转义以阻止XSS – 2015-02-18 08:47:41