Halang suntikan SQL dalam PHP
Suntikan SQL ialah kelemahan yang berlaku apabila input pengguna yang tidak diubah suai dimasukkan dengan salah ke dalam pertanyaan SQL. Ini boleh membenarkan penyerang untuk melaksanakan kod SQL sewenang-wenangnya, menyebabkan akibat bencana kepada aplikasi.
Untuk mengelakkan suntikan SQL, adalah penting untuk memisahkan data daripada SQL, memastikan data sentiasa kekal sebagai data dan tidak pernah ditafsirkan sebagai arahan oleh penghurai SQL. Ini boleh dicapai dengan menggunakan pernyataan yang disediakan dengan parameter, yang menghantar pertanyaan SQL ke pelayan pangkalan data untuk menghuraikan secara berasingan daripada mana-mana parameter. Dengan cara ini, penyerang tidak boleh menyuntik SQL berniat jahat.
Terdapat dua cara untuk mencapai ini:
- Gunakan PDO (berfungsi dengan mana-mana pemacu pangkalan data yang disokong)
$stmt = $pdo->prepare('SELECT * FROM employees WHERE name = :name'); $stmt->execute(['name' => $name]); foreach ($stmt as $row) { // 处理 $row }
- Menggunakan MySQLi (untuk MySQL)
PHP 8.2:
$result = $db->execute_query('SELECT * FROM employees WHERE name = ?', [$name]); while ($row = $result->fetch_assoc()) { // 处理 $row }
PHP 8.1 dan ke bawah:
$stmt = $db->prepare('SELECT * FROM employees WHERE name = ?'); $stmt->bind_param('s', $name); // 's' 指定变量类型 -> 'string' $stmt->execute(); $result = $stmt->get_result(); while ($row = $result->fetch_assoc()) { // 处理 $row }
Jika anda menyambung ke pangkalan data bukan MySQL, anda boleh merujuk kepada pilihan khusus pemacu kedua (cth., PostgreSQL pg_prepare()
dan pg_execute()
). PDO adalah pilihan sejagat.
Konfigurasi sambungan yang betul
Apabila menggunakan PDO untuk mengakses pangkalan data MySQL, kenyataan sebenar yang disediakan tidak digunakan secara lalai. Untuk menyelesaikan masalah ini, anda perlu melumpuhkan simulasi kenyataan yang disediakan. Berikut ialah contoh cara membuat sambungan menggunakan PDO:
$dbConnection = new PDO('mysql:dbname=dbtest;host=127.0.0.1;charset=utf8mb4', 'user', 'password'); $dbConnection->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); $dbConnection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
Untuk MySQLi, operasi yang sama perlu dilakukan:
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT); // 错误报告 $dbConnection = new mysqli('127.0.0.1', 'username', 'password', 'test'); $dbConnection->set_charset('utf8mb4'); // 编码
Penerangan
Pertanyaan SQL yang anda hantar ke prepare
dihuraikan dan disusun oleh pelayan pangkalan data. Dengan menentukan parameter (sama ada ?
atau parameter bernama, seperti contoh :name
di atas), anda memberitahu kernel pangkalan data perkara yang anda ingin tapis berdasarkan. Kemudian, apabila execute
dipanggil, pertanyaan praproses digabungkan dengan nilai parameter yang anda berikan.
Adalah penting bahawa nilai parameter digabungkan dengan pertanyaan yang disusun dan bukan dengan rentetan SQL. Suntikan SQL berfungsi dengan menipu skrip untuk memasukkan rentetan berniat jahat apabila mencipta SQL untuk dihantar ke pangkalan data. Jadi dengan menghantar SQL sebenar secara berasingan daripada parameter, anda mengurangkan risiko mendapat hasil yang tidak dijangka.
Sebarang parameter yang dihantar menggunakan pernyataan yang disediakan akan dianggap hanya sebagai rentetan (walaupun kernel pangkalan data mungkin melakukan beberapa pengoptimuman jadi parameter juga mungkin nombor). Dalam contoh di atas, jika pembolehubah $name
mengandungi 'Sarah'; DELETE FROM employees
, hasilnya hanya akan menjadi rentetan carian "'Sarah'; DELETE FROM employees "
dan jadual anda tidak akan dikosongkan.
Satu lagi kelebihan menggunakan pernyataan yang disediakan ialah jika anda melaksanakan pertanyaan yang sama beberapa kali dalam sesi yang sama, ia hanya dihuraikan dan disusun sekali, sekali gus meningkatkan kelajuan.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mencegah Suntikan SQL dalam Aplikasi PHP?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Mysql'sblobissusuipableforstoringbinarydatawithinarelationaldatabase, sementara

