如何防止sql注入 我使用下面的代码登录
con = DriverManager.getConnection("", "", "");
Statement statement = con.createStatement();
ResultSet rs= statement.executeQuery("SELECT email,pass FROM db_pass where email='" + email + "'and pass='" + password + "'" );
if (rs.next()) {
String a=rs.getString(1);
String b=rs.getString(2);
rs.close();
它的工作正常但是当它放入(nitin'OR'1'='1)时,用户无需输入有效密码即可访问
答案 0 :(得分:7)
使用PreparedStatement
。您可以在http://docs.oracle.com/javase/tutorial/jdbc/basics/prepared.html
为防止SQL injection所有查询都应进行参数化 永远不应该使用字符串连接来创建动态SQL。
答案 1 :(得分:0)
使用ORM(对象关系映射器)可能是个好主意。 ORM通常具有针对SQL注入的内置防御。
防止sql注入的另一个好方法是使用白名单(即可接受的用户输入列表)。当您收到用户的输入时,请检查它是否在白名单中;如果不是拒绝它。
在您的情况下,您希望获得可能的用户名的白名单和可能的密码的白名单;您可以使用正则表达式描述白名单的用户名和白名单密码。不要自制你自己的正则表达式,但是有很多预先构建的正则表达式可以在线获得。你不想自己创建,因为它的配方容易出错,这使得它很容易被SQL注入。
希望这有帮助,祝你好运!
答案 2 :(得分:-1)
执行此操作的典型且简单的方法是比较散列操作(md5或sha1)的结果。然后查询看起来像
SELECT email, pass from db_pass where md5(email)='" + md5(email) + "' and md5(pass)='" + md5(password) + "'"
但是,这意味着你有一个md5函数可用你正在开发的语言,你的DB-System也有md5函数可用(例如,mysql)。请注意,这不会使SQL注入完全不可能,但对您提供的示例是一个很好的基本保护。
答案 3 :(得分:-1)
你需要转换你的字符串,如果你的字符串是abc'你应该把字符串abc''给sql,如果你的字符串是''。