Rumah  >  Soal Jawab  >  teks badan

Menggunakan mysqli_multi_query adalah penting untuk suntikan SQL yang berjaya

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粉925239921P粉925239921332 hari yang lalu460

membalas semua(1)saya akan balas

  • P粉795311321

    P粉7953113212023-12-16 00:48:03

    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?

    balas
    0
  • Batalbalas