消毒数据库

时间:2012-02-28 03:54:13

标签: android database security input-sanitization

当使用php和mysql在网络上编码数据库时,你必须在将数据插入数据库之前清理数据,以确保有人不会逃避引号等。这在Android和MySQLite中是否必要?它会自动消毒吗?还是只是不必要?

2 个答案:

答案 0 :(得分:5)

1)是的,无论平台如何,您需要清理来自不受信任来源的任何输入(来自用户,另一个系统,另一个应用程序等 - 任何未硬编码到您的应用程序中的内容)。

2)是的,您需要在访问SQLite数据库时直接或通过内容提供商在Android中执行此操作。

3)在将SQL命令用于数据库之前对输入进行清理是必要的,但它无法阻止所有形式的SQL注入。防止这种情况的最佳策略是使用参数化查询,它允许数据库区分数据的意义和命令的意图,因此即使输入错误并且SQL命令出现在数据中也是如此,数据库知道将它们视为数据。在标准Java编码中,这涉及使用PreparedStatements。在SQLite / Android中,您需要使用compileStatement创建包含数据占位符的查询(从不受信任的输入派生的内容),并使用bindString设置这些占位符。

在优秀的OWASP SQL Injection写作中有关于此的更多信息。

答案 1 :(得分:1)

这在其他任何地方都适用,包括互联网。

您必须非常小心的一件事是您对内容提供商的投入。人们通常会编写内容提供商,然后使用它们来允许其他人与他们的应用程序进行交互。但是,通常情况下,ContentProvider充当数据库的接口。这是一个你必须要小心的地方,特别是如果你允许你的应用内容提供商通过手机上的其他应用访问。

是的,在用户可能输入数据的任何其他地方,您还需要小心。这包括可编辑的文本字段,您从互联网上下载的内容,基本上您无法信任的任何内容。

有一个项目可以进行污点分析,TaintDroid,但它只作为系统形式存在(即,它基于所有系统都不具备的运行时修改)。但是,目前还有一些研究项目正在进行,旨在跟踪哪些数据流向何处,这可以帮助您预防此问题。 (Scandroid [1]仅举几例。)

[1] SCanDroid:Android应用程序的自动安全认证, www.cs.umd.edu/~avik/papers/scandroidascaa.pdf