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

Fehlerbehebung bei SQL-Injection-Problemen

coldplay.xixi
coldplay.xixinach vorne
2021-01-12 09:22:531818Durchsuche

<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');

表如下图所示:
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;
    }}

测试一下:
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'

可以看到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;
    }
🎜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!

Stellungnahme:
Dieser Artikel ist reproduziert unter:csdn.net. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen