0

我正在为 Java GUI 创建一个注册和登录页面,其中用户名和密码将在 GUI 中创建,然后存储在 MySQL 表中。相关代码是 -

    passL = new JPasswordField();
    userNameT = new JTextField();

    //Set up everything else


    submitB = new JButton("click to submit");
    frame.add(submitB);
    submitB.addActionListener(new ActionListener() {

        @Override
        public void actionPerformed(ActionEvent e) {
            try {
                Class.forName("com.mysql.jdbc.Driver");
                Connection con = GetConnection.getConnectionInstance();
                PreparedStatement statement1 = con
                        .prepareStatement("INSERT INTO users (username, password) VALUES ("
                                + Integer.parseInt(userNameT.getText())
                                + ",SHA1('" + passT.getPassword() + "'))");
                statement1.executeUpdate();
            } //Catches exceptions etc

userNameT 是一个数字,密码(passT)可以是任何东西(还没有写约束)。

我的问题是 Eclipse 在 getPassword 上给我一个警告 - “必须明确地将 char[] 转换为字符串”。我这样做的方式是否存在安全问题?

我还需要在复制后直接将 passT 显式更改为 null 或空白,还是 Java 会自动执行此操作。

欢迎大家咨询!谢谢

4

2 回答 2

0

使用 a 的要点之一PreparedStatement是防止SQL 注入,但是您使用它的方式仍然使您容易受到攻击。相反,您应该考虑在 Java 中进行散列并设置如下参数值:

String sql = "INSERT INTO users (username, password) VALUES (?, ?)";
PreparedStatement stmt = con.prepareStatement(sql);
stmt.setInt(1, Integer.parseInt(userNameT.getText()));
stmt.setString(2, DigestUtils.sha1Hex(String.valueOf(userPassT.getPassword())));
于 2013-06-09T21:03:55.220 回答
0

问题是类型不匹配:“ getPassword ”返回一个char[],需要将其转换为String以在您的查询中连接。

一旦不再使用, Java 将负责垃圾收集您的对象,即不再从任何地方引用,因此您不必担心。

也许您可以采取的唯一安全预防措施是清除“ getPassword ”返回的数组。

于 2013-06-09T20:58:41.887 回答