我需要转义字符以避免XSS。我正在使用org.apache.commons.lang.StringEscapeUtils.escapeHtml(String str),它有以下几种方式:
原始输入
" onmouseover=alert() src="
转义后,HTML变为
" onmouseover=alert() src="
但是,有些情况下反射输入被捕获在单引号中,例如:
test'];}alert();if(true){//
在这种特殊情况下,转义HTML没有任何影响。但是,org.apache.commons.lang.StringEscapeUtils还有一个名为escapeJavascript(String str)的方法,它将输入转换为:
test\'];}alert();if(true){\/\/
这里的问题是,您是否会先通过转义HTML然后使用Javascript来清理您的输入?另一种方法是用手动替换单引号字符。
任何帮助将不胜感激!
正如@ gabor-lengyel所提到的,我应该能够使用html编码器来逃避单引号。
我遇到的问题是我使用的是org.apache.commons.lang.stringescapeutils.escapeHtml
,它无法使用相应的HTML实体转义单引号。我现在正在使用org.springframework.web.util.HtmlUtils.htmlEscape
,它能够处理双引号和单引号。
再次感谢@ gabor-lengyel的帮助!
您不应该使用escapeJavascript
/ escapeEcmaScript
进行XSS保护。将escapeHtml
输出添加到您的站点应该是安全的:
"<p>" + escapeHtml(userProvided) + "</p>"
如果你想要这样的东西:
"<p class='" + userProvided + "'>"
要使它安全起来要困难得多,你可能想要使用合法字符/值的白名单(如regexps:[a-Z]
,(option1|option2)
)并删除所有意外而不是逃避它。