Ruby on Rails: Как санировать строку для SQL если не с помощью, находят?

Я пытаюсь санировать строку, которая включает ввод данных пользователем, не имея необходимость обращаться к ручной обработке моего собственного возможно багги regex, если это возможно, однако, если бы это - единственный способ, которым я также ценил бы, если кто-либо может указать на меня в правильном направлении к regex, который вряд ли будет пропускать что-либо. Существует много методов в направляющих, которые могут позволить Вам входить в собственные команды SQL, как люди выходят из ввода данных пользователем для тех?

Вопросом, который я задаю, является широкий, но в моем особом случае, я работаю со столбцом в своей базе данных Postgres, которую исходно не понимают направляющие насколько я знаю, tsvector, который содержит информацию поиска простого текста. Направляющие могут записать и читать из него, как будто это - строка, однако, в отличие от строки, это, кажется, автоматически не выходит из него, когда я делаю вещи как вектор = в модели.

Например, когда я делаю model.name = '::', где имя является строкой, оно хорошо работает. Когда я делаю model.vector = '::' это ошибки:

ActiveRecord::StatementInvalid: PGError: ERROR:  syntax error in tsvector: "::"
"vectors" = E'::' WHERE "id" = 1

Это, кажется, проблема, вызванная отсутствием выхода точек с запятой, и я могу вручную установить вектор = '::' прекрасный.

У меня также была прекрасная идея, возможно, я могу просто назвать что-то как:

ActiveRecord::Base.connection.execute "UPDATE medias SET vectors = ? WHERE id = 1", "::"

Однако этот синтаксис не работает, потому что необработанные команды SQL не имеют доступа к методу находки выхода и ввода строк при помощи? метка.

Это кажется мне той же проблемой звонящий connection.execute с любым типом ввода данных пользователем, как все это сводится к очистке строк, но я, может казаться, не нахожу способа вручную назвать строковые методы санитизации SQL направляющих. Кто-либо может предоставить консультацию?

12
задан William Jones 23 March 2010 в 05:50
поделиться

1 ответ

Добавьте этот метод в свою модель:

class Media < ActiveRecord::Base
  def self.execute_sql(*sql_array)     
    connection.execute(send(:sanitize_sql_array, sql_array))
  end
end

Теперь вы можете выполнить любой SQL, например:

Media.execute_sql('UPDATE medias SET vectors = ? WHERE id = 1', '::')

Ссылка

1) sanitize_sql_array

16
ответ дан 2 December 2019 в 20:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: