【问题标题】:SQL insertion protection using RMySQL使用 RMySQL 的 SQL 插入保护
【发布时间】:2014-07-31 00:54:40
【问题描述】:

我正在尝试使用RMySQL 对 SQL 选择语句实施 SQL 插入保护。我一直在尝试在每个风险字符前面添加一个转义字符(即反斜杠) - 即引号(“或')或反斜杠(\)。我正在使用 RMySQL 函数 dbEscapeStrings 这似乎是相似的到 PHP 的 mysql_real_escape_string 函数。

我怀疑我遗漏了一些非常明显的东西,但是由于 MySQL 要求 WHERE 语句中的字符串用引号括起来,使用 dbEscapeStrings 将转义字符应用于 select 语句中的引号会引发错误,阻止所有字符串查询,而不仅仅是注入攻击。例如,

user <- "'peter'"
tmp <- sprintf("select * from users where username = %s", user)
sql <- dbEscapeStrings(con, tmp)
dbGetQuery(con, sql)

dbEscapeStrings 在每个引号前插入一个双反斜杠(即生成的 sql 变量是 "select * from users where username = \\'peter\\'"),这会引发语法错误dbGetQuery 运行时的 MySQL 服务器。

关于如何使上述工作或使用 RMySQL 实现替代 SQL 插入保护的任何建议表示赞赏? RMySQL 是否提供了使用准备好的语句来防止插入攻击?

【问题讨论】:

  • 试试mysqlExecStatement(con, tmp, user),然后是mysqlFetch(dbListResults(con)[[1]])。我的建议是基于我对 RPostgreSQL 所做的。
  • 感谢@Alex 对准备好的声明的建议。它运作良好。我还为转义字符制定了一个解决方案 - 我知道我遗漏了一些简单的东西 - 将 dbEscapeStrings 应用于“user”,而不是“tmp”,然后将单引号添加到“user”。
  • @Alex 我强烈建议您使用标准的数据库泛型 - mysqlExecStatement() 不应该被导出,并且将在下一个版本中取消
  • 谢谢。什么是标准 db 泛型?

标签: mysql r rmysql


【解决方案1】:

最安全(也是最简单)的方法是使用参数化查询(这在 CRAN 版本中不可用,但在开发版本中)

dbGetQuery(myconnection, "SELECT * FROM users WHERE username = ?", list(user))

【讨论】:

    猜你喜欢
    • 2016-05-31
    • 1970-01-01
    • 2014-10-29
    • 2017-05-17
    • 2015-08-20
    • 2017-04-22
    • 1970-01-01
    • 2019-05-25
    • 1970-01-01
    相关资源
    最近更新 更多