เราจะหารือถึงอันตรายของเอาต์พุตที่ไม่ถูกสุขลักษณะและให้วิธีที่ปลอดภัยในการแสดงผลเอาต์พุตที่จัดรูปแบบแล้ว
ไม่มีอันตรายจากการกรองเอาต์พุต
หากคุณเพิ่งได้รับข้อมูลจากผู้ใช้แล้วแสดงขึ้นมา คุณอาจทำให้หน้าผลลัพธ์ของคุณเสียหายได้ เช่น มีคนอาจฝัง JavaScript ในช่องป้อนข้อมูลที่พวกเขาส่งมาอย่างประสงค์ร้าย:
นี่คือความคิดเห็นของฉัน
<script language="javascript:
alert ('Do some bad ที่นี่!')">.
ด้วยวิธีนี้ แม้ว่าผู้ใช้จะไม่เป็นอันตราย แต่คำสั่ง HTML บางส่วนของคุณก็จะเสียหาย เช่น ตารางถูกขัดจังหวะกะทันหัน หรือหน้าเว็บแสดงไม่สมบูรณ์
แสดงเฉพาะข้อความที่ไม่ได้จัดรูปแบบ
นี่เป็นวิธีแก้ปัญหาที่ง่ายที่สุด คุณเพียงแค่แสดงข้อมูลที่ผู้ใช้ส่งมาเป็นข้อความที่ไม่ได้จัดรูปแบบ ใช้ฟังก์ชัน htmlspecialchars() เพื่อแปลงอักขระทั้งหมดเป็นการเข้ารหัส HTML
ตัวอย่างเช่น <b> จะถูกแปลงเป็น <b> ซึ่งจะทำให้มั่นใจได้ว่าจะไม่มีแท็ก HTML ที่ไม่คาดคิดออกมาในเวลาที่ไม่เหมาะสม
นี่เป็นวิธีแก้ปัญหาที่ดีหากผู้ใช้ของคุณสนใจเฉพาะเนื้อหาข้อความที่ไม่ได้จัดรูปแบบเท่านั้น แต่จะดีกว่าถ้าคุณให้ความสามารถในการจัดรูปแบบ
การจัดรูปแบบด้วย
แท็กมาร์กอัปที่กำหนดเองของผู้ใช้สำหรับการจัดรูปแบบ
คุณสามารถจัดเตรียมแท็กพิเศษให้ผู้ใช้ใช้ได้ ตัวอย่างเช่น คุณสามารถอนุญาตให้ใช้ [b]...[/b] เพื่อเน้นการแสดงผล [i].. .[/i ] การแสดงผลที่เป็นตัวเอียง เพียงค้นหาง่ายๆ และแทนที่การดำเนินการ: $output = str_replace("[b]", "<b>",
$output = str_replace("[i]", " <i >", $output);
ยิ่งไปกว่านั้น เราสามารถอนุญาตให้ผู้ใช้พิมพ์บางลิงค์ได้ ตัวอย่างเช่น ผู้ใช้จะได้รับอนุญาตให้ป้อน [link="url"]...[/link] ซึ่งเราจะแปลงเป็นคำสั่ง <a href="">...</a>
ในขณะนี้ เราไม่สามารถใช้การค้นหาแบบธรรมดา การแทนที่ควรทำโดยใช้นิพจน์ทั่วไป:
$output = ereg_replace('[link="([[:graph:]]+)"]', '<a href="1">' , $output);
การดำเนินการของ ereg_replace() คือ
การค้นหาสตริงที่ [link="..."] ปรากฏขึ้นและแทนที่ด้วย <a href="...">
[[:graph:]] หมายถึง อักขระที่ไม่ว่างเปล่า โปรดดูบทความที่เกี่ยวข้องสำหรับนิพจน์ทั่วไป
ฟังก์ชัน format_output() ใน outputlib.php ให้การแปลงแท็กเหล่านี้ หลักการโดยรวมคือ: China Network Management Alliance bitsCN.com
เรียก htmlspecialchars() เพื่อแปลงแท็ก HTML เป็นการเข้ารหัสพิเศษ กรองแท็ก HTML ที่ไม่ควรแสดงออก จากนั้น แปลงชุดแท็กที่กำหนดเองของเราให้เป็นแท็ก HTML ที่เกี่ยวข้อง
โปรดดูซอร์สโค้ดด้านล่าง:
<?php
ฟังก์ชั่น format_output($output) {
/****************************************** **********************************
* รับสตริงดิบ ($output) และจัดรูปแบบสำหรับเอาต์พุตโดยใช้อักขระพิเศษ
* ถอดมาร์กอัปที่คล้ายกับ HTML ออก
************************************************** * ******************************/
$output = htmlspecialchars(stripslashes($output));
/* ย่อหน้าใหม่ */
$output = str_replace('[p]', '<p>', $output);
/* ตัวหนา */
$output = str_replace('[b]', '<b>', $output);
$output = str_replace('[/b]', '</b>', $output);
/* ตัวเอียง */
$output = str_replace('[i]', '<i>', $output);
$output = str_replace('[/i]', '</i>', $output);การจัดการเครือข่าย bitscn_com
/* จัดรูปแบบแล้ว */
$output = str_replace('[pre]', '<pre>', $output);
$output = str_replace('[/pre]', '</pre>', $output);
/* บล็อกเยื้อง (blockquote) */
$output = str_replace('[เยื้อง]', '<blockquote>', $output);
$output = str_replace('[/indent]', '</blockquote>', $output);
/* จุดยึด */
$output = ereg_replace('[anchor="([[:graph:]]+)"]', '<a name="1"></a>', $output);
/* ลิงก์ โปรดทราบว่าเราพยายามป้องกันจาวาสคริปต์ในลิงก์ */
$output = str_replace('[link="javascript', '[link=" javascript', $output);
$output = ereg_replace('[link="([[:graph:]]+)"]', '<a href="1">', $output);
$output = str_replace('[/link]', '</a>', $output);
กลับ nl2br($เอาท์พุท);
-
?>
หมายเหตุบางประการ:
อย่าลืมแทนที่แท็กที่กำหนดเองเพื่อสร้างสตริงแท็ก HTML หลังจากเรียกใช้ฟังก์ชัน htmlspecialchars() ไม่ใช่ก่อนการเรียกนี้ ไม่เช่นนั้นการทำงานหนักของคุณจะสูญเปล่าหลังจากการเรียกโฟลว์ htmlspecialchars()
หลังจาก
แปลงการจัดการเครือข่าย bitscn_com
แล้ว โค้ด HTML การค้นหาจะถูกแทนที่ ตัวอย่างเช่น เครื่องหมายคำพูดคู่ "จะกลายเป็น"ฟังก์ชัน nl2br() จะแปลงอักขระขึ้นบรรทัดใหม่และการป้อนบรรทัดเป็นแท็ก <br> ซึ่งจะต้องด้วย อยู่หลัง htmlspecialchars()
เมื่อแปลง [links=""] เป็น <a href=""> คุณต้องแน่ใจว่าผู้ส่งจะไม่แทรก javascript วิธีง่ายๆ ในการเปลี่ยน [link="javascript เป็น [link=" javascript ด้วยวิธีนี้จะไม่ใช่ เปลี่ยนเพียงแสดงรหัสต้นฉบับ
outputlib.php
เรียก test.php ในเบราว์เซอร์ คุณสามารถดูการใช้ format_output()
แท็ก HTML ปกติไม่สามารถใช้งานได้ แทนที่ด้วยแท็กพิเศษต่อไปนี้:
- นี่คือ [b]bold[/b]
- นี่คือ [i]ตัวเอียง[/i]
- นี่คือ [link=" http://www.phpbuilder.com"] ลิงก์[/link]
- นี่คือ [anchor="test"]anchor และ [link="#test"]link[/link] ไปยัง Anchor
[p]ย่อหน้า
[pre]จัดรูปแบบล่วงหน้า[/pre]
[เยื้อง]ข้อความอินเทอร์เลซ[/เยื้อง]
แน่นอน
ว่าคุณสามารถเพิ่มแท็กเพิ่มเติมได้ตามความต้องการของคุณ Network Management Alliance bitsCN@com
บทสรุป การ
สนทนานี้เป็นวิธีการในการแสดงอินพุตของผู้ใช้อย่างปลอดภัย ซึ่งสามารถทำได้ ใช้ใน
ผู้ใช้ Message Board แนะนำระบบประกาศ
ในโปรแกรมดังต่อไปนี้
ระบบบีบีเอส