Я пытаюсь реализовать защиту от вставки SQL в операторы выбора SQL, используя RMySQL
. Я пытался добавить escape-символ (т. е. обратную косую черту) перед каждым символом риска, т. е. кавычку ("или") или обратную косую черту (\). Я использую функцию RMySQL, dbEscapeStrings
, которая похожа на функцию PHP. mysql_real_escape_string
функция.
Я подозреваю, что упускаю что-то очень очевидное, но, поскольку MySQL требует, чтобы строки символов в операторе WHERE были заключены в кавычки, использование dbEscapeStrings
для применения escape-символов к кавычкам в операторе 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\\'"), что вызывает синтаксическую ошибку на сервере MySQL. при запуске dbGetQuery
.
Любые предложения о том, как заставить работать вышеперечисленное или реализовать альтернативную защиту от вставки SQL с помощью RMySQL? Предусматривает ли RMySQL использование подготовленных операторов, которые могут предотвратить атаки вставкой?
mysqlExecStatement(con, tmp, user)
, а затемmysqlFetch(dbListResults(con)[[1]])
. Я предлагаю это на основе того, что я делаю с RPostgreSQL. - person Alex   schedule 31.07.2014dbEscapeStrings
к пользователю, а не к tmp, и перед добавлением одинарных кавычек к пользователю. - person user2500880   schedule 01.08.2014mysqlExecStatement()
никогда не следовало экспортировать, и в следующей версии они будут устранены. - person hadley   schedule 25.02.2015