PHP xavfsizlik asoslari
PHP serverda ishlaydi va bazaga, fayllarga hamda foydalanuvchi ma’lumotiga tegadi. Bitta e’tiborsizlik butun bazani ochib qo’yishi mumkin. Bu darsda eng ko’p uchraydigan hujumlar va ularning aniq yechimlari.
Asosiy qoida
1. SQL injection
Eng xavfli va eng keng tarqalgan zaiflik:
PHP
Yechim — tayyorlangan so’rov:
// ✅ Qiymat SQL matniga qo'shilmaydi
$s = $pdo->prepare("SELECT * FROM foydalanuvchilar WHERE login = ?");
$s->execute([$login]);
Ustun yoki jadval nomi kerak bo’lsa — ruxsat etilgan ro’yxat:
PHP
2. XSS
Hujumchi sahifaga o’z JavaScript kodini kiritadi:
PHP
Atribut va havolada alohida ehtiyot:
PHP
3. CSRF
Yechim — har formada maxfiy token:
PHP
Formada:
<form method="post">
<input type="hidden" name="csrf" value="<?= tokenYasa() ?>">
<!-- qolgan maydonlar -->
</form>
Qabul qilishda:
if (!tokenTekshir($_POST["csrf"] ?? null)) {
http_response_code(403);
exit("So'rov rad etildi");
}
4. Parol saqlash
PHP
Vaqti kelganda hashni yangilash:
if (password_verify($parol, $hash)) {
if (password_needs_rehash($hash, PASSWORD_DEFAULT)) {
$yangi = password_hash($parol, PASSWORD_DEFAULT);
// bazada yangilash
}
// kirish muvaffaqiyatli
}
5. Sessiya xavfsizligi
<?php
// session_start() dan OLDIN
ini_set("session.cookie_httponly", "1"); // JavaScript o'qimasin
ini_set("session.cookie_secure", "1"); // faqat HTTPS
ini_set("session.cookie_samesite", "Lax"); // CSRF himoyasi
ini_set("session.use_strict_mode", "1"); // o'ylab topilgan id rad etilsin
session_start();
// Kirgandan keyin DARHOL
session_regenerate_id(true);
Sessiya darsida bu batafsil ko’rilgan.
6. Fayl yuklash
7. Fayl yo’li
PHP
8. Xato xabarlari
PHP
Ishlab chiqarish serverida:
ini_set("display_errors", "0");
ini_set("log_errors", "1");
error_reporting(E_ALL);
9. Sozlama fayllari
10. HTTP sarlavhalari
<?php
header("X-Content-Type-Options: nosniff");
header("X-Frame-Options: DENY");
header("Referrer-Policy: strict-origin-when-cross-origin");
header("Content-Security-Policy: default-src 'self'");
| Sarlavha | Nimadan himoya qiladi |
|---|---|
nosniff |
Brauzer fayl turini “taxmin” qilishidan |
X-Frame-Options: DENY |
Clickjacking (saytni iframe’ga solish) |
Referrer-Policy |
Manzildagi maxfiy ma’lumot sizib chiqishidan |
Content-Security-Policy |
XSS (qayerdan skript yuklash mumkinligi) |
Va albatta — butun sayt HTTPS da.
Tekshiruv ro’yxati
- Har SQL so’rovi
prepare+executebilanmi? - Har chiqishda
htmlspecialcharsbormi? - Har
POSTformada CSRF token bormi? - Parollar
password_hashbilanmi? - Sessiya cookie sozlamalari qo’yilganmi?
- Fayl yuklashda tur va nom tekshiriladimi?
-
display_errorsishlab chiqarishda o’chirilganmi? -
.envvavendor/.gitignoredami? - Sayt HTTPS dami?
-
composer audittoza chiqadimi?
Amaliy mashq
- SQL injection misolini yozib, nega ishlashini tushuntiring;
htmlspecialcharsni olib tashlab,<script>yuboring;- CSRF token yasovchi va tekshiruvchi funksiya yozing;
password_hashvapassword_verifyni sinang;hash_equalsva===farqini tushuntiring;- xato xabarini ikki rejimda ko’rsating.
Qisqacha xulosa
- Foydalanuvchidan kelgan hamma narsa ishonchsiz; server qayta tekshiradi.
- SQL injection → tayyorlangan so’rov; ustun nomi → ruxsat etilgan ro’yxat.
- XSS → chiqishda
htmlspecialchars($m, ENT_QUOTES, "UTF-8"). - CSRF → har formada token +
hash_equals. - Parol →
password_hash;md5/sha1yaroqsiz. - Fayl yuklashda: yangi nom, haqiqiy tur, PHP bajarilmaydigan papka.
- Xato matni foydalanuvchiga ko’rsatilmaydi — jurnalga yoziladi.
- Maxfiy fayllar
public/dan tashqarida.
Keyingi darsda shablon va MVC — kodni toza tashkil qilish.