Register Register Member Login Member Login Member Login Forgot Password ??
PHP , ASP , ASP.NET, VB.NET, C#, Java , jQuery , Android , iOS , Windows Phone
 

Registered : 109,027

HOME > บทความจากสมาชิก > สิ่งที่ทุกคนต้องรู้ ในการเขียนโปรแกรมแสดงผลในรูปแบบ HTML (ทำเว็บไซต์) ด้วย PHP หากไม่อยากให้ระบบที่เขียนนั้นถูก HACK ได้ !!!



 
Clound SSD Virtual Server

สิ่งที่ทุกคนต้องรู้ ในการเขียนโปรแกรมแสดงผลในรูปแบบ HTML (ทำเว็บไซต์) ด้วย PHP หากไม่อยากให้ระบบที่เขียนนั้นถูก HACK ได้ !!!



ติดตามบทความล่าสุดของผู้เขียนได้ที่ phpinfo() Facebook Page



สิ่งที่ทุกคนต้องรู้ ในการเขียนโปรแกรมแสดงผลในรูปแบบ HTML (ทำเว็บไซต์) ด้วย PHP หากไม่อยากให้ระบบที่เขียนนั้นถูก HACK ได้ !!!

คงเป็นที่ทราบกันดีอยู่แล้วว่า HTML/XML มีรูปแบบอย่างไร

<b> tag เปิด <a href="https://www.thaicreate.com"> tag เปิดที่มี attribute <a href='https://www.thaicreate.com'> tag เปิดที่มี attribute แบบใช้ ' เป็นเครื่องหมายเปิดและปิด </a> tag ปิด <br /> empty tag <img src="images/test.jpg" /> empty tag ที่มี attribute &nbsp; entity reference


จะสังเกตเห็นได้ว่า ตัวอักษรที่สำคัญ ที่ทำให้มองว่าเป็น HTML/XML นั้นได้แก่

< เครื่องหมายน้อยกว่า entity reference คือ &lt; > เครื่องหมายมากกว่า entity reference คือ &gt; " เครื่องหมายคำพูด entity reference คือ &quot; ' เครื่องหมายคำพูด entity reference คือ &apos; หรือ &#039; & แอมเพอร์แซนด์ entity reference คือ &amp;


ซึ่งหากเราจะใช้ตัวอักษรเหล่านี้ใน HTML เรา "ควรใช้" entity reference
และ "ต้องใช้" ใน XML สำหรับ < และ &

เช่น
น่ารักจุงเบย &gt;&lt; อยากกินเค้ก S&amp;P อ่ะ <img title="นี่คือภาพวาดที่สวย &quot;ที่สุด&quot; ในโลก" src="images/painting.jpg" />





PHP มีฟังก์ชั่นที่จะช่วยแปลงตัวอักษรพิเศษเหล่านี้ให้เป็น entity reference นั่นก็คือฟังก์ชั่นที่มีชื่อน่าเกลียดที่สุดในโลก htmlspecialchars() นั่นเอง โดยมีรูปแบบการใช้

