【问题标题】:MySQL injection MariaDB server version errorMySQL注入MariaDB服务器版本错误
【发布时间】:2021-11-03 00:02:03
【问题描述】:

我在尝试为登录系统构建查询时遇到语法错误。它工作过一次,但是当我重新启动我的 XAMPP 服务器时,它开始显示错误。不知道怎么回事

try{

                Class.forName("com.mysql.cj.jdbc.Driver");
                Connection con = DriverManager.getConnection("jdbc:mysql://localhost/login", "root", "");

                String user = textField1.getText();
                String pass = String.valueOf(passwordField1.getPassword());
                try{
                String sql = "select * from tbl_login where `name` =?, `password` =?";
                PreparedStatement st = con.prepareStatement(sql);
                st.setString(1, user);
                st.setString(2,pass);

                ResultSet rs = st.executeQuery(sql);

                if(rs.next()){
                    welcom w = new welcom();

                }
                else {
                    JOptionPane.showMessageDialog(null, "Please check you username and password again");
                    textField1.setText("");
                    passwordField1.setText("");
                }
                }
                catch (Exception h){
                    System.out.println(h.getMessage());
                }

            }
            catch (Exception ex){
                System.out.println(ex.getMessage());
            }

它显示此错误:

您的 SQL 语法有错误;查看与您的 MariaDB 服务器版本相对应的手册,了解在 '?, password =?' 附近使用的正确语法在第 1 行

【问题讨论】:

  • 删除名称和密码周围的“`”字符。
  • 在 where 子句中用逗号连接条件,而不用逗号。
  • 或许你可以参考这篇文档看看如何正确使用PreparedStatement接口javatpoint.com/PreparedStatement-interface

标签: java mysql mariadb


【解决方案1】:

当您使用准备好的语句时,请在创建语句时传递sql 字符串,而不是在执行时传递。

String sql = "select * from tbl_login where `name` =? and `password` =?";
PreparedStatement st = con.prepareStatement(sql);
st.setString(1, user);
st.setString(2,pass);

ResultSet rs = st.executeQuery( );
                               ^ do not pass the sql query here

当您使用st.executeQuery(sql) 时,它会直接执行该查询,但不会为参数占位符解析它。所以? 占位符无法识别。

您还应该在 where 子句中使用布尔运算符 AND,而不是逗号。


关于你的 cmets:

您的原始查询使用了以下语法:

...where `name` =?, `password` =?

我假设您的意思是这两个条件都必须为真。用 SQL 表达的方式如下:

...where `name` =? AND `password` =?

这称为布尔表达式。您应该在任何编程课程或书籍,甚至一些数学课程中了解这一点。

逗号与AND 运算符的含义不同。 SQL 在某些其他类型的表达式中使用逗号,但不作为 where 子句中条件之间的运算符。

【讨论】:

  • 我确实更改了该结果集部分并解决了错误,但现在弹出了一个新错误。虽然不明白你说使用 AND 运算符的部分,但如果你点亮使用这个运算符的原因会很有帮助。这是我在编辑后面临的新错误......
  • 您的 SQL 语法有误;检查与您的 MariaDB 服务器版本相对应的手册,以在第 1 行的“password ='hello'' 附近使用正确的语法
  • 这个答案非常好,但是反引号` ` `不是标准SQL,这将是双引号"(用于关键字或特殊字符作为名称)。在 java String \"password 中我相信是一个 SQL 函数。
  • @JoopEggen,这个问题被标记为 mysql 和 mariadb。在这些数据库中,反引号是唯一可靠的标识符分隔符。仅当您设置正确的 sql 模式时,才使用双引号作为标识符分隔符,但这不是默认值。
  • @JoopEggen,该错误是由 OP 使用逗号而不是布尔运算符引起的。
猜你喜欢
  • 2019-10-13
  • 2017-01-26
  • 2012-01-30
  • 1970-01-01
  • 2019-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多