引号字符串未正确终止异常

时间:2014-03-24 17:43:18

标签: java servlets jdbc

我正在使用像这样的

这样的java servlet在oracle数据库中更新密码
Connection con;
PreparedStatement ps,ps1;
ResultSet rs;
    try{
        Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");

    }
    catch (ClassNotFoundException e)
            {
                System.out.println("Drivers Not Found");
            }
try{
    con=DriverManager.getConnection("jdbc:odbc:SharedCryptography", "fyp", "fyp");


}catch(SQLException e1)
{
}
String query="UPDATE tbGroup SET GPassword='"+mypassword+"' where GName='"+GroupNamee+"' and OEmail='"+OwnerId+"'";
java.sql.Statement stmt = con.createStatement();
stmt.executeUpdate(query);

但是它给出了java.sql.SQLException:[Oracle] [ODBC] [Ora] ORA-01756:引用的字符串未正确终止

我做错了吗?请帮忙

2 个答案:

答案 0 :(得分:1)

你的一个变量(可能是密码)中有一个引号或半冒号。由于您通过字符串连接构建查询,因此您很容易受到SQL注入攻击。看起来你不小心通过注射攻击自己。如果你有一个格式错误的格式化变量,你可能会对你的数据库造成相当大的损害。

请使用参数化查询

PreparedStatement stmt = con.prepareStatement("UPDATE tbGroup SET GPassword= ? where GName= ? and OEmail=?" )

stmt.setString(1, mypassword);
...
stmt.executeUpdate();

有关详细信息,请参阅此处

https://www.owasp.org/index.php/Preventing_SQL_Injection_in_Java

答案 1 :(得分:1)

您应该绝对避免SQL语句中的字符串连接。您将遇到各种安全性和稳定性问题。只需使用预先准备好的声明即可解决您的问题:

String sql="UPDATE tbGroup SET GPassword=? where GName=? and OEmail=?";
PreparedStatement ps = con.prepareStatement(sql);
ps.setString(1, myPassword);
ps.setString(2, groupName);
ps.setString(3, ownerId);
ps.executeUpdate();

如果你这样做,你的参数中没有“'”或“%”或“_”或“会导致任何问题。或者你可以尝试逃避你的角色,但为什么这么麻烦 - PS方法不仅更多强大且易于阅读,通常也更高效。

有关安全问题的一般说明,请参阅:https://www.owasp.org/index.php/SQL_injection