【发布时间】: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 泛型?