ในเว็บมีฟลายฟอร์มการส่งข้อมูล มีพวกเกรียน ยิง script ใส่ฟอร์มข้อมูล ผ่าน captcha ตัวเลข (captcha แบบง่ายๆ ซึ่ง captcha ดังกล่าวตั้งใจไว้เพียงกันการส่งฟอร์มไม่ให้ง่ายเกินไป )
การป้องกัน
จำกัดจำนวนครั้งที่สามารถส่งข้อมูลจาก IP หรือที่อยู่อีเมลเฉพาะได้ แบบไม่ใช้ฐานข้อมูล
โค้ดนี้ใช้ไฟล์<?php // ตั้งค่าจำนวนครั้งสูงสุดที่อนุญาต $max_attempts = 5; // เก็บ IP address ของผู้ใช้ $ip_address = $_SERVER['REMOTE_ADDR']; // เก็บที่อยู่อีเมลของผู้ใช้ $email_address = $_POST['email']; // เก็บจำนวนครั้งที่ส่งข้อมูล $attempts = 0; // ตรวจสอบว่ามีไฟล์บันทึกหรือไม่ if (file_exists('attempts.txt')) { // อ่านข้อมูลจากไฟล์บันทึก $attempts_data = file_get_contents('attempts.txt'); // แปลงข้อมูล JSON เป็น array $attempts_array = json_decode($attempts_data, true); // ตรวจสอบว่ามีข้อมูล IP address และที่อยู่อีเมลของผู้ใช้หรือไม่ if (isset($attempts_array[$ip_address])) { $attempts = $attempts_array[$ip_address]; } if (isset($attempts_array[$email_address])) { $attempts += $attempts_array[$email_address]; } } // ตรวจสอบว่าเกินจำนวนครั้งที่อนุญาตหรือไม่ if ($attempts >= $max_attempts) { // แสดงข้อความแจ้งเตือน echo 'คุณส่งข้อมูลเกินจำนวนครั้งที่อนุญาต'; exit; } // เพิ่มจำนวนครั้งที่ส่งข้อมูล $attempts++; // บันทึกข้อมูลการส่ง $attempts_array[$ip_address] = $attempts; $attempts_array[$email_address] = $attempts; // แปลง array เป็น JSON $attempts_data = json_encode($attempts_array); // บันทึกข้อมูลลงในไฟล์ file_put_contents('attempts.txt', $attempts_data); // ดำเนินการต่อด้วยการประมวลผลข้อมูล ?>
attempts.txt
เพื่อเก็บข้อมูลจำนวนครั้งที่ส่งข้อมูล
ตัวแปร$max_attempts
เก็บจำนวนครั้งสูงสุดที่อนุญาตให้ส่งข้อมูล
โค้ดจะดึง IP address และที่อยู่อีเมลของผู้ใช้
โค้ดจะอ่านข้อมูลจำนวนครั้งที่ส่งข้อมูลจากไฟล์
โค้ดจะตรวจสอบว่าเกินจำนวนครั้งที่อนุญาตหรือไม่
โค้ดจะเพิ่มจำนวนครั้งที่ส่งข้อมูล
โค้ดจะบันทึกข้อมูลจำนวนครั้งที่ส่งข้อมูลลงในไฟล์
วิธีที่ง่ายกว่านั้น เราสามารถใช้ session ตรวจสอบ IP ของผู้ใช้ได้
<?php
session_start();
// ตรวจสอบว่ามี session IP address หรือไม่
if (!isset($_SESSION['ip_address'])) {
// เก็บ IP address ของผู้ใช้
$_SESSION['ip_address'] = $_SERVER['REMOTE_ADDR'];
// ตั้งค่าจำนวนครั้งที่ส่งข้อมูล
$_SESSION['attempts'] = 0;
}
// เพิ่มจำนวนครั้งที่ส่งข้อมูล
$_SESSION['attempts']++;
// ตั้งค่าจำนวนครั้งสูงสุดที่อนุญาต
$max_attempts = 5;
// ตรวจสอบว่าเกินจำนวนครั้งที่อนุญาตหรือไม่
if ($_SESSION['attempts'] >= $max_attempts) {
// แสดงข้อความแจ้งเตือน
echo 'คุณส่งข้อมูลเกินจำนวนครั้งที่อนุญาต';
exit;
}
// ดำเนินการต่อด้วยการประมวลผลข้อมูล
?>
โค้ดนี้ใช้ session เก็บ IP address ของผู้ใช้
โค้ดจะตรวจสอบว่ามี session IP address หรือไม่
โค้ดจะเพิ่มจำนวนครั้งที่ส่งข้อมูล
โค้ดจะตั้งค่าจำนวนครั้งสูงสุดที่อนุญาต
โค้ดจะตรวจสอบว่าเกินจำนวนครั้งที่อนุญาตหรือไม่
หมายเหตุ:
คุณต้องปรับแต่งโค้ดนี้ให้เหมาะกับโครงการของคุณ
คุณสามารถปรับแต่งข้อความแจ้งเตือนได้
ตัวอย่างเพิ่มเติม:
คุณสามารถใช้ session เก็บข้อมูลอื่น ๆ เกี่ยวกับผู้ใช้ เช่น ที่อยู่อีเมล
คุณสามารถใช้ session ควบคุมการเข้าถึงหน้าเว็บ
คุณสามารถใช้ session เก็บข้อมูลตะกร้าสินค้า
ระยะเวลาที่ session เก็บ IP address ไว้ได้นั้น ขึ้นอยู่กับการตั้งค่า session ของคุณ โดยค่าเริ่มต้น session จะหมดอายุหลังจาก 24 นาที
อย่างไรก็ตาม คุณสามารถปรับแต่งค่าหมดอายุของ session ได้ดังนี้:
PHP
ini_set('session.gc_maxlifetime', 3600); // ตั้งค่า session หมดอายุหลังจาก 1 ชั่วโมง
การตั้งค่า session หมดอายุเร็วเกินไป อาจทำให้ผู้ใช้ต้องล็อกอินบ่อย
การตั้งค่า session หมดอายุช้าเกินไป อาจทำให้ผู้ใช้เสี่ยงต่อการถูกแฮ็ค
ค่าเริ่มต้น session ของ PHP จะหมดอายุหลังจาก 24 นาที
ดังนั้น โค้ดตัวอย่างนั้น session จะหมดอายุหลังจาก 24 นาที โดยไม่ต้องกำหนดอะไรเพิ่มเติม
สาเหตุที่ฉันไม่ได้เขียนโค้ดส่วนที่กำหนด 24 นาที:
เพื่อความเรียบง่าย
เพื่อให้โค้ดสั้นกระชับ
เพราะค่าเริ่มต้นของ session อยู่ที่ 24 นาที อยู่แล้ว
อย่างไรก็ตาม คุณสามารถปรับแต่งค่าหมดอายุของ session ได้
ไม่เชิงว่า 24 นาทีเป็นค่าสากล แต่เป็นค่าเริ่มต้นของ session ของ PHP
ค่าเริ่มต้น 24 นาที อาจจะสั้นเกินไปสำหรับบางกรณี และอาจจะยาวเกินไปสำหรับบางกรณี
ปัจจัยที่ส่งผลต่อค่าหมดอายุของ session:
ประเภทของเว็บไซต์
ประเภทของข้อมูลที่เก็บใน session
พฤติกรรมของผู้ใช้
ตัวอย่าง:
เว็บไซต์ที่ผู้ใช้เข้าใช้งานบ่อย อาจจะตั้งค่า session หมดอายุเร็วกว่าเว็บไซต์ที่ผู้ใช้เข้าใช้งานไม่บ่อย
เว็บไซต์ที่เก็บข้อมูล sensitive อาจจะตั้งค่า session หมดอายุเร็วกว่าเว็บไซต์ที่เก็บข้อมูลทั่วไป
เว็บไซต์ที่มีผู้ใช้จำนวนมาก อาจจะตั้งค่า session หมดอายุเร็วกว่าเว็บไซต์ที่มีผู้ใช้จำนวนน้อย
แนวทางการตั้งค่าค่าหมดอายุของ session:
พิจารณาปัจจัยที่ส่งผลต่อค่าหมดอายุของ session
ทดสอบค่าหมดอายุของ session กับผู้ใช้จริง
ปรับแต่งค่าหมดอายุของ session จนกว่าจะเหมาะสมกับเว็บไซต์ของคุณ
สรุป:
24 นาทีเป็นค่าเริ่มต้นของ session ของ PHP
คุณสามารถปรับแต่งค่าหมดอายุของ session ได้
ไม่มีค่าสากลสำหรับค่าหมดอายุของ session
คุณต้องพิจารณาปัจจัยที่ส่งผลต่อค่าหมดอายุของ session
คุณต้องทดสอบค่าหมดอายุของ session กับผู้ใช้จริง
คุณต้องปรับแต่งค่าหมดอายุของ session จนกว่าจะเหมาะสมกับเว็บไซต์ของคุณ
ริงๆแล้ว 24 นาที ไม่ได้เป็นค่าที่ตายตัว แต่เป็นค่าเริ่มต้นที่ PHP กำหนดมาให้
สาเหตุที่ PHP กำหนดค่าเริ่มต้นไว้ที่ 24 นาที น่าจะมีหลายสาเหตุ เช่น:
เพื่อความสมดุลระหว่างความปลอดภัยและความสะดวกของผู้ใช้
เพื่อป้องกัน session หมดอายุเร็วเกินไป ทำให้ผู้ใช้ต้องล็อกอินบ่อย
เพื่อป้องกัน session หมดอายุช้าเกินไป ทำให้ผู้ใช้เสี่ยงต่อการถูกแฮ็ค
อย่างไรก็ตาม คุณสามารถปรับแต่งค่าหมดอายุของ session ได้
ปัจจัยที่ควรพิจารณาในการปรับแต่งค่าหมดอายุของ session:
ประเภทของเว็บไซต์
ประเภทของข้อมูลที่เก็บใน session
พฤติกรรมของผู้ใช้
ตัวอย่าง:
เว็บไซต์ที่ผู้ใช้เข้าใช้งานบ่อย อาจจะตั้งค่า session หมดอายุเร็วกว่าเว็บไซต์ที่ผู้ใช้เข้าใช้งานไม่บ่อย
เว็บไซต์ที่เก็บข้อมูล sensitive อาจจะตั้งค่า session หมดอายุเร็วกว่าเว็บไซต์ที่เก็บข้อมูลทั่วไป
เว็บไซต์ที่มีผู้ใช้จำนวนมาก อาจจะตั้งค่า session หมดอายุเร็วกว่าเว็บไซต์ที่มีผู้ใช้จำนวนน้อย
แนวทางการตั้งค่าค่าหมดอายุของ session:
พิจารณาปัจจัยที่ส่งผลต่อค่าหมดอายุของ session
ทดสอบค่าหมดอายุของ session กับผู้ใช้จริง
ปรับแต่งค่าหมดอายุของ session จนกว่าจะเหมาะสมกับเว็บไซต์ของคุณ
สรุป:
24 นาทีเป็นค่าเริ่มต้นของ session ของ PHP
คุณสามารถปรับแต่งค่าหมดอายุของ session ได้
ไม่มีค่าสากลสำหรับค่าหมดอายุของ session
คุณต้องพิจารณาปัจจัยที่ส่งผลต่อค่าหมดอายุของ session
คุณต้องทดสอบค่าหมดอายุของ session กับผู้ใช้จริง
คุณต้องปรับแต่งค่าหมดอายุของ session จนกว่าจะเหมาะสมกับเว็บไซต์ของคุณ
เว็บไซต์บางแห่งอาจระบุค่าเริ่มต้นของ session ไว้ที่ 30 นาที หรือ 180 นาที
สาเหตุที่ค่าเริ่มต้นไม่ตรงกัน อาจเป็นเพราะ:
เว็บไซต์ใช้ PHP เวอร์ชันที่แตกต่างกัน
เว็บไซต์มีการปรับแต่งค่าเริ่มต้นของ session
เว็บไซต์อ้างอิงข้อมูลจากแหล่งที่ไม่น่าเชื่อถือ
ค่าเริ่มต้นของ session ของ PHP ขึ้นอยู่กับเวอร์ชันของ PHP ที่ใช้:
PHP เวอร์ชัน 5.3.0 ขึ้นไป ค่าเริ่มต้นของ session อยู่ที่ 24 นาที
PHP เวอร์ชัน 5.2.0 ถึง 5.2.12 ค่าเริ่มต้นของ session อยู่ที่ 30 นาที
PHP เวอร์ชัน 4.4.0 ถึง 5.1.6 ค่าเริ่มต้นของ session อยู่ที่ 180 นาที
เว็บไซต์อาจมีการปรับแต่งค่าเริ่มต้นของ session:
เว็บไซต์อาจใช้ฟังก์ชัน ini_set() เพื่อปรับแต่งค่าเริ่มต้นของ session
เว็บไซต์อาจใช้ไฟล์ php.ini เพื่อปรับแต่งค่าเริ่มต้นของ session
เว็บไซต์อาจอ้างอิงข้อมูลจากแหล่งที่ไม่น่าเชื่อถือ:
เว็บไซต์อาจอ้างอิงข้อมูลจากเว็บไซต์อื่นที่ outdated
เว็บไซต์อาจอ้างอิงข้อมูลจากเอกสารที่ไม่ถูกต้อง
วิธีตรวจสอบค่าเริ่มต้นของ session ของเว็บไซต์:
ดูเอกสารประกอบของ PHP เวอร์ชันที่เว็บไซต์ใช้
ตรวจสอบไฟล์ php.ini ของเว็บไซต์
ใช้ฟังก์ชัน ini_get() ดังนี้:
PHP
$session_gc_maxlifetime = ini_get('session.gc_maxlifetime');
echo 'ค่าเริ่มต้นของ session อยู่ที่ ' . $session_gc_maxlifetime . ' นาที';
Use code with caution. Learn more
สรุป:
ค่าเริ่มต้นของ session ของ PHP อยู่ที่ 24 นาที
เว็บไซต์บางแห่งอาจระบุค่าเริ่มต้นไว้ที่ 30 นาที หรือ 180 นาที
สาเหตุที่ค่าเริ่มต้นไม่ตรงกัน อาจเป็นเพราะเว็บไซต์ใช้ PHP เวอร์ชันที่แตกต่างกัน เว็บไซต์มีการปรับแต่งค่าเริ่มต้นของ session หรือเว็บไซต์อ้างอิงข้อมูลจากแหล่งที่ไม่น่าเชื่อถือ
คุณสามารถตรวจสอบค่าเริ่มต้นของ session ของเว็บไซต์ได้ โดยดูเอกสารประกอบของ PHP เวอร์ชันที่เว็บไซต์ใช้ ตรวจสอบไฟล์ php.ini ของเว็บไซต์ หรือใช้ฟังก์ชัน ini_get()
session สามารถหมดได้เมื่อออกจาก browser ทำให้คนร้ายต้องเข้าเว็บใหม่ ซึ่งก็ทำได้ไม่ยากแค่เขียนโค๊ดให้เปิดเว็บใหม่ในกระบวนการแรก
<?php
session_start();
// กำหนดค่า session_cache_expire ใน php.ini หรือ .htaccess
ini_set('session.cache_expire', 10); // 300 วินาที (5 นาที)
if (!isset($_SESSION['ip_address'])) {
$_SESSION['ip_address'] = $_SERVER['REMOTE_ADDR'];
$_SESSION['attempts'] = 0;
$_SESSION['start_time'] = time(); // บันทึกเวลาเริ่มต้น
}
$_SESSION['attempts']++;
$max_attempts = 5;
$session_timeout = 10; // 300 วินาที (5 นาที)
if ($_SESSION['attempts'] >= $max_attempts) {
echo 'คุณส่งข้อมูลเกินจำนวนครั้งที่อนุญาต';
exit;
}
// ตรวจสอบว่า session หมดอายุหรือไม่
if ((time() - $_SESSION['start_time']) > $session_timeout) {
session_destroy();
echo 'Session หมดอายุ กรุณาลองใหม่';
exit;
}
?>
<div style="text-align:center">
<form method="post">
<input type="password" name="password" placeholder="กรอกรหัสผ่าน">
<button type="submit">ทำลายเซสชั่น</button>
</form>
</div>
เราจะไม่ใช้ โค๊ดนี้ เพราะ มีผลกับ ninja firewall จะ block IP โค๊ดนี้เก็บ IP ใน session
ninja firewall ดึงค่าดังกล่าวไปเข้า script
ที่เคยใช้
<?php
session_start();
// code นี้ส่งผลต่อ dashboard ของ wordpress เว็บทั้งหมด ที่ใช้ใน device เดียวกัน เช่น pc ดังนั้น ต้องเพิ่ม โค๊ดทำลาย session ip address โดยใส่รหัสผ่าน
// ตรวจสอบว่ามี session IP address หรือไม่ (ใช้ sesstion เก็บ ip ป้องกันสแปมฟอร์มส่งข้อมูล)
if (!isset($_SESSION['ip_address'])) {
// เก็บ IP address ของผู้ใช้
$_SESSION['ip_address'] = $_SERVER['REMOTE_ADDR'];
// ตั้งค่าจำนวนครั้งที่ส่งข้อมูล
$_SESSION['attempts'] = 0;
}
// เพิ่มจำนวนครั้งที่ส่งข้อมูล
$_SESSION['attempts']++;
// ตั้งค่าจำนวนครั้งสูงสุดที่อนุญาต
$max_attempts = 5;
// เพิ่มฟิลด์รหัสผ่าน
if (!isset($_SESSION['password'])) {
$_SESSION['password'] = 'cymiz'; // ตั้งค่ารหัสผ่านเริ่มต้น
}
// ตรวจสอบว่าเกินจำนวนครั้งที่อนุญาตหรือไม่
if ($_SESSION['attempts'] >= $max_attempts) {
// แสดงข้อความแจ้งเตือน
echo '<center>';
echo 'คุณส่งข้อมูลเกินจำนวนครั้งที่อนุญาต';
echo '</center>';
echo "<script>";
echo "setTimeout(function() {";
echo "window.location.href = 'warning.php';";
echo "}, 1000);"; // Redirect after 1 seconds
echo "</script>";
exit;
}
// ตรวจสอบรหัสผ่าน
if (isset($_POST['password']) && $_POST['password'] === $_SESSION['password']) {
// รหัสผ่านถูกต้อง ทำลายเซสชั่น
session_destroy();
echo 'เซสชั่นของคุณถูกลบเรียบร้อย';
exit;
} else {
// รหัสผ่านไม่ถูกต้อง แสดงข้อความแจ้งเตือน
echo 'รหัสผ่านไม่ถูกต้อง กรุณาลองอีกครั้ง';
}
// ดำเนินการต่อด้วยการประมวลผลข้อมูล
?>
<div style="text-align:center">
<form method="post">
<input type="password" name="password" placeholder="กรอกรหัสผ่าน">
<button type="submit">ทำลายเซสชั่น</button>
</form>
</div>
<!DOCTYPE html>
<head>
<title>ระบบประกันออนไลน์ สมัคร | ขอใบเสนอ | ติดต่อ</title>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1">
<body style="background: #000;overflow: hidden;>
<?php
include_once ('ask.php');
?>
<style>
input[type=text], select, textarea {
width: 100%;
max-width:50%;
padding: 5px !important;
border: 1px solid #ccc;
border-radius: 4px;
box-sizing: border-box;
margin-top: 6px;
margin-bottom: 5px;
resize: vertical;
}
.button-red {
background-color: #ff0000;
background-image: -webkit-linear-gradient(top, #ff0000 0%, #c70000 50%, #a90000 50%, #b00000 100%);
background-image: -webkit-linear-gradient(top,#ff0000 0%, #c70000 50%, #a90000 50%, #b00000 100%);
background-image: linear-gradient(to bottom,#ff0000 0%, #c70000 50%, #a90000 50%, #b00000 100%);
border: 1px solid #8a0000;
border-bottom-width: 1px;
border-bottom-style: solid;
border-bottom-color: rgb(138, 0, 0);
border-bottom: 1px solid #810000;
border-radius: 5px;
box-shadow: inset 0 1px 0 0 #ff1d0c;
color: white;
display: inline-block;
font-size: inherit;
font-weight: bold;
padding: 12px 18px 10px 18px;
text-align: center;
text-decoration: none;
text-shadow: 0 -1px 1px #730000;
background: #ff8900 !important;
background: -moz-linear-gradient(top, #ff8900 0%, #ff3d00 100%) !important;
background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#ff8900), color-stop(100%,#ff3d00)) !important;
background: -webkit-linear-gradient(top, #ff8900 0%,#ff3d00 100%) !important;
background: -o-linear-gradient(top, #ff8900 0%,#ff3d00 100%) !important;
background: -ms-linear-gradient(top, #ff8900 0%,#ff3d00 100%) !important;
background: linear-gradient(to bottom, #ff8900 0%,#ff3d00 100%) !important;
border: 1px solid #f60;
border-bottom-color: #e20;
box-shadow: inset #f20 0 -5px 15px, inset #fc6 0 1px 1px, rgba(0,0,0,.15) 0px 1px 1px;
}
</style>
<!-- ................. -->
<?php include $_SERVER['DOCUMENT_ROOT'].'/fire.html' ?>
<!-- ................. -->
<form action="request1.php" method="post" enctype="multipart/form-data" name="frmMain">
<div style="display:none;"><input name="code" type="text" value="<?php echo $_GET["code"]; ?>" /></div>
<div align="center">
<!-- เริ่มส่วนของการบวกเลข = ส่วนที่2 -->
<font color="red" style="font-weight:bold;font-family:fantasy;font-size:1.2em;">
<?php echo $_SESSION['rand_x']; ?> + <?php echo $_SESSION['rand_y']; ?><br><br><input type="text" name="rand_ans" size="10" placeholder="ให้ท่านใส่คำตอบ จากผลบวกตัวเลขด้านบน" required/></font>
<!-- จบส่วนของการบวกเลข -->
<input class="button-red" type="submit" name="submit" value="OK">
<br><div style="
color: #9e9e9e;
font-family: kanit;
font-size: 13px;"><strong style="color:orangered">"ซื้อผ่านเรา เราดูแลคุณ"</strong></div><br>
</div>
</form>
การประยุกต์ใช้
ป้องกันการเข้าถึง dashboard ของ wordpress จากการใช้ share internet ( ซึ่งทุกคนจะเป็น ไอพีเดียวกัน) เราลง ninja และ อัพโค๊ด session นี้ขึ้นเว็บแล้วรันคำสั่งจนเข้าด้วย ip นี้ไม่ได้ ต่อไปการจะเข้าได้ต้องใช้ ip หรือ คือ internet อื่น
ถามผู้พัฒนา
NinjaFirewall doesn’t block IP, instead it blocks the request.
Can you go to “NinjaFirewall > Logs”, and look in the log for the lines that show your blocked IP address, and paste them here (you can anonymize (ไม่ระบุชื่อ) your IP). That will tell us why you were blocked.