Menggunakan mysqli_multi_query adalah penting untuk suntikan SQL yang berjaya
P粉925239921
P粉925239921 2023-12-15 08:46:18
0
1
465

Saya cuba mencipta contoh suntikan SQL, tetapi MySQL menolak pertanyaan kedua setiap kali melainkan saya menukarnya kepada mysqli_multi_query.

<form action="<?php echo $_SERVER['PHP_SELF'];?>" method="post" name="dummyDorm">
        <label>Name: </label>
        <input type="text" name="name"><br>
        <input type="submit" value="Submit">
    </form>

    <?php 
        if($_SERVER["REQUEST_METHOD"] == "POST")
        {
            $name = $_POST['name'];
            $conn = mysqli_connect("localhost", "root", "", "testDB");
            if (mysqli_connect_errno()){
                echo "failed to connect" . mysqli_connect_error();
                die();
            }
            else
            {

                $sql = "SELECT * FROM users WHERE name = '{$name}'";
                var_dump($sql);
                if (mysqli_query($conn, $sql))
                {
                    echo "Success";
                } 
                else {
                    echo "Error: " . $sql . "<br>" . mysqli_error($conn);
                }

                mysqli_close($conn);
            }

        }
    ?>

Borang ini sebenarnya tidak melakukan apa-apa, saya hanya mahu menunjukkan bahawa data boleh diedit menggunakan suntikan SQL. Saya ingin melakukan suntikan di mana "DROP TABLE testTable" dimasukkan. MySQL saya kelihatan seperti ini:

DROP DATABASE IF EXISTS testDB;
CREATE DATABASE testDB;
USE testDB;

CREATE TABLE users
(
    userID INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(255)
)engine=innodb;

CREATE TABLE testTable
(
    test VARCHAR(10)
)engine=innodb;

INSERT INTO users VALUES(null, "user01");

Apabila memasukkan suntikan: ';Padam jadual ujian jadual --

Keluaran adalah seperti berikut: Ralat: PILIH * DARI pengguna WHERE nama = ''; Terdapat ralat dalam sintaks SQL anda; semak manual untuk versi pelayan MySQL anda untuk sintaks yang betul untuk digunakan berhampiran baris 1 "DROP TABLE testTable --"

Saya meneruskan tutorial dan mereka menggunakan MySQLi_query dan ia berfungsi dengan baik, tetapi saya terpaksa menukarnya kepada Mysqli_multi_query untuk menyelesaikan suntikan.

Terima kasih

P粉925239921
P粉925239921

membalas semua(1)
P粉795311321

Memangmysqli_query()Berbilang pertanyaan tidak dibenarkan. Untuk melakukan ini, anda memerlukan mysqli_multi_query(), dan jika anda mengelak daripada menggunakan fungsi ini, anda dilindungi daripada serangan suntikan SQL yang bergantung pada menjalankan berbilang pertanyaan, seperti contoh DROP TABLE.

Walau bagaimanapun, suntikan SQL boleh menyebabkan jenis bahaya lain selain DROP TABLE.

Saya boleh mengakses URL halaman PHP anda menggunakan parameter tambahan yang membolehkan saya mengawal logik pertanyaan SQL anda:

Baca semua baris dalam jadual:

?name=x' OR 'x'='x

Baca jadual lain:

?name=x' UNION ALL SELECT ... FROM othertable WHERE 'x'='x

Lakukan serangan penafian perkhidmatan untuk membunuh pelayan pangkalan data anda dengan trilion jadual temp baris:

?name IN (SELECT 1 FROM othertable CROSS JOIN othertable CROSS JOIN othertable CROSS JOIN othertable CROSS JOIN othertable CROSS JOIN othertable CROSS JOIN othertable) AND 'x'='x

SQL injection tidak semestinya serangan berniat jahat. Ini mungkin penggunaan rentetan undang-undang yang tidak disengajakan, mengakibatkan sintaks SQL yang tidak dijangka:

?name=O'Reilly

Pembetulan untuk suntikan SQL terkenal dan mudah: Gunakan pertanyaan berparameter.

Lihat mysqli_prepare() manual atau contoh lengkap soalan Stack Overflow seperti Bagaimana untuk menghalang suntikan SQL dalam PHP?

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan