当我使用Android中的用户输入查询我的数据库时,我通常使用SQliteDatabase.query,并正确使用SelectionArgs。
Cursor cursor = db.query(UserEntity.TABLE,
new String[]{UserEntity.COLUMN_ID, UserEntity.COLUMN_USERNAME, UserEntity.COLUMN_FIRSTNAME,UserEntity.COLUMN_LASTNAME,...},
UserEntity.COLUMN_USERNAME + "=?",
new String[]{username},
null, null, null);
是否足以阻止SQL注入?或者我之前应该使用PreparedStatements吗?
答案 0 :(得分:1)
使用预准备语句的建议来自PHP,其中一些旧API不允许SQL参数(?
),除非使用预准备语句。
但参数和预备语句是正交概念。要防止注入(并避免字符串/ blob格式化问题),您只需要参数。 (并query()
为您提供。)
准备好的语句仅在您想多次执行时才有用。
(实际上,query()
确实在内部使用了预准备语句,但这是SQLite API的结果,对您来说无关紧要。)