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

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





[/HTML]
ตัวอย่างด้านล่าง มีช่องโหว่ครับ เพราะว่าในระบบ จะรับ แค่ poll_id เท่านั้นส่วน vote_for และ action ไม่ได้ทำการกรอง อ่าน POST หรือ GET แต่ประการใด จากด้านล่าง
[PHP]
$poll_id = $_POST[“poll_id”];
require (“poll/poll_cookie.php”);
include(“poll/booth_inc.php”);
[/PHP]
ทำให้เกิด !!!!
[CODE]


<body> </body>
[/CODE]
เห็นไหมคืออะไร เค้ายิงผ่าน 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]
if(empty($_POST[“poll_id”])) {
$poll_id = $_GET[“poll_id”];
}
else {
$poll_id = $_POST[“poll_id”];
}
if(!empty($_GET[“vote_for”]) or !empty($vote_for)) {
header(“Location: index.php”);
exit;
}
else {
$vote_for = $_POST[“vote_for”];
}
require (“poll/poll_cookie.php”);
include(“poll/booth_inc.php”);
[/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 ปลอดภัยมากขึ้น

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

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

  2. ปัญหา็ก็ไม่ใชจะหมดไปซะทีเดีียวหรอก หาก แหกเก้อ(hacker) ใช้โปรแกรมพวก simulate การ post แบบ method POST

  3. ขอถามทุกท่านที่ทราบครับ

    ผมเขียนคำสั่งด้วยภาษาซี ให้แสดงผลความเข้มข้นของก๊าซคาร์บอนมอนอกไซด์ จากนั้น burn เข้าไปใน microcontroller
    ทำการเชื่อมต่อบอร์ดที่ใช้เข้ากับ hub และ PC จากนั้นเข้าไปที่ URL และกำหนด IP ที่กำหนดไว้ใน microcontroller ภาพที่ได้คือ web page ที่โชว์ความเข้มข้นของก๊าซนี้ทางหน้าจอคอมพิวเตอร์ คราวนี้ผมต้องการเก็บข้อมูลความเข้มข้นนี้ไปที่ฐานข้อมูล
    MySQL มีใครรู้วิธีมั้งครับ

  4. ปัญหาพวกนี้แก้ให้มันหายเลยยากอะครับ

    ยิงข้อมูลให้มันเข้าไปใน $_POST ก็ทำได้ครับ
    แค่สร้างฟอร์มจำลองขึ้นมาแล้วตั้งเวลาใน javascript ให้ submit ครับ

    ถ้าจะใช้วิธี check HTTP_REFERER ก็ใช้ เปิดใน iframe เอา แล้วใช้ javascript submit
    หรือ อาจจะใช้ fsockopen() แล้วแก้ header มันก็หรอก referer ได้

    แต่ถ้าเราป้องกันมากขึ้น โอกาสที่คนจะ hack ได้ก็น้อยลง

    ทางที่ดีอาจจะให้เครื่องคอมเครื่องเดียวโหวตได้แค่ครั้งเดียว มันก็จะช่วยได้ ยกเว้นว่า hacker นั้นเก่งจริงเขียนไวรัสกระจายไปทุกเครื่องให้มันส่งข้อมูลมา

Leave a Reply