java - android中如何防止sql注入(inject)攻击?

标签 java android sqlite

所以我在使用以下代码时遇到问题,想知道是否有其他方法来创建和删除表,其中表名是从用户处获取的,以下代码在使用“'”单引号时会出错。请帮忙

public void droptable(String tablename) {
    SQLiteDatabase db =this.getWritableDatabase();
    db.execSQL("DROP TABLE IF EXISTS " + tablename);

}
 public void createtable(String tablename)
{
    SQLiteDatabase db = this.getWritableDatabase();
    String query = String.format("CREATE TABLE IF NOT EXISTS %s ( %s INTEGER PRIMARY KEY AUTOINCREMENT , %s TEXT )",tablename,COLUMN0,COLUMN1);
    db.execSQL(query);
}

有更好的方法吗?

最佳答案

除非您的应用程序本身会导出 SQLite 数据库,并且用户打算在其他地方使用该 SQLite 数据库,否则用户将永远不会通过您的应用程序看到此表。

这为您提供了多种选择:

  1. 不要使用用户输入的值作为表名。相反,您自己生成一个有效的表名称,并保留生成的名称与用户为每个表输入的“显示名称”的映射。

  2. 通过删除不支持的字符,将用户输入的值转换为有效的表名称。

  3. 将用户输入的值括在引号 ("%s") 中,但如果用户输入带引号的表名称,则会出现问题。

  4. 通过拒绝将非标准字符作为 EditText 的一部分来防止用户输入无效的表名称

  5. 验证用户输入的值,如果用户输入的内容会导致 SQL 错误,则显示错误对话框

关于java - android中如何防止sql注入(inject)攻击?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52137610/

相关文章:

java - 网络服务失败。 java.net.SocketTimeoutException : Read timed out - Using Jboss 7. 1

Java白盒测试

android - 在方向更改时更改 View 背景图像

java - 在没有用户干预或 Intent 的情况下发送电子邮件

android - 从 Android sqlite 数据库中检索大 blob

python - 向现有模型添加字段在 Django 中不起作用

java - 如何将从 Controller 类返回的 JSON 数组打印到 jsp 页面

java - 如何从网页(标签内)的 HTML 页面源中提取数据?

nhibernate - SQLite/Fluent NHibernate 集成测试工具初始化在大数据 session 后不可重复

java - 初始化类时使用 Spring 属性