Rumah > pembangunan bahagian belakang > tutorial php > Isu Keselamatan PHP Biasa dan Cara Mencegahnya

Isu Keselamatan PHP Biasa dan Cara Mencegahnya

Patricia Arquette
Lepaskan: 2024-12-30 19:34:10
asal
117 orang telah melayarinya

Common PHP Security Issues and How to Prevent Them

Isu Keselamatan PHP Biasa dan Cara Menghalangnya

Keselamatan ialah salah satu aspek pembangunan web yang paling kritikal. PHP, sebagai salah satu bahasa pengaturcaraan bahagian pelayan yang paling banyak digunakan, sering menjadi sasaran serangan jika tidak dilindungi dengan betul. Pembangun mesti sedar tentang kelemahan keselamatan biasa dan melaksanakan langkah-langkah yang perlu untuk melindungi aplikasi mereka.

Dalam artikel ini, kami akan meneroka beberapa isu keselamatan PHP yang paling biasa dan cara untuk mengurangkannya.


1. Suntikan SQL

Masalah:
SQL Injection berlaku apabila penyerang dapat memanipulasi pertanyaan SQL dengan menyuntik kod SQL berniat jahat melalui input pengguna. Jika input pengguna dimasukkan secara langsung dalam pertanyaan SQL tanpa pengesahan atau sanitasi yang betul, ia boleh membenarkan penyerang untuk melaksanakan arahan SQL sewenang-wenangnya, yang berpotensi menjejaskan pangkalan data.

Cara Mencegah:

  • Gunakan Penyata Disediakan dan Pertanyaan Berparameter: Gunakan PDO (Objek Data PHP) atau MySQLi dengan pernyataan yang disediakan untuk menghalang suntikan SQL dengan memisahkan pertanyaan SQL daripada data.
  • Contoh dengan PDO:
  $stmt = $pdo->prepare('SELECT * FROM users WHERE email = :email');
  $stmt->execute(['email' => $userEmail]);
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Dengan menggunakan :email, pertanyaan disediakan dengan ruang letak dan nilai sebenar diikat secara berasingan, memastikan input pengguna tidak pernah dimasukkan terus ke dalam pertanyaan.

  • Pengesahan Input: Sentiasa sahkan dan bersihkan input pengguna sebelum menggunakannya dalam pertanyaan SQL.
  • Keistimewaan Paling Rendah: Pastikan pengguna pangkalan data anda mempunyai keistimewaan paling sedikit yang diperlukan untuk melaksanakan operasi.

2. Skrip Merentas Tapak (XSS)

Masalah:
XSS berlaku apabila penyerang menyuntik skrip berniat jahat (biasanya JavaScript) ke dalam halaman web yang dilihat oleh pengguna lain. Skrip ini boleh digunakan untuk mencuri kuki sesi, mengubah hala pengguna ke tapak berniat jahat atau melaksanakan tindakan yang tidak dibenarkan bagi pihak pengguna.

Cara Mencegah:

  • Escape Output: Pastikan semua kandungan yang dijana pengguna yang dipaparkan dalam penyemak imbas dilepaskan dengan betul. Gunakan htmlspecialchars() untuk menukar aksara khas kepada entiti HTML.
  echo htmlspecialchars($userInput, ENT_QUOTES, 'UTF-8');
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Ini menghalang sebarang kod HTML atau JavaScript dalam input pengguna daripada dilaksanakan oleh penyemak imbas.

  • Dasar Keselamatan Kandungan (CSP): Laksanakan CSP untuk mengehadkan jenis kandungan yang boleh dimuatkan pada tapak web anda dan mengurangkan serangan XSS.

  • Pengesahan Input: Sentiasa bersihkan input pengguna, terutamanya apabila menerima data untuk output HTML.


3. Pemalsuan Permintaan Rentas Tapak (CSRF)

Masalah:
CSRF ialah serangan di mana pengguna berniat jahat menipu pengguna lain untuk melakukan tindakan (seperti menukar kata laluan mereka atau membuat pembelian) pada aplikasi web tanpa kebenaran mereka. Ini biasanya berlaku apabila penyerang membuat permintaan tanpa kebenaran menggunakan sesi disahkan mangsa.

