sql >> Databáze >  >> RDS >> PostgreSQL

Rails 5 SQL Injection

Pomocí quote je bezpečný. Odpovědi jsem četl na stránku, na kterou jste odkazovali a nevidím nikoho, kdo by řekl tuto quote je nejistý. Vidím vaši otázku ohledně používání „uvozovek“. Ano, pokud řetězec pouze vložíte do uvozovek, není to bezpečné, např.:

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

Ale pomocí quote (metoda) je v pořádku:

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

Mohli byste si hrát v konzoli a snažit se ji ze všech sil rozbít, ale nemyslím si, že budete schopni:

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

Pokud uspějete, jsem si jistý, že tým Rails by to rád věděl (soukromě)! Ale jak vidíte, quote metoda umí víc než jen nalepit uvozovku na začátek a konec.

Také, protože říkáte, že hledáte autoritativní citaci, komentáře ve zdrojovém kódu naznačují, že zamýšleným účelem těchto funkcí je citování uživatelských vstupů:

https://github.com/rails/rails/blob/2471e6391dfe71cfbb8621bdf573729d961d3209/activerecord/lib/active_record/connection_adapters/quoters/Lrbstract3 /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)

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

(Všimněte si, že zobrazujem quote_string pro komentář, ale pravděpodobně byste měli použít quote , který se snaží zjistit datový typ a udělat něco vhodného.)

Mimochodem, zde je podobná otázka jako vaše, s odpovědí ode mě v roce 2014 a také s některými alternativami:Jak spustit nezpracovaný aktualizační SQL s dynamickou vazbou v rails




  1. Jak zabránit tomu, aby se na webových stránkách objevovaly podivné postavy

  2. Hibernate + MySQL + rewriteBatchedStatements=true

  3. Jak zlepšit výkon dílčího dotazu?

  4. Použití podmínky If v klauzuli where