xml - 如何安全地处理 Scala 中的 unicode 用户输入(尤其是 XML 实体)

标签 xml scala xml-serialization

在我的网站上,我有一个接受一些文本用户输入的表单。对于“普通”角色,一切都很好。然而,当输入 unicode 字符时……好吧,情节变浓了。

用户输入类似

やっぱ死にかけてる

这作为包含 XML 实体引用的文本进入服务器

やっぱ死にかけてる?

现在,当我想用​​ HTML 将其返回给客户端时,我该怎么做?

如果我只是按原样输出字符串,脚本攻击就有可能发生。如果我尝试使用 scala.xml.Text 对其进行编码,它会转换为:

やっぱ死にかけてる?

在 Scala 中是否有更好的现成解决方案可以检测实体引用并且转义它们,但转义 XML 标签?

最佳答案

将包含实体引用的字符串解析为 XML 片段。为了安全地输出 XML 中的 Unicode 字符,您可能会偏执并根据函数 escape

为它们使用 XML 实体引用
scala>import xml.parsing.ConstructingParser                                                             
import xml.parsing.ConstructingParser

scala>import io.Source                                                                                  
import io.Source

scala> val d = ConstructingParser.fromSource(Source.fromString("<dummy>&#12420;</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>&#12420;</foo>

关于xml - 如何安全地处理 Scala 中的 unicode 用户输入(尤其是 XML 实体),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2033833/

相关文章:

PHP XML Expat 解析器 : how to read only part of the XML document?

scala - 什么时候应该使用 Option.empty[A] ,什么时候应该在 Scala 中使用 None ?

c# - 序列化到现有文件并删除声明

java - 在 Java 的 XML 中创建多个子节点

java - 使用 getNodeValue() 获取文本和内联元素

unit-testing - 定义一个简单的隐式任意

scala - 如何使用自定义键值名称将映射列转换为结构类型?

javascript - 将 XML 转换为字符串并附加到页面

java - Java 中的序列化对象

c# - 尝试将 xml 导入 android 时出现 OutOfMemoryException