【发布时间】:2011-10-28 00:18:05
【问题描述】:
我已经阅读了许多关于转义字符和清理用户输入的论坛(和堆栈溢出)帖子,但我想将它们结合在一起,使其更具体地适用于 Android 平台。这是我的情况:
我有一个通过 SOAP XML 消息与 Web 服务通信的 Android 应用程序。这是一个可能发送的示例 XML 消息(我忽略了它周围的 SOAP 信封):
<Log>
<Summary>user entered text</Summary>
<Details>user entered text</Details>
</Log>
如您所见,用户可以在两个地方输入表单中的文本,然后将其插入到此消息中以发送到 Web 服务。我需要:
A) 确保它是有效的 XML 并且
B) 确保它不包含任何恶意 SQL 内容。
Android API 中是否有任何预先包含的实用程序来转义用户可能输入的无效 XML 字符(例如 &)? (这样我就可以简单地说“escapeXML(xmlstring);”或类似的东西)
有什么方法可以检查恶意 SQL(或其他代码注入)还是应该在服务器端进行处理?
附带说明:我几乎希望用户只能输入 A-z、0-9 和基本标点符号(以避免有时甚至无法看到或解释的奇怪 unicode 字符)。有没有一种好方法可以将用户输入限制为字符子集?
我知道这是几个问题,所以如果您只知道其中的一部分,请无论如何提供答案,我将非常乐意支持或接受它。提前感谢所有帮助! (StackOverflow 是当我消耗了太多的论坛帖子并且对什么适合我的情况感到困惑时,我来到了 StackOverflow)
【问题讨论】:
-
我猜你可以用正则表达式来限制它,但我不会。首先,以这种方式限制它根本不会防止注射(你所需要的只是基本的波动)。其次,如果您的任何用户正在使用外来字符集(或者甚至试图正确输入外来词),如果他们的输入被拒绝,他们可能会有点恼火。通常,您不应该存储格式化的 XML - 而是存储实体(类实例)。参数化查询应该处理 SQL 注入 - 您还需要注意这里的跨站点脚本。
-
好吧,我知道我们不会处理外来词的问题,因为它是为特定客户定制编写的应用程序,仅在美国有效。另外,我并不认为将输入限制为文本、数字和标点符号会阻止 SQL 注入,而是会保持文本阅读器友好(例如,因为大脑不知道如何“阅读”控制字符)
-
在不了解您的客户的情况下,我不能肯定地说,但您使用外来词的频率可能比您意识到的要多(即使您没有正确“拼写”它们)。即使您的客户只在美国工作(更多取决于域/位置)。通常在处理 SOAP 时,您正在使用一些正在序列化/反序列化消息的框架/库 - 您的代码甚至不一定知道它来自 XML 消息(并且可能不应该)。 Java 有好几个,不知道是 Android 专用的版本。
标签: android sql xml sql-injection