Pytanie Jak uciec ciąg w Ruby, aby chronić przed SQL Injection? (Bez szyn)


Chciałem tylko wiedzieć, w jaki sposób możemy uniknąć zapytania SQL (napisu) w Ruby, aby zapobiec iniekcji SQL. Proszę zauważyć, że nie używam frameworka Rails.

Dzięki.


14
2018-02-08 22:50


pochodzenie




Odpowiedzi:


Jeśli to możliwe, skorzystaj z modułu Ruby DBI i zamiast próbować zacytować ciągi, użyj parametryzowanych przygotowanych zapytań, takich jak to:

dbh = DBI.connect("DBI:Mysql:test:localhost", "testuser", "testpass")
sth = dbh.prepare("INSERT INTO people (id, name, height) VALUES(?, ?, ?)")
File.open("people.txt", "r") do |f|
  f.each_line do |line|
    name, height = line.chomp.split("\t")
    sth.execute(nil, name, height)
  end
end

Cytowanie będzie dla ciebie właściwie potraktowane, a zastrzyki będą już przeszłością.

Edycja: Zauważ, że ten przykład pokazuje, że zero jest przekazywane jako pierwszy parametr do wykonania (). Odpowiada pierwszemu? w zapytaniu i jest tłumaczone na "NULL" przez moduł DBI. Pozostałe parametry są podobnie poprawnie cytowane i wstawiane do zapytania.


17
2018-02-08 23:13



Dlaczego warto wstawić pole identyfikatora? Przy normalnym projekcie byłby on automatycznie zwiększany. - Ryan Bigg
To tylko przykład. Ale zauważ, że pierwszy parametr do wykonania () jest po prostu zerowy, a odpowiadający mu parametr w zapytaniu (pierwszy znak zapytania) dotyczy id. "id" jest wstawiane jako NULL w tym przykładzie. - greyfade
Chciałem poznać to samo, co OP, ale chciałem po prostu napisać instrukcje SQL do pliku, więc domyślam się, że gotowe instrukcje są wtedy poza stołem? Czy mogę (ab) użyć .inspect dla ucieczki strun? - Jan


Nie musisz używać szyn, możesz po prostu require 'activerecord' i używaj go tak, jak na szynach (zdefiniuj modele i użyj ich). To, co tu robisz, to tylko ponowne wynalezienie koła.


3
2018-02-09 02:36





Napisz funkcję wee, aby cytować ciągi. Myślę, że Rails używa właśnie czegoś takiego:

def quote_string(v)
  v.to_s.gsub(/\\/, '\&\&').gsub(/'/, "''")
end

3
2018-03-08 14:54



Zobacz odpowiedź greyfade. Albo Andy Lester. To tylko zły pomysł. - James Moore
Czasami pracujesz nad jednorazowym skryptem migracji i nie masz zainstalowanych dodatkowych klejnotów (bez szyn lub dbi), a kiedy to się stanie, jest to skuteczne rozwiązanie. W praktycznie każdej innej sytuacji powinieneś używać przygotowanych oświadczeń. - Darren Greaves


Nie próbuj odkażać swoich danych. Użyj przygotowanych wyciągów. Zobacz też http://bobby-tables.com/ruby.html


1
2018-03-11 15:59