Heim > Datenbank > SQL > Fehlerbehebung bei SQL-Injection-Problemen

Fehlerbehebung bei SQL-Injection-Problemen

coldplay.xixi
Freigeben: 2021-01-12 09:22:53
nach vorne
1837 Leute haben es durchsucht

<img src="https://img.php.cn/upload/article/000/000/052/5ffcf9b492b47340.jpg" alt="Fehlerbehebung bei SQL-Injection-Problemen" ><img src="https://img.php.cn/upload/article/000/000/052/5ffcf9b492b47340.jpg" alt="Fehlerbehebung bei SQL-Injection-Problemen" >

推荐(免费):<a href="https://www.php.cn/sql/" target="_blank">SQL教程</a>

SQL注入是什么?

看一下百度百科的定义:
Fehlerbehebung bei SQL-Injection-Problemen
啊,好长一大段文字,些许不想看,下面通过一个例子,来说明一下什么是SQL注入

新建一个数据库,再建一个表,添加两行数据:

use db1;create table user(
	id int primary key auto_increment,
	username varchar(32),
	password varchar(32));insert into user values(null,'zhangsan','123');insert into user values(null,'lisi','234');
Nach dem Login kopieren

表如下图所示:
Fehlerbehebung bei SQL-Injection-Problemen
再随随便便用JDBC写个登陆操作:

package com.wzq.jdbc;import com.wzq.util.JDBCUtils;import java.sql.Connection;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Statement;import java.util.Scanner;/*
 *   需求:
 *       1、通过键盘录入用户名和密码
 *       2、判断用户是否登陆成功
 * */public class JDBCDemo05 {

    public static void main(String[] args) {
        Scanner cin = new Scanner(System.in);
        System.out.println("请输入用户名:");
        String username = cin.nextLine();
        System.out.println("请输入密码:");
        String password = cin.nextLine();

        boolean res = new JDBCDemo05().login(username, password);
        if (res) System.out.println("登陆成功!");
        else System.out.println("登陆失败!");

    }

    public boolean login(String username, String password) {
        if (username == null || password == null) {
            return false;
        }
        Connection conn = null;
        Statement stmt = null;
        ResultSet rs = null;
        try {
            //1、获取数据库连接
            conn = JDBCUtils.getConnection();   //JDBCUtils工具类
            //2、定义sql
            String sql = "select * from user where username = '" + username + "' and password = '" + password + "'";
            //3、获取执行sql的对象
            stmt = conn.createStatement();
            //4、执行sql
            rs = stmt.executeQuery(sql);
            return rs.next();
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            JDBCUtils.close(rs, stmt, conn);
        }
        return false;
    }}
Nach dem Login kopieren

测试一下:
Fehlerbehebung bei SQL-Injection-Problemen
可以看到,普通的检验没有任何问题,现在使用SQL注入

账户名称随便输入,密码输入:a' or 'a'='a
Fehlerbehebung bei SQL-Injection-Problemen
惊讶的发现,居然登陆成功了。输出一下sql看一下:

select * from user where username = 'askjdhjksahd' and password = 'a' or 'a' = 'a'
Nach dem Login kopieren

可以看到where之后的条件,无论是什么结果都为真,都会输出整个表:
Fehlerbehebung bei SQL-Injection-Problemen
所以,综上所述:在sql拼接时,有一些sql的特殊关键字参与字符串的拼接,就会造成安全性问题,这就是上面为什么能登陆成功的原因所在。


那怎么解决这个问题呢?

答:利用PreparedStatement对象,不使用Statement对象。

PreparedStatement对象是Statement对象的子类,它是预编译的sql,所以运行速度会比Statemnet更快。

PerpaerdStatement使用?作为占位符,使用setXxx(索引,值)?赋值

所以我们替换一下Statement

Empfohlen (kostenlos):SQL-Tutorial


Was ist SQL-Injection? Fehlerbehebung bei SQL-Injection-Problemen
Schauen Sie sich die Definition der Baidu-Enzyklopädie an:

Bildbeschreibung hier einfügen🎜 Ah, es ist so ein langer Absatz, ich möchte ihn nicht lesen, um zu erklären, was SQL-Injection ist: 🎜🎜Erstellen Sie eine neue Datenbank, erstellen Sie eine Tabelle und Fügen Sie zwei Datenzeilen hinzu. :🎜
    public boolean login(String username, String password) {        if (username == null || password == null) {            return false;
        }
        Connection conn = null;
        PreparedStatement pstmt = null;
        ResultSet rs = null;
        try {            //1、获取数据库连接
            conn = JDBCUtils.getConnection();   //JDBCUtils类
            //2、定义sql
            String sql = "select * from user where username = ? and password = ?";
            //3、获取执行sql的对象
            pstmt = conn.prepareStatement(sql);
            pstmt.setString(1,username);
            pstmt.setString(2,password);
            //4、执行sql
            rs = pstmt.executeQuery();
            return rs.next();
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            JDBCUtils.close(rs, pstmt, conn);
        }        return false;
    }
Nach dem Login kopieren
🎜Die Tabelle sieht wie folgt aus:🎜Bildbeschreibung hier einfügen🎜 Dann verwenden Sie einfach JDBC, um einen Anmeldevorgang zu schreiben: 🎜rrreee🎜Testen Sie es: 🎜Bildbeschreibung hier einfügen🎜 Wie Sie sehen, gibt es bei der normalen Inspektion kein Problem. Verwenden Sie jetzt SQL-Injection: 🎜🎜Der Kontoname ist beliebig. Geben Sie ein, Passworteingabe: a' oder 'a'='a🎜Bildbeschreibung hier einfügen🎜 Ich war überrascht, dass ich mich erfolgreich angemeldet habe. Geben Sie sql aus und sehen Sie sich Folgendes an: 🎜rrreee🎜Sie können die Bedingungen nach where sehen. Unabhängig davon, welches Ergebnis wahr ist, wird die gesamte Tabelle ausgegeben: 🎜Bildbeschreibung hier einfügen🎜 Also, um es zusammenzufassen: in sql Beim Spleißen sind einige spezielle Schlüsselwörter von sql am String-Spleißen beteiligt, was zu Sicherheitsproblemen führt. Aus diesem Grund ist die obige Anmeldung erfolgreich. 🎜
🎜Wie kann man dieses Problem lösen? 🎜🎜Antwort: Verwenden Sie das PreparedStatement-Objekt anstelle des Statement-Objekts. 🎜🎜PreparedStatement-Objekt ist eine Unterklasse des Statement-Objekts. Es ist vorkompiliertes sql und läuft daher schneller als Statemnet-Code >Schneller. 🎜🎜PerpaerdStatement verwendet ? als Platzhalter und verwendet setXxx(index, value), um ?einen Wert zuzuweisen >🎜🎜 Ersetzen wir also Statement und schreiben den Code: 🎜rrreee🎜Testen Sie es: 🎜🎜🎜 Erfolgreich gelöst! 🎜

Das obige ist der detaillierte Inhalt vonFehlerbehebung bei SQL-Injection-Problemen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:csdn.net
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage