Java 停止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 + "'" );

如何防止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'或'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,这绝对是最好的。。。最简单的方法。