Google


เขียน รับ get / post ใน form method ระวังโดน hack หรือเป็นรูโหว่

นี่เป็นปัญหามาก ในเป็นการสร้างนิสัยเสียในการเขียนโปรแกรมในภาษา PHP ในเรื่องการที่คนเขียน นิสัยเสีย หรือติดจากหนังสือบางเล่ม ที่ไม่ค่อยใช้ GET หรือ POST ในการรับค่าจาก form ต่างๆ ใน method ต่างๆ มันยังผลไปสู่การ Hack หรือการเจาะได้ เช่น เมื่อเร็วๆ นี้ ทำ script PHP สำหรับการ vote freshy boys/girls ที่ ม. ที่ผมเรียนอยู่ ผมหล่ะปวดกับการหล่ะหลวม ของตัวผมเองในการเขียน script ระบบ vote อย่างแรง ตัว form คือ

HTML:
  1. <form method="post" action="vote.php" target="_blank">
  2.    <input src="images/index.jpg" class="input" value="โหวต" alt="Vote" type="image" />
  3.    <input name="vote_for" value="3" type="hidden" />
  4.    <input name="action" value="vote" type="hidden" />
  5.    <input name="poll_id" value="5" type="hidden" />
  6. </form>

ตัวอย่างด้านล่าง มีช่องโหว่ครับ เพราะว่าในระบบ จะรับ แค่ poll_id เท่านั้นส่วน vote_for และ action ไม่ได้ทำการกรอง อ่าน POST หรือ GET แต่ประการใด จากด้านล่าง

PHP:
  1. $poll_id = $_POST["poll_id"];
  2. require ("poll/poll_cookie.php");
  3. include("poll/booth_inc.php");

ทำให้เกิด !!!!

CODE:
  1. <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
  2. <meta http-equiv="refresh" content="930;URL=filephp.php?poll_id=5&vote_for=3" />
  3. <noframes><body> </body></noframes>

เห็นไหมคืออะไร เค้ายิงผ่าน GET Method แทนครับ อ่านหมด 3 ตัวแปรเลย เพราะอะไร ? อย่างแรกครับ $poll_id = $_POST["poll_id"]; ไม่พอต่อการดัก method จาก GET แต่อย่างใด เพราะว่ายังไง ตัวแปรใน poll_id ที่อยู่ใน form มันก็ยังมาใส่ใน $poll_id ได้จาก GET Method ที่ไม่ได้ lock ซึ่งเช่นเดียวกับ vote_for เช่นกัน ที่มันก็ไปใส่ใน $vote_for ใน script ด้วยเช่นกัน ทำให้เกิดการตั้งเวลาการ vote ได้โดยที่คน vote ไม่ต้องอยู่ที่เครื่อง แค่เปิด browser page นี้ไว้ เท่านั้นเอง แถมถ้าเปิดไว้สัก 100 เครื่องนี่มหาศาลมากทีเดียว ผมเลยต้องกลับลำ และแ้ก้ระบบ script ใหม่หมดอีกครั้งโดยดัก 2 ตัวพอ เพราะว่า action อันนี้ไม่ค่อยสำคัญเท่า vote_for กับ poll_id ที่เป็นตัวจักรสำคัญ แก้คือ ดักทั้ง GET และ POST เราต้องการให้ Method ไหนเข้ามาก็ให้มันผ่านไปเท่าที่เราต้องการเท่านั้น

PHP:
  1. if(empty($_POST["poll_id"])) {
  2.     $poll_id = $_GET["poll_id"];
  3. }
  4. else {
  5.     $poll_id = $_POST["poll_id"];
  6. }
  7. if(!empty($_GET["vote_for"]) or !empty($vote_for)) {
  8.     header("Location: index.php");
  9.     exit;
  10. }
  11. else {
  12.     $vote_for = $_POST["vote_for"];
  13. }
  14. require ("poll/poll_cookie.php");
  15. include("poll/booth_inc.php");

ผมเลยดักด้วยการรับค่า poll_id จากทั้ง GET และ POST Method ทั้งหมดด้วยการดักไว้ก่อน ตามด้วย Condition ตรวจสอบ ว่าต้องไม่มีการใส่ vote_for ใน GET Method หรือ มีการลักลอบใส่ผ่าน $vote_for มาแต่อย่างใดถ้ามีก็เด้งไป index.php ทันที แต่ถ้าไม่มีก็รับค่าจาก POST มาเลย แล้วทำการ run ตัว script ต่อไปครับ นี่เป็นสิ่งที่รูโหว่ของคนที่ไม่ชอบใช้ POST / GET Method ใน PHP ครับ หรือตั้งชื่อตัวแปรที่มารับ POST / GET Method ที่เหมือนกัน ทางแก้คือ

  1. ใช้ GET / POST Method เสมอๆ ในการรับค่าผ่าน form ต่าง script กัน
  2. ตั้งตัวแปรใน script ที่แตกต่างจาก GET /POST Method เข้าไว้ครับ
  3. ถ้าจำเป็นต้องตั้ง ก็ต้องมี function ในการเช็คตัวแปรที่ส่งผ่านเข้าออก script ให้มากครับ
  4. ใช้ function / class มาแก้ปัญหานี้ครับ ช่วยได้มาก สำหรับคนที่มีเวลาเขียนโปรแกรม หรือ optimize / debug เยอะๆ ครับ (อันนี้เร่งๆ พอสมควรครับ) อันนี้เป็นสิ่งเตือนในการเขียน script ที่เป็น public ได้มากเลยหล่ะครับ

ซึ่งปัญหานี้เกิดจากการใช้ register_global ใน php ที่ตั้ง enable ไว้นั้นเอง ถ้าปิดไปการใช้ตัวแปรภายใน php script ปลอดภัยมากขึ้น

Related Posts


3 Responses to “เขียน รับ get / post ใน form method ระวังโดน hack หรือเป็นรูโหว่”


  1. 1 คุณทดสอบ

    เท่าที่ผมอ่านๆดูนะ มันเป็นช่องโหว่ที่เกิดกันบ่อยมาก แล้วคนทำผิดกันมากๆ
    ว่าแต่คุณอยู่ ม. อะไรครับ

  2. 2 Ford AntiTrust

    ผมอยู่ ม.นเรศวร ครับ ;)

  3. 3 HwuprcmR5c

    Hi! Very nice site! Thanks you very much! gGa2Zq9610Q

Leave a Reply

This is a captcha-picture. It is used to prevent mass-access by robots. (see: www.captcha.net)

You must read and type the 5 chars within 0..9 and A..F, and submit the form.

  

Oh no, I cannot read this. Please, generate a




Close
E-mail It