java - 使用 SQLitestatement bindstring 方法代替简单的字符串连接来执行 sql 语句有什么优点

标签 java android string sqlite android-sqlite

我想在 Android Studio 中的 SQLite 数据库的表中插入值。我想问我应该从下面给定的两种方法中选择哪种方法。 我从类(class)中学到了第一种方法,但我想使用第二种方法。这就是我问这个问题的原因

articleId、articleContent和articleTitle都是字符串类型。

如果可以的话,请说明每种方法的优缺点。如果您愿意,您可以建议其他方法。

String sql = "INSERT INTO articles (articleId, title, content) VALUES (?, ?, ?)";
SQLiteStatement statement = articlesDB.compileStatement(sql);
statement.bindString(1, articleId);
statement.bindString(2, articleTitle);
statement.bindString(3, articleContent);
statement.execute();

或者简单地使用字符串连接:

sqliteDatabase.execSQL("INSERT INTO articles (articleId, title, content) VALUES (" + articleId + ", " + articleTitle + ", " + articleContent + ")");

最佳答案

是的,始终建议使用bindString()来避免通过 SQL 注入(inject)对数据库进行可能的攻击。<​​/strong>

在您的特定情况下,似乎要插入的值仅来自您的代码,而不是来自任何动态输入源 - 例如用户输入。在这种情况下,使用您在问题中提到的任何方法都是安全的。

在您的情况下,您还可以使用 SQLiteDatabase 类中的 insert() 来代替字符串连接,这样不会出现任何语法错误:

SQLiteDatabase db = this.getWritableDatabase();
ContentValues values = new ContentValues();
values.put("articleId", articleId);
values.put("title", articleTitle);
values.put("content", articleContent);
db.insert("articles", null, values);

它返回新插入行的行 ID,如果发生错误,则返回 -1。

但是,如果您从用户输入中获取值,那么使用字符串连接会使您的数据库完全容易受到潜在攻击者的攻击。这就是为什么我们总是建议在需要传递值的地方使用SQLiteProgram类的bindString()方法来执行sql。

另一个原因是,bindString()可以调用java.lang.IllegalArgumentException。因此,使用此方法有助于异常处理和调试,以防发生语法错误。

关于java - 使用 SQLitestatement bindstring 方法代替简单的字符串连接来执行 sql 语句有什么优点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56504477/

相关文章:

java - 为什么 java.awt.Point 提供设置和获取 double 值的方法,但将 x 和 y 存储为 int 值?

java - java 中的 unsigned long,使用 BigInteger 进行算术运算,但 BigInteger.toByteArray 返回 14 个字节而不是 8 个字节

android - Android RSS 应用程序中的 NullPointerException

android - 确定点是否在多边形中

c# - 未找到 PWA 的 list JSON 404?

c++ - 具有低冲突率的 32 位整数的快速字符串散列算法

java - AsyncPlayerChatEvent,尝试查看字符串数组中的字符串是否包含在第二个字符串数组中的另一个字符串中

java - ConstraintLayout View 大小 - 与父级的比例

java - 尝试通过 minikube/traefik 访问本地 http ://sge-api. 时网关错误

python - 基于字符串创建新列