Odatda bu kodlarni hamma dasturchilar o'zi tuzadi.
Xavfsizlikni ta'minlash uchun:
1. XSS dan hushyor bo'lish
2. SQL injection tekshirish
3. Anti ddos ishlab chiqish.
1. XSS bu foydalanuvchiga chiqarilayotgan va undan kiritilayotgan ma'lumotlarni tekshirmaslik hisoblanadi.
Misol uchun sizda biron bir chat formasi qabul qiluvchi funktsiya bor:
//Post ma'lumotlarini olish
$name = $_POST['name'];
$message = $_POST['message'];
//Ma'lumotlarni bazaga kiritish
mysql_query("INSERT INTO `chat` SET `name` = '".$name."');
Siz bu holatda post ma'lumotlarini tekshirmayapsiz. Bu holatda user tomonida kiritilayotgan postga biron bir belgi yoki script qo'shib jo'natilsa siz bu ma'lumotlarni tekshirmaslikgingiz sababli ma'lumotlar bazaga to'g'ridan to'g'ri kiritiladi.
Misol uchun:
<script>
location.assign('
http://itex.uz');
</script>
Bu holatda bazaga kichik javascript sahifa yo'naltirish kodi kiritildi va ushbu malumotlar kerakli joyda foydalanuvchiga chiqarilganda kodlar ishlab ketadi va foydalanuvchu oynasi
http://itex.uz sahifasiga yo'naltiriladi.
Buni oldini olish:
Raqamlarni filtrlash uchun:
function int($var) {
return abs(intval($var));
}
Matnlarni filtrlash uchun:
function txt($text) {
return htmlspecialchars($text, ENT_QUOTES, 'utf-8'));
}
2. Xuddi yuqoridagi holatga o'xshash faqat farqli tomoni unda belgilar yordamida baza ma'lumotlaridan keraklisini chiqarib olishham mumkin.
Misollarda ko'rsak:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
<h2>Ma'lumotlarni ko'rish uchun iltimos avtizatsiyadan o'ting:</h2>
<form method="get" action="?">
<p>Login</p>
<input name="name" type="text">
<p>Parol</p>
<input name="password" type="text"><br />
<input type="submit">
</form>
<?php
$mysqli = new mysqli("localhost", "root", "", "test_db");
if (mysqli_connect_errno()) {
printf("Ma'lumotlar bazasiga ulanib bo'lmadi: %s\n", mysqli_connect_error());
exit();
} else {
$mysqli->query("SET NAMES UTF8");
$mysqli->query("SET CHARACTER SET UTF8");
$mysqli->query("SET character_set_client = UTF8");
$mysqli->query("SET character_set_connection = UTF8");
$mysqli->query("SET character_set_results = UTF8");
}
$name = filter_input(INPUT_GET, 'name');
$password = filter_input(INPUT_GET, 'password');
if ($result = $mysqli->query("SELECT * FROM `members` WHERE name = '$name' AND
password = $password")) {
while ($obj = $result->fetch_object()) {
echo "<p><b>Ismingiz: </b> $obj->name</p>
<p><b>Sizning holatingiz:</b> $obj->status</p>
<p><b>Siz uchun mavjud bo'lgan ma'lumotlar:</b> $obj->books</p><hr />";
}
} else {
printf("Xatolik: %s\n", $mysqli->error);
}
$mysqli->close();
?>
</body>
</html>
Endi buni tekshirib ko'radigan bo'lsak:
http://localhost/index.php?name=Demo&password=123456
Bu holatda siz yuborgan name va password ma'lumotlar bo'yicha bazadagi ma'lumotlar bilan solishtiriladi.
Va bazadan true javobi kelsa sizga kerakli ma'lumotlar ko'rsatiladi.
SELECT * FROM `members` WHERE name = '$name' AND password ='$password'
SELECT bu yerda ma'lumotlarni olish uchun sql buyrug'i
* bu yerda tablitsadagi barcha qatorlarni olish haqidagi buyrug'
FROM bu yerda ma'lumotlarni qaysi tablitsadan olish haqidagi buyrug'
WHERE bu yerda tablitsaning qaysi qatoridan olish haqidagi buyrug'ni beradi. Agar siz kiritgan ma'lumotlar bazadagi ma'lumotlarga mos kelsa bazadan true (rost) javobi keladi agar mos kelmasa false (yolg'on) javobi keladi.
Endi formaga kiritilgan ma'lumotni o'rgartirib ko'ramiz:
Logindan so'ng ' belgisini qo'yamiz
http://localhost/index.php?name=Demo'&password=123456
va natijani ko'ramiz
Ошибка: You have an error in your SQL syntax; check the manual that corresponds to your
MySQL server version for the right syntax to use near '111'' at line 1
Agar biz to'g'ri ma'lumotlarni kiritgan holda
buyruq bunday beriladi
SELECT * FROM `members` WHERE name = 'Demo' AND password ='111'
agar bir ' belgisini qo'shsak buyruq o'zgaradi
SELECT * FROM `members` WHERE name = 'Demo' ' AND password ='111'
Buyruqni yana o'zgartirib ko'ramiz
http://localhost/index.php?name=Demo' OR 1 --+ &password=123456
Endi buyruq quyidagicha o'zgaradi
SELECT * FROM `members` WHERE name = 'Demo' OR 1
Agar dasturlash tilidan bilsangiz shart operatorlarida AND yoki OR ishlatiladi bular AND va degani OR yoki degani.
Misol uchun:
$a = 1;
$b = 2;
if($a==1 AND $b==2){
echo'True';
}else{
echo'False';
}
Bu holatda bizga faqat a=1 va b=2 bo'lgandagina true javobini beradi
Agar biz AND o'rniga OR ishlatsak
a yoki b ikkalasidan qay biri berilgan songa teng bo'lsa True javobi chiqaveradi.
3. Anti ddos
DDOS hujum bu biron bir saytga bir vaqtning o'zida keragidan foydalanuvchi ulanishiga aytiladi.
Ya'ni sizning severingizga bir vaqtda judaham ko'p foydalanuvchi ulangani sabab server barcha foydalanuvchilargaham javob berishga ulgurmaydi va serverda susasiy yuzaga keladi bazan kuchlik hujumlardan so'yg server 1 soat yoki 1 sutkagacha ishlamay qolib ketishi mumkin.
Misol uchun tez orada 20 avgust kunida bu holat
http://dtm.uz saytida kuzatiladi.