如何检查内容是否为纯文本?

3
我有一个纯文本区域,只接受用户输入的纯文本。我想确保用户不会在文本区域中放置任何标记。我还假设用户可以用不同的语言发布帖子。因此,最好的方法是什么,既能在服务器端(使用Java),又能在客户端(使用jQuery)验证内容。
如有需要,请赐教。
更新:如果问题不够清楚,我很抱歉。为了简单起见,这就是我想做的——我让用户在文本区域中键入文本(没有丰富的文本框)。对于文本区域中的每个双新行,我想在HTML页面中显示一个段落。如何正确地实现?

3
为什么?你只需要对基于这个输入的任何输出进行HTML编码即可,这是更好的做法。 - Martin Smith
2
你理解的“纯文本”是什么?当HTML被解释为纯文本时,它也是纯文本。也许你只想从用户输入中转义任何特殊的HTML字符,这样当你在浏览器中显示它们时,它们就不会被解释为HTML了? - Kos
好的,当我说纯文本时,我的意思是我不希望用户提供任何标记标签等。我计划将纯文本转换为简单的HTML,以便在网页中正确显示:例如:原始文本可能是“这是一行简单的文字\n\n现在我在第二段”,然后我将其转换为“<p>这是一行简单的文字</p><p>现在我在第二段</p>”。有更好的方法吗? - Qedrix
2个回答

4
在HTML内容上验证用户输入并没有太多意义。在网页上重新显示用户输入时,您可以使用转义HTML的方式。由于您提到在服务器端使用Java,因此很可能使用JSP作为视图技术,了解到您可以使用JSTL <c:out>标签和fn:escapeXml()函数在输出之前转义HTML。

例如,在重新显示受用户控制的输入时:

<c:out value="${somebean.sometext}" />

或者在重新显示用户提交的请求参数时:

<input type="text" name="foo" value="${fn:escapeXml(param.foo)}" />

例如,这样的代码 <script>alert('xss')</script> 将被打印到HTML输出中,如下所示:&lt;script&gt;alert(&#39;xss&#39;)&lt;/script&gt;,因此在HTML中以用户输入的方式直接显示出来。
如果您坚持要验证它,您最好使用像Jsoup之类的HTML解析器。
String text = request.getParameter("text");

if (!text.equals(Jsoup.parse(text).text())) {
    // There was HTML in the text.
}

更新:根据评论,您实际上想要对输入进行HTML白名单的消毒,以删除潜在的恶意标签。您也可以使用Jsoup来完成这个任务,参见此页面

String sanitized = Jsoup.clean(text, Whitelist.basic());

Whitelist#basic()允许的元素在API文档中有详细规定。


我无法在JSP中转义HTML,因为我计划在HTML页面中将文本显示为段落。因此,如果我的文本像这样"<p>第一段</p><p>第二段</p>",使用转义函数将会把整个文本显示在一行中。您认为我有其他选择以便正确地显示段落吗? - Qedrix
啊,你的具体问题是如何使用白名单从用户控制的HTML输入中删除恶意的XSS攻击敏感标签?你也可以使用Jsoup来实现这一点,详见答案更新。 - BalusC
根据您的问题更新,要在文本区域中重新显示用户输入的换行符,只需将\n替换为<p>或在包含元素上应用CSS white-space:pre;即可。(请注意,这开始变得相当混乱,我基本上给出了三个不同的答案来解决完全不同的问题;在提问之前,您应该先理清基本概念,并针对每个单独的问题提出新问题。) - BalusC

0

如果你想防止HTML标记,你可以使用正则表达式,在看到尖括号(<)时抛出错误。


这也将防止用户输入诸如<3这样的表情符号或3 < 4这样的表达式。 - Martin Smith
你想要防止文本区域提交包含HTML标记的内容,还是只是确保一旦获取到内容后不会被解析为HTML? - bashcrufter

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接