htmlspecialchars($string [, $flags [, [$encoding [, $double_encode]]]) $string คือค่าที่ต้องการจะแปลง เป็นชนิดสตริง $flags คือตัวเลือกที่จะกำหนดว่าจะแปลงอะไรบ้าง โดยมีค่าคงที่ที่ควรรู้ดังนี้ - ENT_COMPAT จะแปลง " แต่ปล่อย ' ไว้เหมือนเดิม - ENT_QUOTES จะแปลงทั้ง " และ ' - ENT_NOQUOTES ไม่แปลงทั้ง " และ ' หากไม่กำหนด ค่าปกติคือ ENT_COMPAT $encoding คือ encoding ที่ใช้ในการค้นหาตัวอักษรเพื่อแปลง หากไม่กำหนด ค่าปกติคือ 'ISO-8859-1' (แต่เป็น 'UTF-8' ใน PHP 5.4+) $double_encode หากเป็น true จะแปลง & ทุกตัวที่เจอให้เป็น &amp; โดยไม่สนว่าหลัง & นั้นๆ มันเป็น entity reference อยู่แล้วหรือไม่ เช่น &quot; จะกลายเป็น &amp;quot; ค่าปกติคือ true


echo htmlspecialchars('1 < 10'); // 1 &lt; 10
echo htmlspecialchars('100 > 10'); // 100 &gt; 10
echo htmlspecialchars('A&W'); // A&amp;W
echo htmlspecialchars('PHP, which stands for "PHP: Hypertext Preprocessor"'); // PHP, which stands for &quot;PHP: Hypertext Preprocessor&quot;
echo htmlspecialchars("I'm a boy."); // I'm a boy.
echo htmlspecialchars("I'm not a girl.", ENT_QUOTES); // I&#039;m a girl.

echo htmlspecialchars('สวัสดี &quot;ชาวโลก&quot;', ENT_COMPAT, 'UTF-8');
// $double_encode = true จะทำการแปลง & ซ้ำ แม้จะเป็น entity reference อยู่แล้ว
// สวัสดี &amp;quot;ชาวโลก&amp;quot;

echo htmlspecialchars('สวัสดี &quot;ชาวโลก&quot;', ENT_COMPAT, 'UTF-8', false);
// $double_encode = false จะไม่แปลง entity reference ซ้ำ
// สวัสดี &quot;ชาวโลก&quot;





ทำไมต้องใช้?

อาจจะสงสัยกันว่าที่บ่นมายืดยาวนี่เพื่ออะไร เกี่ยวกับการป้องกันการ HACK อย่างไร

สมมติว่าเราเขียนเว็บบอร์ด ซึ่งโดยพื้นฐานเป็นโปรแกรมที่ต้องรับค่ามาจากผู้ใช้ ไม่ว่าจะเป็นข้อความ หรือชื่อ
และผู้ใช้พิมพ์ข้อความที่มี HTML Tag หรือ javascript และเรา output ค่าที่รับมาออกไปตรงๆ โดยไม่ผ่าน htmlspecialchars() ก็จะทำให้เกิดผลที่ไม่คาดคิด

<?php while (($row = mysql_fetch_assoc($result))): ?>
<div class="message">
<?php echo $row['message']; ?>
<hr />
<?php echo $row['username']; ?>
</div>
<?php endwhile; ?>


จากโค้ดตัวอย่างข้างบน ซึ่งเป็นโค้ดที่จะแสดงข้อความของผู้ใช้จากฐานข้อมูล
หากมีผู้ใช้สักคนตั้งกระทู้และพิมพ์ข้อความแบบนี้

อยากทราบว่าจะเริ่มต้นศึกษา PHP ได้อย่างไร <hr /> มือใหม่ </div> <div class="message"> คุณนี่มันโง่จริงๆ <hr /> webmaster </div> <div class="message"> อ้าว ทำไมเว็บมาสเตอร์พูดอย่างนี้ล่ะครับ T T


ก็จะสามารถจัดรูปแบบให้ดูเหมือนมีคนหลายคนกำลังคุยโต้ตอบกันได้

หรือหากมีใครพิมพ์ข้อความแบบนี้

<script>while(true)alert("555");</script>


จะทำให้มี alert popup โผล่ขึ้นมาไม่รู้จบเมื่อเปิดกระทู้นั้นดู
การกระทำแบบนี้เรียกว่า XSS (Cross-site scripting)

ดังนั้นเวลาที่จะแสดงผลข้อมูลที่รับมาจากผู้ใช้
หากข้อมูลนั้นไม่ได้มีรูปแบบที่แน่ชัด เช่น id หรือ วันที่
เราควรที่จะต้องใช้ htmlspecialchars() เพื่อแปลงตัวอักษรพิเศษให้เป็น entity reference
แม้แต่ข้อมูลที่สั้นๆ เช่น ชื่อ นามสกุล อย่าคิดเอาเองว่าจะไม่มีโอกาสที่การก่อกวน หรือการ HACK ดังกล่าวจะเกิดขึ้น
เพราะการก่อกวนด้วย javascript นั้น
แค่ <script>for(;;)alert(1);</script>
ก็สามารถสั่งให้มี alert popup โผล่ขึ้นมาไม่รู้จบได้แล้ว โดยโค้ดยาวแค่ 34 ตัวอักษรเท่านั้น




แต่หลายๆ คนคงขี้เกียจจะใช้ htmlspecialchars() เนื่องด้วยความยาวของชื่อ และบ่อยครั้งอาจจะสะกดผิด
เราสามารถแก้ปัญหานี้ด้วยการสร้างฟังก์ชั่นใหม่ที่ชื่อสั้นลง ซึ่งทำให้เราสามารถกำหนดค่าอื่นๆ ได้ด้วย แต่การทำงานจะช้าลง (แต่ใครจะสน ถ้าไม่ใช่เครื่องเซิร์ฟเวอร์ของตัวเอง)

function h($string)
{
    // แปลง < > & " แต่ไม่แปลง ' และใช้ encoding แบบ UTF-8 เสมอ
    return htmlspecialchars($string, ENT_COMPAT, 'UTF-8');
}

echo h('A&W M&M S&P');





บทความที่เกี่ยวข้อง





ศึกษาเพิ่มเติม




ติดตามบทความล่าสุดของผู้เขียนได้ที่ phpinfo() Facebook Page







   
Share
Bookmark.   

  By : phpinfo()
  Article : บทความเป็นการเขียนโดยสมาชิก หากมีปัญหาเรื่องลิขสิทธิ์ กรุณาแจ้งให้ทาง webmaster ทราบด้วยครับ
  Score Rating :
  Create Date : 2013-02-20
  Download : No files
Sponsored Links
ThaiCreate.Com Forum


Comunity Forum Free Web Script
Jobs Freelance Free Uploads
Free Web Hosting Free Tools

สอน PHP ผ่าน Youtube ฟรี
สอน Android การเขียนโปรแกรม Android
สอน Windows Phone การเขียนโปรแกรม Windows Phone 7 และ 8
สอน iOS การเขียนโปรแกรม iPhone, iPad
สอน Java การเขียนโปรแกรม ภาษา Java
สอน Java GUI การเขียนโปรแกรม ภาษา Java GUI
สอน JSP การเขียนโปรแกรม ภาษา Java
สอน jQuery การเขียนโปรแกรม ภาษา jQuery
สอน .Net การเขียนโปรแกรม ภาษา .Net
Free Tutorial
สอน Google Maps Api
สอน Windows Service
สอน Entity Framework
สอน Android
สอน Java เขียน Java
Java GUI Swing
สอน JSP (Web App)
iOS (iPhone,iPad)
Windows Phone
Windows Azure
Windows Store
Laravel Framework
Yii PHP Framework
สอน jQuery
สอน jQuery กับ Ajax
สอน PHP OOP (Vdo)
Ajax Tutorials
SQL Tutorials
สอน SQL (Part 2)
JavaScript Tutorial
Javascript Tips
VBScript Tutorial
VBScript Validation
Microsoft Access
MySQL Tutorials
-- Stored Procedure
MariaDB Database
SQL Server Tutorial
SQL Server 2005
SQL Server 2008
SQL Server 2012
-- Stored Procedure
Oracle Database
-- Stored Procedure
SVN (Subversion)
แนวทางการทำ SEO
ปรับแต่งเว็บให้โหลดเร็ว


Hit Link
   







Load balance : Server 05
ThaiCreate.Com Logo
© www.ThaiCreate.Com. 2003-2024 All Rights Reserved.
ไทยครีเอทบริการ จัดทำดูแลแก้ไข Web Application ทุกรูปแบบ (PHP, .Net Application, VB.Net, C#)
[Conditions Privacy Statement] ติดต่อโฆษณา 081-987-6107 อัตราราคา คลิกที่นี่