PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Rails 5 SQL инжектиране

Използване на quote безопасно е. Прочетох отговорите на страницата, към която сте се свързали и не виждам някой да казва този quote е несигурен. Виждам въпроса ви относно използването на "кавички". Да, ако просто поставите кавички около низ, това е несигурно, напр.:

q = "SELECT * FROM users where email = '#{params[:email]}'"

Но използвайки quote (методът) е наред:

q = "SELECT * FROM users where email = #{connection.quote(params[:email])}"

Можете да си поиграете в конзолата и да опитате всичко възможно да я разбиете, но не мисля, че ще можете:

2.3.3 :003 > ActiveRecord::Base.connection.quote("f''oo")                                                                              
 => "'f''''oo'"

Ако успеете, сигурен съм, че екипът на Rails би искал да знае (частно)! Но както виждате, quote метод прави нещо повече от поставяне на цитат в началото и в края.

Освен това, тъй като казвате, че търсите авторитетен цитат, коментарите в самия изходен код предполагат, че цитирането на въведени от потребители е предвидената цел на тези функции:

https:/ /github.com/rails/rails/blob/2471e6391dfe71cfbb8621bdf573729d961d3209/activerecord/lib/active_record/connection_adapters/abstract/quoting.rb#L6-L13

# Quotes the column value to help prevent
# {SQL injection attacks}[http://en.wikipedia.org/wiki/SQL_injection].
def quote(value)

https:/ /github.com/rails/rails/blob/0f1d0b1b5254e3678abaabbebb3362a100c10262/activerecord/lib/active_record/connection_adapters/postgresql/quoting.rb#L17-L20

# Quotes strings for use in SQL input.
def quote_string(s) #:nodoc:

(Имайте предвид, че показвам quote_string за коментара, но вероятно трябва да използвате quote , който се опитва да разбере типа данни и да направи нещо подходящо.)

Между другото, ето въпрос, подобен на вашия, с отговор от мен през 2014 г., както и някои алтернативи:Как да изпълня необработена актуализация на sql с динамично обвързване в rails




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Защо JSON null не се прехвърля към SQL null в postgres?

  2. Активен запис:JSON заявка

  3. Избиране на записи между два времеви клейма

  4. Как да наблюдавате PostgreSQL, работещ вътре в Docker контейнер:Част първа

  5. не е намерен пул за свързване с първичен