2012-06-08 10 views
6

Mam pewien kod w języku Python, który ustawia wartość char (80) w sqlite DB.Ochrona przed iniekcją SQL w pythonie

Ciąg znaków jest uzyskiwany bezpośrednio od użytkownika za pośrednictwem pola wprowadzania tekstu i wysyłany z powrotem do serwera za pomocą metody POST w strukturze JSON.

Po stronie serwera aktualnie przekazuję ciąg do metody wywołującej operację SQL UPDATE.

Działa, ale mam świadomość, że w ogóle nie jest bezpieczny.

Spodziewam się, że strona klienta i tak nie jest bezpieczna, więc wszelkie zabezpieczenia należy umieścić po stronie serwera. Co mogę zrobić, aby zabezpieczyć operację UPDATE przed iniekcją SQL?

Funkcja, która "zacytowałaby" tekst, aby nie mógł pomylić parsera SQL, jest tym, czego szukam. Oczekuję takiej funkcji, ale nie mogę jej znaleźć.

Edit: Tutaj jest ustawienie mój bieżący kod char nazwa pola etykiety:

def setLabel(self, userId, refId, label): 
    self._db.cursor().execute(""" 
     UPDATE items SET label = ? WHERE userId IS ? AND refId IS ?""", (label, userId, refId)) 
    self._db.commit() 
+0

nie obsługuje pyton sparametryzowanych kwerend? –

+0

@Jeremy. Tak ... ale tak naprawdę to czy biblioteka Pythona dla konkretnej bazy danych obsługuje ją (którą AFAIK wszyscy robią). – Gerrat

+0

Tak. Rozważ więc moje pytanie jako pytanie, co robię, aby zapewnić ochronę przed wtryskiem sql. – chmike

Odpowiedz

7

Z dokumentacji:

con.execute("insert into person(firstname) values (?)", ("Joe",)) 

Ten ucieka "Joe", więc to, co chcesz

con.execute("insert into person(firstname) values (?)", (firstname_from_client,)) 
+0

Zaktualizowałem moje pytanie za pomocą kodu, którego obecnie używam. Zrobiłem to, jak sugerujesz. Czy to znaczy, że mój kod jest bezpieczny przed iniekcją SQL? – chmike

+0

Zapomniałem, że "ucieczka" oznacza zabezpieczenie przed wstrzyknięciem sql. Dałem ci odpowiedź z powodu przykładu. Dziękuję bardzo za podzielenie się swoją wiedzą i pomoc mi. – chmike

0

Nieee ... BIND użyć zmiennych! Po to tam są. Zobacz this

Inną nazwą tej techniki jest parameterized sql (Myślę, że "zmienne wiążące" mogą być nazwą używaną specjalnie w Oracle).

+0

Co to są zmienne BIND? Dowolny URL do zasugerowania? Dodaj odpowiedź. – chmike

+0

Pewnie ... z którego RDBMS korzystasz? – Gerrat

+0

Na razie używam sqlite. To jeszcze nie jest wersja produkcyjna mojej aplikacji internetowej. – chmike

1

Interfejs DB-API .execute() obsługuje substytucję parametrów, która zajmie się dla ciebie ucieczką, wspomniana w górnej części dokumentów; http://docs.python.org/library/sqlite3.html powyżej Nigdy tego nie rób - niezabezpieczony.

+0

Dziękujemy za referencje. Pamiętam, że czytałem to dawno temu i aplikuję od tamtej pory. Nie wiedziałem, że chroni mnie przed wstrzyknięciem SQL. To wspaniale. Zrobiłem to we właściwy sposób. Przepraszam, że nie dałem ci odpowiedzi. Martijn ma mniej punktów niż ty i podał przykład, który byłby przydatny dla osób takich jak ja, szukających odpowiedzi na to pytanie. – chmike

Powiązane problemy