在Java中逃避撇号

时间:2009-11-04 18:29:33

标签: java mysql escaping

我还是Java的新手,并尝试将数据插入数据库。我插入一个包含's的字符串时出错,所以我的最终结果是逃避撇号。我怎么能完成?

7 个答案:

答案 0 :(得分:13)

使用准备好的陈述。除了处理任何特殊字符外,它们还更加强大,有助于防止SQL注入攻击。

答案 1 :(得分:6)

问题实际上不是Java,而是底层数据库。你最有可能将参数串起来像这样:

  String sql = "select * from sometable where somefield = " + someObject.getSomeField();

不要那样做。请改用PreparedStatement

如果这是一个必须关注此类事情的应用程序,那么它具有防止SQL注入攻击的额外优势。

答案 2 :(得分:5)

使用StringEscapeUtils

StringEscapeUtils.escapeSql(yourstring);

警告:从Commons Lang 3.0开始:

  

<强> StringEscapeUtils.escapeSql

     

这是一种误导性的方法,只处理最简单的SQL案例。由于SQL不是Lang的重点,因此维护此方法没有意义。

答案 3 :(得分:2)

取决于数据库,但您可以在SqlServer中使用''。

编辑:在MySql中你可以使用双撇号或反斜杠:http://www.faqts.com/knowledge_base/view.phtml/aid/630

答案 4 :(得分:1)

我假设您正在使用java.sql.Statement,并使用String调用executeQuery方法。这很糟糕,因为它可以进行SQL注入。您应该使用java.sql.PreparedStatement代替,然后您可以将任何您想要的字符串设置为参数,并且您不会遇到问题。

例如:

PreparedStatement pstmt = con.prepareStatement("UPDATE MY_TABLE SET TEXT_FIELD = ?");
pstmt.setString(1, "any String 'will work here!");

答案 5 :(得分:1)

使用我的Reflect util类自动引用Escape Apostrophe。很快我将分享整个图书馆。

/**
 * 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;
}

答案 6 :(得分:0)

这取决于您使用的数据库。通常''工作(我只有SQL Server的第一手资料)。

您使用的数据库是什么?