Toaddauserinmysql, gunakan: createuser'username '@' host'identifiedby'password '; here'showtodoitsecurely: 1) choosethehostcareflelytocon trolaccess.2) SetResourcelImitSwithOptionsLikeMax_queries_per_hour.3) USESTRONG, UNIQUEPASSWORDS.4) Enforcessl/TLSConnectionswith

Toavoidcommonmistakeswithstringdatatypesinmysql, fahamistringtypenuances, choosetherighttype, danManageencodingandcollationsettingsefectively.1) usecharfarfixed-lengthstrings, varcharforvariable-length, andtext/blobforlargerdata.2)

Mysqloffersechar, varchar, teks, anddenumforstringdata.usecharforfixed-lengthstrings, varcharerforvariable-length, teks forlarger text, andenumforenforcingdataantegritywithaetofvalues.

Mengoptimumkan permintaan mysqlblob boleh dilakukan melalui strategi berikut: 1. Mengurangkan kekerapan pertanyaan gumpalan, gunakan permintaan bebas atau pemuatan kelewatan; 2. Pilih jenis gumpalan yang sesuai (seperti TinyBlob); 3. Pisahkan data gumpalan ke dalam jadual berasingan; 4. Mampat data gumpalan di lapisan aplikasi; 5. Indeks metadata gumpalan. Kaedah ini dapat meningkatkan prestasi dengan berkesan dengan menggabungkan pemantauan, caching dan data sharding dalam aplikasi sebenar.

Menguasai kaedah menambah pengguna MySQL adalah penting untuk pentadbir pangkalan data dan pemaju kerana ia memastikan keselamatan dan kawalan akses pangkalan data. 1) Buat pengguna baru menggunakan perintah CreateUser, 2) Berikan kebenaran melalui perintah geran, 3) Gunakan flushprivileges untuk memastikan kebenaran berkuatkuasa, 4) kerap mengaudit dan membersihkan akaun pengguna untuk mengekalkan prestasi dan keselamatan.

ChooseCHARforfixed-lengthdata,VARCHARforvariable-lengthdata,andTEXTforlargetextfields.1)CHARisefficientforconsistent-lengthdatalikecodes.2)VARCHARsuitsvariable-lengthdatalikenames,balancingflexibilityandperformance.3)TEXTisidealforlargetextslikeartic

Amalan terbaik untuk mengendalikan jenis data rentetan dan indeks dalam MySQL termasuk: 1) Memilih jenis rentetan yang sesuai, seperti char untuk panjang tetap, varchar untuk panjang berubah, dan teks untuk teks besar; 2) berhati-hati dalam pengindeksan, elakkan daripada mengindeks, dan buat indeks untuk pertanyaan umum; 3) Gunakan indeks awalan dan indeks teks penuh untuk mengoptimumkan carian rentetan panjang; 4) Secara kerap memantau dan mengoptimumkan indeks untuk memastikan indeks kecil dan cekap. Melalui kaedah ini, kita dapat mengimbangi membaca dan menulis prestasi dan meningkatkan kecekapan pangkalan data.


Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

Video Face Swap
Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Artikel Panas

Alat panas

SecLists
SecLists ialah rakan penguji keselamatan muktamad. Ia ialah koleksi pelbagai jenis senarai yang kerap digunakan semasa penilaian keselamatan, semuanya di satu tempat. SecLists membantu menjadikan ujian keselamatan lebih cekap dan produktif dengan menyediakan semua senarai yang mungkin diperlukan oleh penguji keselamatan dengan mudah. Jenis senarai termasuk nama pengguna, kata laluan, URL, muatan kabur, corak data sensitif, cangkerang web dan banyak lagi. Penguji hanya boleh menarik repositori ini ke mesin ujian baharu dan dia akan mempunyai akses kepada setiap jenis senarai yang dia perlukan.

SublimeText3 versi Inggeris
Disyorkan: Versi Win, menyokong gesaan kod!

Pelayar Peperiksaan Selamat
Pelayar Peperiksaan Selamat ialah persekitaran pelayar selamat untuk mengambil peperiksaan dalam talian dengan selamat. Perisian ini menukar mana-mana komputer menjadi stesen kerja yang selamat. Ia mengawal akses kepada mana-mana utiliti dan menghalang pelajar daripada menggunakan sumber yang tidak dibenarkan.

Dreamweaver CS6
Alat pembangunan web visual

Muat turun versi mac editor Atom
Editor sumber terbuka yang paling popular
