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
Odpowiedz
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();
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.
użyć przygotowanych sprawozdań zastępcze dla tego produktu. Zobacz http://download.oracle.com/javase/tutorial/jdbc/basics/prepared.html
Podobnie jak zalecana w PHP: http://php.net/manual/en/pdo.prepared-statements.php
Znaczy nie wykroczenie, gdy mówię, że tylko idioci użyłby mysql_real_escape_string
przyjęciem sprawozdania przygotowanego symbolami.
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.
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:
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.
- 1. JAVA Przeciążenie obiektu/łańcucha znaków
- 2. czyszczenie tablicy znaków c
- 3. Java, sposób dzielenia łańcucha znaków z przesunięciem
- 4. Niepoprawna długość łańcucha znaków
- 5. Tworzenie instancji z łańcucha znaków w języku Java
- 6. Klucz z łańcucha znaków w języku Java RSA
- 7. Jak usunąć znak nienumeryczny z łańcucha znaków w java?
- 8. Konwersja łańcucha znaków na tablicę "Character" w języku Java
- 9. Dzielenie łańcucha znaków w Javie
- 10. długość łańcucha znaków facebook
- 11. Metoda łańcucha znaków Ormlite?
- 12. Java/Android - sprawdzanie poprawności łańcucha znaków JSON względem schematu String
- 13. Wyszukaj i zamień sformatowane właściwości wewnątrz łańcucha znaków Java
- 14. Dołącz jeden znak do łańcucha znaków lub tablicy znaków w java?
- 15. Jak zapobiegać internowaniu łańcucha znaków?
- 16. numpy tablica znaków do łańcucha
- 17. Wstrzykiwanie łańcucha znaków do 'cin'
- 18. Jak dołączyć "do łańcucha znaków
- 19. Przekierowanie cin do łańcucha znaków
- 20. Prosty skrót MD5 łańcucha znaków
- 21. Definiowanie łańcucha znaków ENUM w VB.Net
- 22. Podział łańcucha na parę znaków w Ruby
- 23. Znajdowanie ostatniego indeksu łańcucha znaków w Oracle
- 24. Zmiana kolumny z łańcucha znaków na ciąg znaków w postgresql
- 25. Czyszczenie szumu ze śladu stosu Java
- 26. Długość łańcucha w pikselach w języku Java
- 27. Wytnij ciąg znaków Java o pewnej liczbie znaków
- 28. zwracając wskaźnik do literowej (lub stałej) tablicy znaków (łańcucha znaków)?
- 29. Dekodowanie łańcucha JSON w języku Java
- 30. C# Do-Loop nie dodaje znaków do łańcucha znaków
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
** 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) –