2011-07-11 17 views
9

Czy istnieje funkcja lub biblioteka, której można użyć do czyszczenia danych wprowadzanych przez użytkownika. Na przykład, jeśli użytkownik wprowadzi tekst o nazwie baily's, powinienem uciec przed ' przed wysłaniem go do zapytania mysql. Podobnie powinienem móc filtrować puste znaki i \ n, \ t, \ r itd. Podobnie jak w PHP mamy mysql_real_escape_string($input) czy jest coś w Javie, aby to zrobić?Czyszczenie łańcucha znaków w java

+0

Jeśli używasz warstwy ORM (która jest powszechną praktyką w Javie) lub nawet tylko instrukcji o nazwanych lub wyliczonych parametrach, to uniknięcie parametrów SQL zostanie wykonane automatycznie. Dopóki nie będziesz ręcznie łączyć łańcuchów w celu tworzenia zapytań, powinieneś być bezpieczny. – aroth

+1

** Zobacz także: ** ['JDBC - jak uniknąć parametrów dostarczanych przez użytkownika za pomocą zapytania sql] (http://stackoverflow.com/questions/4954002/jdbc-how-to-escape-user-supplied- parametry-z-zapytaniem-sql) –

Odpowiedz

11

W Javie zazwyczaj nie robisz tego ręcznie.

Zamiast tego należy użyć PreparedStatement i przekazać dowolne argumenty do instrukcji SQL za pomocą jawnych metod setString() lub setObject().

W ten sposób sterownik JDBC poradzi sobie z tym (wykonując niezbędne przekształcenie lub wysyłając instrukcję SQL osobno z argumentów, w zależności od bazy danych).

Na przykład, kod może wyglądać tak (za pomocą prepareStatement()):

Connection c = ...; // get Connection from somehwere 
PreparedStatement stmt = c.prepareStatement("SELECT * FROM BOOKS WHERE TITLE = ?"); 
stmt.setString(1, userInput); 
ResultSet result = stmt.executeQuery(); 
2

Powinieneś użyć PreparedStatement i ustawić wartości $input używając funkcji setString.

Powodem używania PreparedStatement jest to, że każda baza danych może potrzebować ucieczki od różnych rzeczy. Ta złożoność jest ukryta w konkretnej implementacji PreparedStatement dostarczonej przez dostawcę bazy danych.

1

Stosowane przecięcie jest specyficzne dla systemu, dla którego chcesz użyć łańcucha. Jeśli używasz MySQL, musisz wykonać różne operacje ucieczki, niż jeśli chcesz użyć łańcucha znaków w kodzie JavaScript.

Aby odpowiedzieć na Twoje pytanie, musimy wiedzieć, w jaki sposób chcesz uciec przed ciągiem znaków. Istnieje duża szansa, że ​​nie będziesz musiał uciekać z ciągu, zanim użyjesz go w kontekście bazy danych. Na przykład, jeśli używasz prepared queries, nie musisz uciekać od swoich wartości.

2

Krótka odpowiedź, nie, z wyjątkiem bardzo szczegółowych definicji "czystych". Teraz musisz użyć rozwiązania specyficznego dla danego języka - w przypadku SQL wystarczy użyć przygotowanej instrukcji.

Dłuższa odpowiedź: niedawno przeprowadzono prace nad automatycznymi środkami do odświeżania napisów, które pomagają w prawidłowym wprowadzaniu treści w postaci zwykłego tekstu do treści w innych językach.

Automatyczne kontekstowe auto-uciekinierów istnieć w językach HTML szablonu jak Soy, Go, wariant jQuery, cTemplates Clearsilver i mam nadzieję, inni wkrótce.

Trwają badania nad uogólnieniem tego, aby można go było łatwo rozszerzyć na inne języki. Jednym z pomysłów, nad którym pracuję, jest stosowanie opisanej gramatyki opisującej język docelowy, taki jak SQL, i wykrycie, co należy zrobić, aby uzyskać luki, które można wypełnić danymi użytkownika.

Biorąc gramatyki jak poniżej, który zawiera adnotacje, które pokazują, w jaki sposób struktura map danych do podciągów w języku:

JSONValue   := JSONNullLiteral 
         | JSONBooleanLiteral 
         | JSONObject 
         | JSONArray 
         | JSONString 
         | JSONNumber         ; 
JSONObject   := @KeyValueMap ([{] JSONMemberList? [}])  ; 
JSONMemberList  := JSONMember ([,] JSONMemberList)?    ; 
JSONMember   := @Key JSONString [:] @Value JSONValue   ; 
JSONNullLiteral  := @ValueNull "null"        ; 
JSONBooleanLiteral := @ValueFalse "false" | @ValueTrue "true"  ; 
JSONArray   := @List("[" (JSONValue ([,] JSONValue)*)? "]") ; 
JSONString   := @String ([\"] JSONStringCharacters? [\"])  ; 
JSONNumber   := @Number (Sign? (Mantissa Exponent? | Hex)) ; 
JSONStringCharacters := JSONStringCharacter JSONStringCharacters?  ; 
JSONStringCharacter := @Char ([^\"\\\x00-\x1f]) 
         | JSONEscapeSequence       ; 
JSONEscapeSequence := "\\" @Char [/\\\"] 
         | @Char{[\x08]} "\\b" 
         | @Char{[\x0c]} "\\f" 
         | @Char{[\x0a]} "\\n" 
         | @Char{[\x0d]} "\\r" 
         | @Char{[\x09]} "\\t" 
         | @Char ("\\u" @Scalar (hex hex hex hex))  ; 
Mantissa    := (Integer ([.] Fraction?) | [.] Fraction)  ; 
Exponent    := [Ee] Sign? decimal+       ; 
Integer    := [0] | [1-9] [0=9]*       ; 
Fraction    := [0-9]+          ; 
Hex     := [0] [Xx] hex+         ; 
Sign     := [+\-]           ; 

możemy zbudować machiny państwowej jak poniżej:

enter image description here

Konwertuje sekwencje zdarzeń (start, start_object, start_key, znak 'x', ...) na instrukcje, które kodują znaki na buforze.

Z tego automatu stanów możemy również generować ogólne ślady instrukcji do generowania wydajnego kodu dla enkoderów i, mam nadzieję, algorytmy analizy kontekstu, które sprawdzają, które enkodery zastosować, kiedy.

Jeśli to zadziała, to ułatwiają włączenie do języków programowania ogólnego przeznaczenia, mechanizmy automatycznie & bezpiecznie komponowania treści w językach takich jak SQL, HTML, itp Z poprawek do definicji językowych, aby umożliwić execute_query znaleźć granice między treścią określoną przez programistę a zawartością wtrysku pod numerem execute_query("SELECT * FROM Table WHERE ID=$ID") i wykorzystywać te, aby automatycznie uciec przed wstrzykniętą treścią, możemy sprawić, aby ten idiom działał tak, jak chce programista.

Powiązane problemy