如何防止android中的sql注入攻击?

时间:2018-09-02 13:43:13

标签: 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);
}

有更好的方法吗?

1 个答案:

答案 0 :(得分:3)

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

为您提供多种选择:

  1. 请勿将用户输入的值用作表名。而是自己生成一个有效的表名,并保留所生成的名称与每个表的用户输入“显示名称”的对应关系。

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

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

  4. 通过拒绝非标准字符作为EditText

  5. 的一部分,防止用户输入无效的表名
  6. 验证用户输入的值,如果输入的内容会导致SQL错误,则会显示错误对话框