Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 引用字符串未正确终止异常_Java_Servlets_Jdbc - Fatal编程技术网

Java 引用字符串未正确终止异常

Java 引用字符串未正确终止异常,java,servlets,jdbc,Java,Servlets,Jdbc,我在oracle数据库中使用如下java servlet更新密码 Connection con; PreparedStatement ps,ps1; ResultSet rs; try{ Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); } catch (ClassNotFoundException e) { System.out.println("Dri

我在oracle数据库中使用如下java servlet更新密码

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:带引号的字符串没有正确终止

我做错了什么吗?请帮助

您的一个变量(可能是密码)中有引号或分号。由于通过字符串连接建立查询,因此容易受到SQL注入攻击。看起来你是不小心打了一针。如果您有一个正确恶意格式化的变量,您可能会对数据库造成相当大的损害

请使用参数化查询

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

stmt.setString(1, mypassword);
...
stmt.executeUpdate();
有关更多详细信息,请参见此


您应该绝对避免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();
如果您这样做,参数中的“'”或“%”或“u”或“将不会导致任何问题。或者您可以尝试转义字符,但为什么要麻烦呢?PS方法不仅更健壮、更易于阅读,而且通常性能更高


有关安全问题的一般说明,请参阅:

您的某个值中是否有一个单引号字符?@rgetman您所说的是哪个值?当程序员没有正确转义查询参数时,就会发生这种情况。您应该真正使用preparedstatements@BackSlash你是什么意思?请帮我准备这份声明stmt=con.prepareStatement(“UPDATE-tbGroup SET-GPassword=?where-GName=?and-OEmail=?”)从何处为第二个和第三个问号赋值?是的?是变量的占位符,您稍后使用
setString(index,value)
设置变量,出于某些愚蠢的原因,编号从1开始,而不是从0开始。