2015-08-19 21 views
6

Zacząłem migrować plik commons.lang 2 do pliku commons.lang3.Migrowanie StringEscapeUtils.escapeSql z commons.lang

Według https://commons.apache.org/proper/commons-lang/article3_0.html

StringEscapeUtils.escapeSql

Był to sposób mylący, tylko obsługa najprostszych możliwych przypadków SQL. > Ponieważ SQL nie jest obiektem zainteresowania Lang'a, utrzymanie tej metody nie ma sensu.

Zrozum, ale co jest zalecane zamiast tego?

Wyjaśnienie

można polecić osobom trzecim, które wykonują proste escapeSql podobny do StringEscapeUtils.escapeSql?

+0

Opisz swój przypadek. Najprostszym z nich byłby "uruchamianie zapytań do bazy danych", a do tego zwykle nie trzeba uciec od żadnego SQL (można i powinieneś używać zmiennych bind). – Thilo

+0

Dodatkowe wyjaśnienie – Michael

+0

Dlaczego chcesz to zrobić? To wygląda na zły pomysł, więc mogę zrozumieć, dlaczego metoda została usunięta. – Thilo

Odpowiedz

9

From the Javadocs:

Obecnie metoda ta okazuje wyłącznie do jednorazowego cytaty język podwoiła pojedynczych cudzysłowach ("McHale za Navy" => "McHale 's Navy").

To był kod metoda:

/** 
675   * <p>Escapes the characters in a <code>String</code> to be suitable to pass to 
676   * an SQL query.</p> 
677   * 
678   * <p>For example, 
679   * <pre>statement.executeQuery("SELECT * FROM MOVIES WHERE TITLE='" + 
680   * StringEscapeUtils.escapeSql("McHale's Navy") + 
681   * "'");</pre> 
682   * </p> 
683   * 
684   * <p>At present, this method only turns single-quotes into doubled single-quotes 
685   * (<code>"McHale's Navy"</code> => <code>"McHale''s Navy"</code>). It does not 
686   * handle the cases of percent (%) or underscore (_) for use in LIKE clauses.</p> 
687   * 
688   * see http://www.jguru.com/faq/view.jsp?EID=8881 
689   * @param str the string to escape, may be null 
690   * @return a new String, escaped for SQL, <code>null</code> if null string input 
691   */ 
692  public static String escapeSql(String str) { 
693   if (str == null) { 
694    return null; 
695   } 
696   return StringUtils.replace(str, "'", "''"); 
697  } 

Więc można łatwo zastąpić metodę z prostego wywołania String#replace.

Istnieje jednak przyczyna, dla której metoda została usunięta. Było naprawdę niedopieczone i nie mogę wymyślić dobrego powodu, dla którego chciałbyś go użyć. Aby na przykład uruchamiać zapytania JDBC, możesz i powinieneś używać zmiennych wiążących zamiast próbować interpolować i unikać literałów łańcuchowych.

+1

W rzeczywistości istnieje przypadek użycia: wymykające się części instrukcji SQL, których nie można sparametryzować za pomocą zmiennych wiązania. Na przykład. sama nazwa stołu: http://stackoverflow.com/q/1208442/274677 –

+0

@MarcusJuniusBrutus: Nie liczę na to, że te same reguły ucieczki będą tam używane. A jeśli użyjesz rzeczy takich jak spacje lub cudzysłowy w nazwach obiektów schematu, będziesz proszony o kłopoty. – Thilo

2

W przypadku korzystania z połączenia JDBC, przygotowując oświadczenie o parametrach takich jak:

con.prepareStatement("INSERT INTO table1 VALUES (?,?)"); 
pstmt.setInt(1, 200); 
pstmt.setString(2, "Julie"); 
pstmt.executeUpdate(); 

nie trzeba uciekać żadnych elementów, które wstawiają za pomocą funkcji na przygotowanym oświadczeniu. Te są automatycznie usuwane.

to zostało odebrane przed w: Java - escape string to prevent SQL injection

2

Istnieje API przez OWASP nazywa ESAPI który zapewnia niektóre z tych funkcji, można to sprawdzić.