2016-04-05 12 views
0

Ich verwende ActiveRecord::Base.sanitize Methode zu vermeiden SQL-Injektion Angriffe.Rails Sanitize-Methode hinzufügen doppelte Anführungszeichen

Mein Problem ist, wo immer ich Benutzereingaben bereinigen die Ausgabe wird mit zusätzlichen doppelten Anführungszeichen vor den einfachen Anführungszeichen am Anfang der Zeichenfolge und nach den einfachen Anführungszeichen am Ende der Zeichenfolge zurückgegeben.

Beispiel:

ActiveRecord::Base.sanitize("Test") 
=> "'Test'" 

Ich erwartete es "Test" oder 'Test' zurückzukehren. warum es zurückgeht "'Test'" ??

Danke, Sanjay Salunkhe

+0

Ich habe Ihren Code versucht und es gibt zurück, was Sie erwarten, 'ActiveRecord :: Base.sanitize (" Test ")' gibt ** 'Test' ** – Lymuel

+0

Nein, es funktioniert nicht für mich. Meine Rails-Version ist 4.1.7 und Ruby-Version ist Ruby 2.0.0p598 –

+0

@SanjaySalunkhe eigentlich seine veraltete, überprüfen Sie DOC: http://apidock.com/rails/ActiveRecord/Base/sanitize/class – 7urkm3n

Antwort

0

ActiveRecord::Base.sanitize ist veraltet und es ruft intern quote Methode:

def quote(value) 
    return value.inspect unless value.is_a? String 
    if value.include?("'") 
     value.inspect 
    else 
    "'#{value}'" 
    end 
end 

Dank der Kommentare von @ jeffdill2

Der Zweck sanitize Methode hinzufügen zusätzliche einfache Anführungszeichen, die injizierte SQL-Anweisungen unterbrechen würden, wenn solche vorhanden sind.

+0

Ich benutze Sanitize-Methode zu verhindern SQL-Injektion. Entfernen von Anführungszeichen wird funktionieren, aber ist dies ein guter Ansatz zu Sanitize-Methode verwenden, um SQL-Injektion zu vermeiden ?? –

+0

Ich weiß nicht, warum Sie 'ActiveRecord :: Base :: Sanitize 'benötigen, aber Sie können etwas tun, um SQL-Injektion zu vermeiden. ** Beispiel: ** Dieser 'User.where (" id = # {params [: id]} ") sollte' User.where ("id =?", Params [: id]) 'sein, um SQL-Injection zu vermeiden . – dp7

+0

ja du hast Recht. aber manchmal führe ich einfache sql-Abfrage aus, die ich Zeit verwenden muss, sanitize-Methode zu verwenden. –

1

sanitize funktioniert wie erwartet. Das Problem hier ist die Rails-Konsole:

ActiveRecord::Base.sanitize("Test") 
=> "'Test'" 
puts ActiveRecord::Base.sanitize("Test") 
'Test' 
=> nil 

Die Konsole automatisch das Ergebnis mit zusätzlichen "".

+0

Ich möchte den Wert nicht drucken. Ich möchte es in einer Variablen speichern. Wenn ich diesen Wert in einer Variablen speichere, funktioniert es nicht. –

+0

Ich verstehe das. Es wurde nur gezeigt, dass der Rückgabewert von 'sanitize' in diesem Beispiel 'Test' ** ist und nicht ** Test **, wie man es sich vorstellen kann. Dieses Token ** "Test" ** ist korrekt maskiert, solange SQL Server ausgeführt werden. Eine weitere Möglichkeit, dies zu überprüfen, ist 'ActiveRecord :: Base.sanitize ('Test'). Split ('')'.Es zeigt Ihnen alle individuellen Zeichen Ihrer Return-Zeichenfolge. – born4new

Verwandte Themen