我有一个纯文本区域,我只接受来自用户的纯文本。我想确保用户不在文本区域中放置任何标记。我还假设用户可以使用不同的语言发布。那么,在服务器端(使用java)和客户端(使用jquery)验证内容的最佳方法是什么。
在这方面的任何帮助将不胜感激。
更新:如果问题不够明确,我很抱歉。为了简单起见,这就是我想要做的 - 我让用户在textarea中输入文本(这里没有富文本框)。对于文本区域中的每个双新行,我想在HTML页面中显示一个段落。我该如何正确地做到这一点?
答案 0 :(得分:4)
验证HTML内容的用户输入毫无意义。您可以在网页上重新显示此用户输入时转义HTML。由于您提到您在服务器端使用Java,因此您可能使用JSP作为视图技术,因此最好知道您可以使用JSTL <c:out>
标记和{{3}函数在打印到输出之前转义HTML。
E.g。在重新显示用户控制的输入时:
<c:out value="${somebean.sometext}" />
或重新显示用户提交的请求参数时:
<input type="text" name="foo" value="${fn:escapeXml(param.foo)}" />
这种方式,例如<script>alert('xss')</script>
将作为<script>alert('xss')</script>
打印到HTML输出,因此在字面上以最终用户输入的方式显示在HTML中。
如果您确实坚持要对此进行验证,那么您最终可能会为fn:escapeXml()
抓取一个HTML解析器。
String text = request.getParameter("text");
if (!text.equals(Jsoup.parse(text).text())) {
// There was HTML in the text.
}
更新根据您实际要针对HTML白名单清理输入以删除潜在恶意代码的评论。您也可以使用Jsoup执行此操作,另请参阅Jsoup。
String sanitized = Jsoup.clean(text, Whitelist.basic());
Whitelist#basic()
中指定了{{1}}的允许元素。
答案 1 :(得分:0)
如果你要阻止它的HTML标记,你可以使用正则表达式,如果它看到一个雪佛龙(&lt;)
就会抛出错误