Что такое хороший метод в Ruby для предотвращения Внедрения SQL?
в прямом рубине? используйте подготовленные операторы:
require 'mysql'
db = Mysql.new('localhost', 'user', 'password', 'database')
statement = db.prepare "SELECT * FROM table WHERE field = ?"
statement.execute 'value'
statement.fetch
statement.close
Не только в Ruby - свяжите параметры (будь то в базе данных или в коде клиента).
-121--4690663-Кажется, что это простая замена:
$ d='\n'
$ echo "a*DIVIDER*b" | sed "s/\*DIVIDER\*/$d/"
a
b
Может быть, я не понимаю, чего вы пытаетесь достичь.
Тогда, может быть, этот шаг может занять место последних двух ваших:
sed -n ":a;$ {s/\n/$DIVIDER/g;p;b};N;ba"
Обратите внимание на пространство после знака доллара. Она не позволяет оболочке интерпретировать «$ {s»... как имя переменной.
И как ghostdog74 , вы путями слишком много вызовов sed
. Вы можете изменить множество символов трубы на обратную косую черту (продолжение линии) и удалить «sed» из всех, кроме первого (оставьте «-e» везде). (непроверено)
Проверьте руководство, которое у них есть по этому вопросу: http://guides.rubyonrails.org/security.html#injection
В основном, вы хотите использовать переменные привязки в ваших моделях для поиска данных, а не встроенных параметров.
Model.find(:first, :conditions => ["login = ? AND password = ?", entered_user_name, entered_password])
Вы печатаете неподписанное значение как подписанное? При дополнении двумя значение с самым значительным битовым набором будет напечатано как отрицательное. Попробуйте% u для неподписанных
-121--4577915-% ld или% lu в зависимости от требуемой длины.
-121--4577916-Не только в Ruby - свяжите параметры (будь то в базе данных или в коде клиента).