在我的网站上,我有一个接受一些文本用户输入的表单。对于“普通”角色,一切都很好。然而,当输入 unicode 字符时……好吧,情节变浓了。
用户输入类似
やっぱ死にかけてる
这作为包含 XML 实体引用的文本进入服务器
やっぱ死にかけてる?
现在,当我想用 HTML 将其返回给客户端时,我该怎么做?
如果我只是按原样输出字符串,脚本攻击就有可能发生。如果我尝试使用 scala.xml.Text
对其进行编码,它会转换为:
やっぱ死にかけてる?
在 Scala 中是否有更好的现成解决方案可以检测实体引用并且不转义它们,但转义 XML 标签?
最佳答案
将包含实体引用的字符串解析为 XML 片段。为了安全地输出 XML 中的 Unicode 字符,您可能会偏执并根据函数 escape
scala>import xml.parsing.ConstructingParser
import xml.parsing.ConstructingParser
scala>import io.Source
import io.Source
scala> val d = ConstructingParser.fromSource(Source.fromString("<dummy>や</dummy>"), true).documnent
d: scala.xml.Document = <dummy>や</dummy>
scala>val t = d(0).text
res0: String = や
scala> import xml._
import xml._
scala> def escape(xmlText: String): NodeSeq = {
| def escapeChar(c: Char): xml.Node =
| if (c > 0x7F || Character.isISOControl(c))
| xml.EntityRef("#" + Integer.toString(c, 10))
| else
| xml.Text(c.toString)
|
| new xml.Group(xmlText.map(escapeChar(_)))
| }
escape: (xmlText: String)scala.xml.NodeSeq
scala> <foo>{escape(t)}</foo>
res3: scala.xml.Elem = <foo>や</foo>
关于xml - 如何安全地处理 Scala 中的 unicode 用户输入(尤其是 XML 实体),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2033833/