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.
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:
$stmt = $pdo->prepare('SELECT * FROM users WHERE email = :email'); $stmt->execute(['email' => $userEmail]);
Dengan menggunakan :email, pertanyaan disediakan dengan ruang letak dan nilai sebenar diikat secara berasingan, memastikan input pengguna tidak pernah dimasukkan terus ke dalam pertanyaan.
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:
echo htmlspecialchars($userInput, ENT_QUOTES, 'UTF-8');
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.
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:
$stmt = $pdo->prepare('SELECT * FROM users WHERE email = :email'); $stmt->execute(['email' => $userEmail]);
echo htmlspecialchars($userInput, ENT_QUOTES, 'UTF-8');
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:
// 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.'); }
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.
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:
$stmt = $pdo->prepare('SELECT * FROM users WHERE email = :email'); $stmt->execute(['email' => $userEmail]);
echo htmlspecialchars($userInput, ENT_QUOTES, 'UTF-8');
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.'); }
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:
setcookie('session', $sessionId, ['samesite' => 'Strict']);
$allowedTypes = ['image/jpeg', 'image/png']; if (in_array($_FILES['file']['type'], $allowedTypes)) { // Proceed with file upload }
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]);
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:
echo htmlspecialchars($userInput, ENT_QUOTES, 'UTF-8');
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!