以下是我的servlet中的内容
Random random = new Random();
String salt = Integer.toString(random.nextInt(1000000000 - 1 + 1) + 1);
String sql = "insert into users (user_name, salt, password) "
+ "values (?, ?, ?)";
c = DriverManager.getConnection( url, username, password );
PreparedStatement pstmt = c.prepareStatement( sql );
pstmt.setString( 1, userName );
pstmt.setString( 2, salt);
pstmt.setString( 3, "SHA2(CONCAT('" +password1+ "', "+ salt +"), 256)");
用户名和密码的值正确存储在服务器上,但密码不是。对于给定的值,它存储为以下SHA2(CONCAT(' edf',733903552),256)。
我假设SHA2和CONCAT功能没有生效,已经玩了一段时间并且无法找出原因。
答案 0 :(得分:0)
传递了一个字符串文字,这就是存储的内容。考虑:
String foo = "SHA2(CONCAT('" +password1+ "', "+ salt +"), 256)";
pstmt.setString( 3, foo );
foo
的值是在SQL语句中作为值在中传递的值。
MySQL没有将该字符串的任何内容视为SQL文本......它只是一个字符串。 (这是我们想要的行为。预准备语句和绑定占位符的一大好处是阻止SQL注入,即阻止值被解释为SQL的一部分。)
如果您希望将CONCAT
和SHA2
函数作为MySQL函数执行,那么这些函数必须是SQL文本的一部分。仅传入({值})password1
和salt
。
这样的事情:
String sql = "insert into users (user_name, salt, password)"
+ " values (?, ?, SHA2(CONCAT( ? , ? ),256) )";
pstmt.setString( 1, userName );
pstmt.setString( 2, salt );
pstmt.setString( 3, password1 );
pstmt.setString( 4, salt );