sql >> Database >  >> RDS >> PostgreSQL

Rails 5 SQL-injectie

Gebruik quote is veilig. Ik las de antwoorden op de pagina waarnaar je hebt gelinkt , en ik zie niemand dat quote zeggen is onzeker. Ik zie uw vraag over het gebruik van "aanhalingstekens". Ja, als je gewoon aanhalingstekens om een ​​string zet, is dat onveilig, bijvoorbeeld:

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

Maar met behulp van quote (de methode) is prima:

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

Je zou op de console kunnen spelen en je best kunnen doen om het te breken, maar ik denk niet dat je in staat zult zijn om:

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

Als het je lukt, wil het Rails-team dat vast graag (privé) weten! Maar zoals je kunt zien, de quote methode doet meer dan een aanhalingsteken aan het begin en einde plakken.

En aangezien u zegt dat u op zoek bent naar een gezaghebbende bronvermelding, suggereren de opmerkingen in de broncode zelf dat het citeren van gebruikersinvoer het beoogde doel van deze functies is:

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:

(Let op:ik laat quote_string zien voor de opmerking, maar je zou waarschijnlijk quote moeten gebruiken , die probeert het gegevenstype te achterhalen en iets passends te doen.)

Trouwens, hier is een soortgelijke vraag als de jouwe, met een antwoord van mij in 2014, en ook enkele alternatieven:Een onbewerkte update sql uitvoeren met dynamische binding in rails




  1. Opgeslagen procedures/DB-schema in broncodebeheer

  2. Opgeslagen procedure blijft schijnbaar zonder uitleg hangen

  3. Is het mogelijk om retour in opgeslagen procedure te gebruiken?

  4. Hoe vind je niet-bestaande gegevens uit een andere tabel met JOIN?