首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >使用SQLitestatement bindstring方法而不是简单的字符串连接来执行sql语句有什么好处?

使用SQLitestatement bindstring方法而不是简单的字符串连接来执行sql语句有什么好处?
EN

Stack Overflow用户
提问于 2019-06-08 07:38:05
回答 1查看 661关注 0票数 1

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

articleId、articleContent和articleTitle都是string类型。

如果您需要的话,请指定每种方法的优缺点,如果can.You可能建议另一种方法。

代码语言:javascript
代码运行次数:0
运行
复制
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();

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

代码语言:javascript
代码运行次数:0
运行
复制
sqliteDatabase.execSQL("INSERT INTO articles (articleId, title, content) VALUES (" + articleId + ", " + articleTitle + ", " + articleContent + ")");
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-06-08 07:52:25

是的,建议始终使用bindString() ,以避免通过SQL注入在数据库中进行攻击。

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

在您的示例中,您也可以使用来自insert()SQLiteDatabase类来代替字符串连接,这是安全的,不会出现任何语法错误:

代码语言:javascript
代码运行次数:0
运行
复制
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类的SQLiteProgram方法来执行我们需要传递值的sql。

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56504477

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档