Rails и SQL-инъекция: это безопасно? - PullRequest
1 голос
/ 03 декабря 2011
@usersfound = User.find_by_sql(["

SELECT * from users where name @@ plainto_tsquery('english', ?) LIMIT 20 offset ?

  ",@query,@offset])

См. Выше, это безопасно от инъекций sql? Я очень новичок в выполнении прямых команд sql для базы данных в rails. (Я знаю, что могут быть другие способы сделать этот СПЕЦИАЛЬНЫЙ запрос, но мне интересно, если в целом, использование find_by_sql и такого рода вставки vars безопасно - у меня есть несколько сложных запросов с подвыборками и объединениями, которые действительно возможно сделать с ActiveRecord.

Спасибо.

Ответы [ 2 ]

2 голосов
/ 03 декабря 2011

Да, это должно быть безопасно. Если вы проследите код, вы обнаружите, что ваш find_by_sql вызов в итоге вызовет PGconn#send_query_prepared с параметрами привязки, которые переносятся как багаж; метод send_query_prepared является просто оболочкой для вызова API PQsendQueryPrepared в libpq:

static VALUE
pgconn_send_query_prepared(int argc, VALUE *argv, VALUE self)
{
    /* ... bunch of boiler plate marshalling stuff ... */
    result = PQsendQueryPrepared(conn, StringValuePtr(name), nParams, 
        (const char * const *)paramValues, paramLengths, paramFormats, 
        resultFormat);
    /* ... */
}

Параметры привязки заканчиваются на paramValues. Так что у вас все должно быть хорошо, если только нет ошибок в обработке операторов, подготовленных в библиотеке C PostgreSQL.

1 голос
/ 03 декабря 2011

Вставка динамических значений в запрос с использованием параметров запроса безопасна.

Но это зависит от того, является ли Rails «подделкой» параметров запроса, и на самом деле объединяет @query и @offset в строку SQL перед подготовкойзаявление.Тогда это будет так же безопасно, как и реализация перехода в Rails.

...