Cara Mencegah:

  • Gunakan Token CSRF: Hasilkan token rawak yang unik untuk setiap permintaan yang mengubah suai data. Token ini harus disahkan apabila permintaan dibuat untuk memastikan ia sah.
  $stmt = $pdo->prepare('SELECT * FROM users WHERE email = :email');
  $stmt->execute(['email' => $userEmail]);
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
  • Kuki Tapak Sama: Gunakan atribut kuki SameSite untuk menyekat cara kuki dihantar dalam permintaan merentas tapak.
  echo htmlspecialchars($userInput, ENT_QUOTES, 'UTF-8');
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

4. Muat Naik Fail Tidak Selamat

Masalah:
Membenarkan pengguna memuat naik fail tanpa pengesahan yang betul boleh membawa kepada kelemahan yang teruk. Penyerang boleh memuat naik fail berniat jahat seperti skrip PHP, yang boleh dilaksanakan pada pelayan.

Cara Mencegah:

  • Semak Sambungan Fail dan Jenis MIME: Sentiasa sahkan jenis fail dengan menyemak sambungan dan jenis MIMEnya. Jangan bergantung semata-mata pada data yang disediakan pengguna.
  // Generate CSRF token
  $_SESSION['csrf_token'] = bin2hex(random_bytes(32));

  // Include token in form
  echo '<input type="hidden" name="csrf_token" value="' . $_SESSION['csrf_token'] . '">';

  // Validate token on form submission
  if ($_POST['csrf_token'] !== $_SESSION['csrf_token']) {
      die('CSRF token validation failed.');
  }
Salin selepas log masuk
Salin selepas log masuk
  • Hadkan Saiz Fail: Tetapkan had saiz fail maksimum untuk muat naik bagi mengelakkan serangan penafian perkhidmatan (DoS) melalui fail besar.

  • Namakan Semula Fail Yang Dimuat Naik: Elakkan menggunakan nama fail asal. Namakan semula fail yang dimuat naik kepada sesuatu yang unik untuk menghalang pengguna daripada meneka atau menulis ganti fail sedia ada.

  • Simpan Fail di Luar Akar Web: Simpan fail yang dimuat naik dalam direktori yang tidak boleh diakses melalui web (iaitu, di luar folder public_html atau www).

  • Larang Benarkan Fail Boleh Laku: Jangan sekali-kali benarkan .php, .exe atau jenis fail boleh laku lain dimuat naik. Walaupun anda mengesahkan jenis fail, adalah lebih baik untuk mengelak daripada mengendalikan fail yang berpotensi melaksanakan kod.


5. Pengurusan Sesi Tidak Mencukupi

Masalah:
Amalan pengurusan sesi yang lemah boleh menyebabkan aplikasi anda terdedah kepada serangan, seperti rampasan sesi atau penetapan sesi. Contohnya, penyerang boleh mencuri atau meramalkan pengecam sesi jika mereka tidak dilindungi dengan betul.

Cara Mencegah:

  • Gunakan Kuki Selamat: Pastikan kuki sesi mempunyai bendera HttpOnly, Secure dan SameSite ditetapkan.
  $stmt = $pdo->prepare('SELECT * FROM users WHERE email = :email');
  $stmt->execute(['email' => $userEmail]);
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
  • Jana Semula ID Sesi: Jana semula ID sesi apabila pengguna log masuk atau melakukan tindakan sensitif untuk menghalang penetapan sesi.
  echo htmlspecialchars($userInput, ENT_QUOTES, 'UTF-8');
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
  • Tamat Tempoh Sesi: Tetapkan masa tamat sesi yang sesuai dan laksanakan tamat masa sesi untuk memastikan sesi tidak dibiarkan terbuka selama-lamanya.

6. Suntikan Perintah

Masalah:
Suntikan arahan berlaku apabila penyerang menyuntik perintah berniat jahat ke dalam perintah sistem yang dilaksanakan oleh PHP exec(), shell_exec(), system(), atau fungsi serupa. Ini boleh membenarkan penyerang menjalankan arahan sewenang-wenangnya pada pelayan.

