นี้และบทถัดไปแสดงวิธีการใช้ PHP ในการตรวจสอบข้อมูลในแบบฟอร์ม
PHP ตรวจสอบแบบฟอร์ม
คิดว่าการรักษาความปลอดภัยเมื่อการประมวลผลรูปแบบ PHP!
หน้านี้จะแสดงวิธีการที่จะดำเนินการในรูปแบบ PHP กับการรักษาความปลอดภัยในใจ ตรวจสอบความถูกต้องของข้อมูลรูปแบบเป็นสิ่งสำคัญในการปกป้องแบบฟอร์มของคุณจากแฮกเกอร์และสแปมเมอร์!
รูปแบบ HTML เราจะทำงานที่ในบทเหล่านี้มีช่องใส่ต่างๆ: จำเป็นและเขตเลือกข้อความปุ่มและปุ่มส่ง:
กฎการตรวจสอบรูปแบบดังกล่าวข้างต้นมีดังนี้
สนาม | กฎการตรวจสอบ |
---|---|
ชื่อ | จำเป็นต้องใช้ + เพียงจะต้องประกอบด้วยตัวอักษรและช่องว่าง |
จำเป็นต้องใช้ + ต้องมีที่อยู่อีเมลที่ถูกต้อง (with @ and .) | |
เว็บไซต์ | ไม่จำเป็น. ถ้ามีก็ต้องมี URL ที่ถูกต้อง |
คิดเห็น | ไม่จำเป็น. ช่องใส่หลายสาย (textarea) |
เพศ | จำเป็นต้องใช้ ต้องเลือกอย่างใดอย่างหนึ่ง |
ครั้งแรกที่เราจะดูที่รหัส HTML ธรรมดาสำหรับรูปแบบ:
ฟิลด์ข้อความ
ชื่อ, อีเมล์และสาขาที่เว็บไซต์เป็นองค์ประกอบการป้อนข้อความและข้อมูลการแสดงความคิดเห็นเป็น textarea รหัส HTML ลักษณะเช่นนี้:
Name: <input type="text" name="name">
E-mail: <input type="text" name="email">
Website:
<input type="text" name="website">
Comment:
<textarea name="comment" rows="5" cols="40"></textarea>
ปุ่มวิทยุ
ฟิลด์เพศจะมีปุ่มวิทยุและรหัส HTML ลักษณะเช่นนี้:
Gender:
<input type="radio" name="gender"
value="female">Female
<input type="radio" name="gender" value="male">Male
แบบฟอร์มธาตุ
รหัส HTML ของรูปแบบที่มีลักษณะเช่นนี้
<form method="post" action="<?php echo
htmlspecialchars($_SERVER["PHP_SELF"]);?>">
เมื่อส่งแบบฟอร์ม, แบบฟอร์มข้อมูลจะถูกส่งด้วยวิธี = "โพสต์"
ราคา $ _SERVER [ "PHP_SELF"] ตัวแปรคืออะไร?
ราคา $ _SERVER [ "PHP_SELF"] เป็นตัวแปรทั่วโลกสุดที่ส่งกลับชื่อไฟล์ของสคริปต์ในขณะนี้การดำเนินการ
ดังนั้น $ _SERVER [ "PHP_SELF"] ส่งข้อมูลแบบฟอร์มส่งไปยังหน้าของตัวเองแทนการกระโดดไปยังหน้าเว็บที่แตกต่างกัน วิธีนี้ผู้ใช้จะได้รับข้อความแสดงข้อผิดพลาดบนหน้าเช่นเดียวกับรูปแบบ
อะไรคือสิ่งที่ htmlspecialchars() ฟังก์ชั่น?
htmlspecialchars() ฟังก์ชันแปลงอักขระพิเศษไปยังหน่วยงาน HTML ซึ่งหมายความว่ามันจะเข้ามาแทนที่ตัวอักษร HTML เช่น <และ> กับ & lt; และ & gt ;. นี้จะช่วยป้องกันการโจมตีจากการใช้ประโยชน์จากรหัสโดยการฉีด HTML หรือรหัส Javascript (Cross-site Scripting attacks) ในรูปแบบ
หมายเหตุบิ๊ก PHP แบบฟอร์มการรักษาความปลอดภัย
ราคา $ _SERVER [ "PHP_SELF"] ตัวแปรสามารถนำมาใช้โดยแฮกเกอร์!
หาก PHP_SELF ใช้ในหน้าเว็บของคุณแล้วผู้ใช้สามารถใส่ทับ (/) แล้วบาง Cross Site Scripting (XSS) คำสั่งที่จะดำเนินการ
cross-site scripting (XSS) คือประเภทของช่องโหว่ความปลอดภัยคอมพิวเตอร์มักจะพบในการใช้งานเว็บ XSS ช่วยให้ผู้โจมตีสามารถฉีดสคริปต์ฝั่งไคลเอ็นต์ลงในหน้าเว็บดูได้โดยผู้ใช้อื่น ๆ
สมมติว่าเรามีรูปแบบต่อไปนี้ในเพจชื่อ "test_form.php" :
<form method="post" action="<?php echo $_SERVER["PHP_SELF"];?>">
ตอนนี้ถ้าผู้ใช้ป้อน URL ที่ปกติในแถบที่อยู่เช่น "http://www.example.com/test_form.php" รหัสดังกล่าวข้างต้นจะได้รับการแปลเป็นภาษา:
<form method="post" action="test_form.php">
เพื่อให้ห่างไกลดังนั้นดี
แต่พิจารณาว่าผู้ใช้ป้อน URL ต่อไปนี้ในแถบที่อยู่:
http://www.example.com/test_form.php/%22%3E%3Cscript%3Ealert('hacked')%3C/script%3E
ในกรณีนี้โค้ดข้างต้นจะได้รับการแปลเป็นภาษา:
<form method="post" action="test_form.php/"><script>alert('hacked')</script>
รหัสนี้จะเพิ่มแท็กสคริปต์และคำสั่งแจ้งเตือน และเมื่อโหลดหน้าเว็บรหัส JavaScript จะถูกดำเนินการ (the user will see an alert box) นี่เป็นเพียงตัวอย่างง่ายๆและไม่เป็นอันตรายวิธีตัวแปร PHP_SELF สามารถใช้ประโยชน์
โปรดทราบว่าโค้ด JavaScript ใด ๆ ที่สามารถเพิ่มภายใน <script> แท็ก! แฮกเกอร์สามารถเปลี่ยนเส้นทางผู้ใช้ไปยังแฟ้มบนเซิร์ฟเวอร์อื่นและไฟล์ที่สามารถเก็บรหัสที่เป็นอันตรายที่สามารถปรับเปลี่ยนตัวแปรทั่วโลกหรือส่งแบบฟอร์มไปยังที่อยู่อื่นในการบันทึกข้อมูลผู้ใช้ตัวอย่างเช่น
วิธีการหลีกเลี่ยง $ _SERVER [ "PHP_SELF"] หาประโยชน์?
$ _SERVER [ "PHP_SELF"] หาประโยชน์สามารถหลีกเลี่ยงได้โดยการใช้ htmlspecialchars() ฟังก์ชั่น
รหัสรูปแบบควรมีลักษณะเช่นนี้
<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">
htmlspecialchars() ฟังก์ชันแปลงอักขระพิเศษไปยังหน่วยงาน HTML ตอนนี้ถ้าผู้ใช้พยายามที่จะใช้ประโยชน์จากตัวแปร PHP_SELF ก็จะส่งผลในการส่งออกต่อไปนี้:
<form method="post" action="test_form.php/"><script>alert('hacked')</script>">
ใช้ประโยชน์ความพยายามที่ล้มเหลวและไม่มีอันตรายใด ๆ จะทำ!
ตรวจสอบข้อมูลในแบบฟอร์มด้วย PHP
สิ่งแรกที่เราจะทำคือการผ่านตัวแปรทั้งหมดผ่านของ PHP htmlspecialchars() ฟังก์ชั่น
เมื่อเราใช้ htmlspecialchars() ฟังก์ชั่น; แล้วถ้าผู้ใช้พยายามที่จะส่งต่อไปนี้ในฟิลด์ข้อความ:
<script> สถานที่ตั้ง href('http://www.hacked.com') </ script>
- นี้จะไม่ได้รับการดำเนินการเพราะมันจะได้รับการบันทึกเป็น HTML หนีรหัสเช่นนี้
& lt; สคริปต์ & gt; สถานที่ตั้ง href('http://www.hacked.com') & lt; / script & gt;
รหัสคือตอนนี้ปลอดภัยที่จะปรากฏบนหน้าหรือภายในอีเมล
นอกจากนี้เรายังจะทำสองสิ่งที่มากขึ้นเมื่อผู้ใช้ส่งรูปแบบ:
- ตัวอักษรที่ไม่จำเป็น Strip (extra space, tab, newline) จากข้อมูลที่ผู้ใช้ป้อน (with the PHP trim() ฟังก์ชั่น)
- ลบทับขวา (\) จากข้อมูลที่ผู้ใช้ป้อน (with the PHP stripslashes() ฟังก์ชั่น)
ขั้นตอนต่อไปคือการสร้างฟังก์ชั่นที่จะทำการตรวจสอบทั้งหมดของเรา (which is much more convenient than writing the same code over and over again)
เราจะตั้งชื่อฟังก์ชัน test_input()
ตอนนี้เราสามารถตรวจสอบแต่ละ $ _POST ตัวแปรกับ test_input() ฟังก์ชั่นและสคริปต์ที่มีลักษณะเช่นนี้
ตัวอย่าง
<?php
// define variables and set to empty values
$name =
$email = $gender = $comment = $website = "";
if
($_SERVER["REQUEST_METHOD"] == "POST") {
$name =
test_input($_POST["name"]);
$email = test_input($_POST["email"]);
$website = test_input($_POST["website"]);
$comment =
test_input($_POST["comment"]);
$gender = test_input($_POST["gender"]);
}
function test_input($data) {
$data = trim($data);
$data =
stripslashes($data);
$data = htmlspecialchars($data);
return $data;
}
?>
ตัวอย่างเช่นเรียกใช้» ขอให้สังเกตว่าในช่วงเริ่มต้นของสคริปต์ที่เราตรวจสอบว่ารูปแบบที่ได้รับการส่งโดยใช้ $ _SERVER [ "REQUEST_METHOD"] หาก REQUEST_METHOD คือโพสต์แล้วรูปแบบที่ได้รับการส่ง - และมันควรจะถูกตรวจสอบ ถ้ามันยังไม่ได้ถูกส่งข้ามการตรวจสอบและแสดงฟอร์มที่ว่างเปล่า
อย่างไรก็ตามในตัวอย่างข้างต้นช่องใส่ทั้งหมดเป็นตัวเลือก สคริปต์ที่ทำงานได้ดีแม้ว่าผู้ใช้จะไม่ป้อนข้อมูลใด ๆ
ขั้นตอนต่อไปคือการทำให้ช่องใส่ต้องและสร้างข้อความผิดพลาดในกรณีที่จำเป็น