我对java还是有点陌生,正在尝试将数据插入数据库。我在插入包含的字符串时出错,因此我的最终结果将是转义撇号。我怎样才能做到?
krcsximq1#
问题不在于java,而在于底层数据库。很可能您将参数串在一起,如下所示:
String sql = "select * from sometable where somefield = " + someObject.getSomeField();
别那么做。改用preparedstatement。如果这是一个必须关注这些事情的应用程序,那么它还有防止sql注入攻击的额外优势。
kse8i1jr2#
使用stringescapeutils:
StringEscapeUtils.escapeSql(yourstring);
注意:从commons lang 3.0开始:stringescapeutils.escapesql这是一种误导性的方法,只处理最简单的sql案例。由于sql不是lang的重点,所以维护这个方法是没有意义的。
mxg2im7a3#
我假设您使用的是java.sql.statement,并使用字符串调用executequery方法。这很糟糕,因为可以进行sql注入。您应该改用java.sql.preparedstatement,然后可以将任何字符串设置为参数,这样就不会有问题了。例如:
PreparedStatement pstmt = con.prepareStatement("UPDATE MY_TABLE SET TEXT_FIELD = ?"); pstmt.setString(1, "any String 'will work here!");
czfnxgou4#
使用reflect util类自动引用转义撇号。很快我将分享整个图书馆。
/** * An automated Sql Escape Apostrophe before preparing an Object as Sql insert * query * * @param obj * @return List of all field's values as string type */ public static Object escapeSql_Apostrophe(Object obj) { List<Field> fields = getDeclaredFields(obj); for (Field field : fields) { field.setAccessible(true); // Additional line String val = new String(); // System.out.println("type : " + field.getType().getSimpleName()); if (isPredfinedObject(field)) { try { val = field.get(obj) + ""; if (val.contains("'")) { val = val.replaceAll("'", "''"); String type = field.getType().getSimpleName(); if (type.equals(String.class.getSimpleName())) { field.set(obj, val); } if (type.equals(Character.class.getSimpleName())) { field.setChar(obj, val.charAt(0)); } } } catch (IllegalArgumentException | IllegalAccessException e) { e.printStackTrace(); } } else { try { System.out.println(field.get(obj)); System.out.println(getAllFieldsValues(field.get(obj))); continue; } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } } } return obj; }
dddzy1tm5#
这取决于您使用的数据库。通常情况下,''是有效的(我对sql server只有第一手的知识)。你在用什么数据库?
j1dl9f466#
取决于数据库,但您可以在sqlserver中使用“”。编辑:在mysql中,可以使用双撇号或反斜杠:http://www.faqts.com/knowledge_base/view.phtml/aid/630
p5fdfcr17#
使用事先准备好的陈述。除了处理任何特殊字符外,它们更健壮,有助于防止sql注入攻击。
7条答案
按热度按时间krcsximq1#
问题不在于java,而在于底层数据库。很可能您将参数串在一起,如下所示:
别那么做。改用preparedstatement。
如果这是一个必须关注这些事情的应用程序,那么它还有防止sql注入攻击的额外优势。
kse8i1jr2#
使用stringescapeutils:
注意:从commons lang 3.0开始:
stringescapeutils.escapesql
这是一种误导性的方法,只处理最简单的sql案例。由于sql不是lang的重点,所以维护这个方法是没有意义的。
mxg2im7a3#
我假设您使用的是java.sql.statement,并使用字符串调用executequery方法。这很糟糕,因为可以进行sql注入。您应该改用java.sql.preparedstatement,然后可以将任何字符串设置为参数,这样就不会有问题了。
例如:
czfnxgou4#
使用reflect util类自动引用转义撇号。很快我将分享整个图书馆。
dddzy1tm5#
这取决于您使用的数据库。通常情况下,''是有效的(我对sql server只有第一手的知识)。
你在用什么数据库?
j1dl9f466#
取决于数据库,但您可以在sqlserver中使用“”。
编辑:在mysql中,可以使用双撇号或反斜杠:http://www.faqts.com/knowledge_base/view.phtml/aid/630
p5fdfcr17#
使用事先准备好的陈述。除了处理任何特殊字符外,它们更健壮,有助于防止sql注入攻击。