Cara Mencegah:

  • Elakkan Menggunakan Fungsi Shell: Elakkan menggunakan fungsi seperti exec(), shell_exec(), system(), atau passthru() dengan input pengguna. Jika anda mesti menggunakan fungsi ini, pastikan pengesahan dan sanitasi input yang betul.

  • Gunakan Escapeshellcmd() dan Escapeshellarg(): Jika arahan shell mesti dilaksanakan, gunakan escapeshellcmd() dan escapeshellarg() untuk membersihkan input pengguna sebelum menghantarnya ke baris arahan.

  // Generate CSRF token
  $_SESSION['csrf_token'] = bin2hex(random_bytes(32));

  // Include token in form
  echo '<input type="hidden" name="csrf_token" value="' . $_SESSION['csrf_token'] . '">';

  // Validate token on form submission
  if ($_POST['csrf_token'] !== $_SESSION['csrf_token']) {
      die('CSRF token validation failed.');
  }
Salin selepas log masuk
Salin selepas log masuk

7. Pengendalian Ralat Tidak Betul

Masalah:
Mendedahkan mesej ralat sensitif boleh mendedahkan maklumat tentang struktur aplikasi anda, yang boleh dieksploitasi oleh penyerang. Ini sering berlaku apabila mesej ralat terperinci ditunjukkan kepada pengguna.

Cara Mencegah:

  • Lumpuhkan Memaparkan Ralat dalam Pengeluaran: Jangan sekali-kali memaparkan mesej ralat terperinci kepada pengguna dalam pengeluaran. Sebaliknya, log ralat ke fail dan tunjukkan mesej ralat generik kepada pengguna.
  setcookie('session', $sessionId, ['samesite' => 'Strict']);
Salin selepas log masuk
  • Ralat Log: Gunakan mekanisme pengelogan yang betul (seperti error_log()) untuk menangkap maklumat ralat dengan selamat tanpa mendedahkannya kepada pengguna akhir.
  $allowedTypes = ['image/jpeg', 'image/png'];
  if (in_array($_FILES['file']['type'], $allowedTypes)) {
      // Proceed with file upload
  }
Salin selepas log masuk

8. Rampasan Soket Web Rentas Tapak

Masalah:
Jika anda menggunakan WebSockets dalam aplikasi PHP anda, sambungan WebSocket yang tidak selamat boleh dirampas untuk menyamar sebagai pengguna dan menghantar data berniat jahat.

Cara Mencegah:

  • Gunakan HTTPS untuk Sambungan WebSocket: Pastikan sambungan WebSocket diwujudkan melalui wss:// (WebSocket Secure) dan bukannya ws:// untuk menyulitkan data.

  • Sahkan Pengepala Asal: Sahkan pengepala Asal untuk memastikan permintaan itu datang daripada domain yang dibenarkan.

  $stmt = $pdo->prepare('SELECT * FROM users WHERE email = :email');
  $stmt->execute(['email' => $userEmail]);
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

9. Storan Kata Laluan Lemah

Masalah:
Menyimpan kata laluan pengguna dalam teks biasa atau menggunakan algoritma pencincangan yang lemah boleh membawa kepada isu keselamatan yang serius jika pangkalan data terjejas.

Cara Mencegah:

  • Gunakan Algoritma Pencincangan Kuat: Gunakan fungsi password_hash() dan password_verify() terbina dalam PHP untuk mencincang dan mengesahkan kata laluan dengan selamat.
  echo htmlspecialchars($userInput, ENT_QUOTES, 'UTF-8');
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
  • Pengasinan: Sentiasa gunakan garam (yang dilakukan secara automatik dalam password_hash()), memastikan bahawa walaupun dua pengguna mempunyai kata laluan yang sama, cincangan mereka akan berbeza.

Kesimpulan

Keselamatan PHP adalah penting untuk perlindungan kedua-dua aplikasi anda dan penggunanya. Dengan memahami dan mengurangkan kelemahan biasa seperti SQL Injection, XSS, CSRF, isu muat naik fail dan kelemahan pengurusan sesi, anda boleh meningkatkan postur keselamatan aplikasi PHP anda dengan ketara.

Mengguna pakai amalan baik seperti menggunakan pernyataan yang disediakan, mengesahkan input, menggunakan HTTPS dan mengendalikan sesi dan kata laluan dengan selamat akan membantu mencegah serangan yang paling biasa. Sentiasa mengikuti perkembangan amalan keselamatan terkini dan kerap mengaudit permohonan anda untuk kemungkinan kelemahan.

Atas ialah kandungan terperinci Isu Keselamatan PHP Biasa dan Cara Mencegahnya. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:dev.to
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan