0

Bin ein Sicherheits-Enthusiast und insgesamt Noob RoR. Jetzt gibt es diesen Blog, auf den ich in Bezug auf SQL-Injektionen in RoR mit Active Records stieß.dynamische attributbasierte Finder im aktiven Datensatz 3.2.10

SQLi in RoR Active Records

jedoch das Blog selbst zu Jan stammt aus 2013. Trotzdem habe ich versucht, die SQLi in einer Testumgebung mit Rails 4.2 und 4.2 Active zu replizieren.

Ich habe versucht, mit:

User.find_by_name("kotori", :select => "id, name") 

aus dem Blog oben, aber ich erhielt die folgende Fehlermeldung:

ArgumentError: wrong number of arguments (2 for 1)

Denkprozess: Da das Blog ziemlich alt ist, kann es ein veraltetes Feature gemäß meiner Testeinrichtung. Jetzt war der Blog vom 13. Januar, also nahm ich den aktiven Rekord Build von Dezember 2012 von here dachte, dass das Code-Snippet oben wird definitiv funktionieren zumindest in dieser Version, aber der Fehler war der gleiche. Darüber hinaus habe ich auch versucht, die Dokumentation der gleichen here durchzugehen, aber dies gibt auch keinen Einblick in das betreffende Code-Snippet.

Nun, was fehlt mir hier? Ist der oben erwähnte Blog selbst nicht vertrauenswürdig oder ist er wirklich dumm?

Antwort

1

Ich bin ziemlich sicher, dass die :select => "id, name" Optionen zuletzt in Rails 2.3, vor einigen Jahren gesehen wurden. Community-Support (und etwaige Sicherheitsupdates) für 2.3 endete vor etwa 3 Jahren, fast zur gleichen Zeit, als der referenzierte Artikel geschrieben wurde, als Rails 4.0 veröffentlicht wurde.

Die Information war zu der Zeit nicht nur sehr gut bekannt, sondern wurde bereits 3 Jahre vor dem Artikel aus Rails 3.0 entfernt. Also verwendete der Autor einige ziemlich überholte Informationen, um den Artikel zu unterstützen. Dort waren definitiv noch Seiten 2.3 dann laufen, weil da noch sind (siehe SO question from yesterday). Beim Lesen des Artikels war es im Wesentlichen sachlich; Allerdings verwendete es schnell alternde Informationen, um wichtige Punkte zu finden, identifizierte sie jedoch nicht als solche.

Auf zu den modernen Zeiten. Sie können immer noch das gleiche Ziel erreichen, aber jetzt erfordert es andere Mittel. pluck ermöglicht es Ihnen, bestimmte Spalten (zB nur die id und name Felder) effizient wie so wählen:

User.where(name: 'kotori').pluck(:id, :name) 

Dies wird eine optimierte SQL-Anweisung erzeugen, und darüber hinaus, da es kein SQL-Schnipsel auf die Abfrage übergeben werden Engine, keine Möglichkeit zur SQL-Injektion. Sicherheit hat seit einiger Zeit oberste Priorität in der Rails-Community, und das ist gut so.

1

find_by_name erwartet nur ein Argument, und das ist name des Objekts, das Sie finden möchten. Und es wird Ihnen ein Objekt zurückgeben, auf dem Sie andere Methoden aufrufen können.

Andere Sache: find_by_name gibt nur einen einzelnen Datensatz, so können Sie dies tun:

User.where(name: 'kotori').pluck(:id, :name) 

Hinweis: Da find_by_name kehrt ein Beispiel können Sie nicht pluck auf das nennen.

+0

Der oben erwähnte Blog sagt, dass es möglich ist, etwas in der Form zu tun: User.find_by_name ("kotori",: select => "id, name") Interpretiere ich es falsch? – qre0ct