Java 确定我的代码是否包含硬编码的SQL查询?

Java 确定我的代码是否包含硬编码的SQL查询?,java,mysql,Java,Mysql,下面是一个验证用户密码的方法。它从数据库中验证用户电子邮件和密码 public long authenticate(String email, String encodePassword) { try { Class.forName("com.mysql.cj.jdbc.Driver"); } catch (ClassNotFoundException e) { e.printStackTrace(); } try (

下面是一个验证用户密码的方法。它从数据库中验证用户电子邮件和密码

public long authenticate(String email, String encodePassword) {
    try {
        Class.forName("com.mysql.cj.jdbc.Driver");
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    }

    try (
        Connection conn = DriverManager.getConnection("jdbc:connection", "adminusername","password");/* a) Database User Profile: root is who the user is b) Database user password */
        Statement stmt = conn.createStatement();
    ) /* execute mysql queries */ {
        String query = "Select id from User where email = '" + email + "' and password = '" + encodePassword + "'";
        System.out.println("query: " + query);
        ResultSet rs = stmt.executeQuery(query);

        while (rs.next()) {
            // if the user id is there get it
            return rs.getLong("id");                
        }           
    } catch (SQLException e) {
        e.printStackTrace();
    }   

    // if the user id not there return -1 (authority failed)
    return -1; 
}

为了确定我的演讲是否正确,我在代码中硬编码了SQL查询值

您的演讲人试图警告您SQL注入

SQL注入是一种web安全漏洞,允许攻击者干扰应用程序对其数据库的查询。它通常允许攻击者查看他们通常无法检索的数据。这可能包括属于其他用户的数据,或者应用程序本身能够访问的任何其他数据。在许多情况下,攻击者可以修改或删除此数据,从而导致应用程序的内容或行为发生持续更改

代码中的相应部分如下所示

String query = "Select id from User where email = '" + email + "' and password = '" + encodePassword + "'";
如果查询返回用户id,则登录成功。否则,它将被拒绝

在这里,攻击者只需使用SQL注释序列
--
从查询的WHERE子句中删除密码检查,就可以在没有密码的情况下以任何用户的身份登录。例如,提交电子邮件some@email“--而空密码将导致以下查询:

SELECT id FROM users WHERE email = 'some@email'--' AND password = ''

此查询返回其电子邮件为的用户some@email并在不检查密码的情况下将攻击者作为该用户成功登录

你的问题究竟是什么还不是很清楚。您的讲师是否对代码中的某些内容提出抱怨?这是你演讲中的代码,你对此有疑问吗?我希望不是后者,因为你的代码中有一个很大的问题(这可能是你/讲师所说的“硬编码”的意思,我猜你的问题就是关于这个):你应该总是使用准备好的语句,看,而不是直接将变数表示出来(关于原因之一,请参见链接问题中的第二个答案).阅读SQL注入攻击。除了@Solarflare提到的安全性之外。。您不应将密码以纯文本形式存储在数据库中。。。或者在
WHERE
子句中尽可能使用密码列过滤器,因为RDM设计为在接近“常量”的时间内提供稳定的结果,特别是当涉及到b树索引或内存缓存时。但是我的数据库部署到云