Java 停止sql注入
如何防止sql注入 我正在使用下面的代码登录Java 停止sql注入,java,jdbc,sql-injection,Java,Jdbc,Sql Injection,如何防止sql注入 我正在使用下面的代码登录 con = DriverManager.getConnection("", "", ""); Statement statement = con.createStatement(); ResultSet rs= statement.executeQuery("SELECT email,pass FROM db_pass where email='" + email + "'and pass='" + password + "'" );
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'或'1'='1)时,用户在没有输入有效密码的情况下获得访问权限使用
PreparedStatement
。你可以在中找到一个例子
为了防止所有查询都被参数化,并且
字符串连接不应用于创建动态SQL。一种典型且简单的方法是比较散列操作(md5或sha1)的结果。然后,查询将如下所示
SELECT email, pass from db_pass where md5(email)='" + md5(email) + "' and md5(pass)='" + md5(password) + "'"
但是,这意味着您有一个md5函数可以使用您正在开发的语言,并且您的DB系统也有一个md5函数(例如,mysql)。请注意,这并不是说SQL注入完全不可能,而是针对您给出的示例提供了一个很好的基本保护 使用ORM(对象关系映射器)可能是个好主意。ORMs通常具有针对SQL注入的内置防御 防止sql注入的另一个好方法是使用白名单(即可接受的用户输入列表)。当您收到用户的输入时,检查是否在白名单中;如果不是,就拒绝它 在您的情况下,您需要一个可能用户名的白名单和一个可能密码的白名单;您可以使用正则表达式描述用户名白名单和密码白名单。不过,不要自行编写正则表达式,网上有很多预构建的正则表达式。您不想做自己的,因为它很容易在公式中出错,从而容易受到SQL注入的攻击
希望这有帮助,祝你好运 您需要转换字符串,如果您的字符串是abc',那么如果您的字符串是like',您应该将字符串abc“”转换为sql 坏主意。您可以保护自己不被注射,但代价是使许多查询无法进行。例如,你不能像那样进行
查询来检查“…@yahoo.com”
电子邮件地址。是的,这对我有帮助。。。thanx mikeit的工作sql查询伙伴…@zero0cool-此时不需要任何空间。(当然,它使它更可读…但有人真的在阅读吗?)可能是。。。如果你直接从Java(通过JDBC)使用SQL,这绝对是最好的。。。最简单的方法。