Sunday, June 27, 2010

ป้องกัน cracker มายุ่มย่ามในระบบ PHP Code

  • ช่วงนี้ยุ่งกับ PHP เยอะ เลยต้องหาข้อมูลก่อนเลย
  • เพราะ เขียนไม่เป็นหว่า ต้องอ่านเยอะๆ
  • เจอเนื้อหาดีๆ ที่ใหนเป็นเก็บ

จาก: http://www.expert2you.com/view_article.php?art_id=2931


หลายเว็บล่มเพราะการไม่กันการ crack ภายนอกเอาไฟล์นอก server มารันใน server ทำให้ server ล่มมานักต่อนักแล้วนะครับ

1. ควรป้องกัน (ระแวง) การรับข้อมูลจากผู้ใช้ให้มากที่สุดครับ
เวลารับข้อมูลจาก form ควรอ้างถึงข้อมูลนั้นๆโดย $_POST['login_user'] ครับ
เวลารับข้อมูลจาก URL ควรอ้างถึงข้อมูลนั้นๆโดย $_GET['page'];
เวลารับข้อมูลจาก Session ควรอ้างถึงข้อมูลนั้นๆโดย $_SESSION['ss_username'];

2. ไม่ควรรับค่าจากผู้ใช้แล้วบันทึกลงฐานข้อมูลเลยหรือนำไปประมวลผลเลย
เวลา รับค่าหน้าเพื่อจะเปลี่ยนหน้าจากหน้านึงไปอีกหน้านึงเราจะใช้ method get เพื่อให้ผู้ใช้งานสามารถรู้ว่าตอนนี้อยู่ที่หน้าไหน แต่เราก้อควรป้องกันการ Injection ด้วย
เวลารับข้อมูลจาก ตัวแปรประเภท GET ที่เป็นตัวเลข ควรใส่ฟังชันท์ intval() ลงไปด้วย เช่น
http://localhost/board.php?action=show&id=1234
เวลา ประมวลผล เราจะประมวลโดยอ้างถึง $_GET['id'] ใช่มั้ยครับ คือ
$select = mysql_query("SELECT * FROM board WHERE id=" . $_GET['id']);
ก็คือถ้า ส่ง id=1234 จะโชว์ข้อความที่ 1234 นะครับ แต่มันสามารถอัดฉีดได้ครับ สมมุติผมลองส่งค่า id ไปใหม่
http://localhost/board.php?action=show&id=1234 OR 4321
จะทำให้มันแสดงทุกๆข้อความเลยนะครับ คล้ายๆกับ Error แหละครับ
ที่ นี้ลองคิดดูว่าถ้าเกิดคนที่พอมีความรู้ด้าน SQL อัดฉีดให้เพิ่ม admin อีกคนลงไปในระบบจะเป็นไงละครับ ?
วิธีแก้คือให้เราใส่ฟังชันธ์ intval() ไปก่อนประมวลผลครับ คือ
$id = intval($_GET['id']);
$select = mysql_query("SELECT * FROM board WHERE id=" . $id); ครับ

3. เราควร define ค่าใน server เพื่อกันการเอาไฟล์นอก server มารัน
(จากรูรั่วที่ไหนสักแห่ง) วิธีการคือให้เรากำหนดค่าหลักขึ้นมาในไฟล์หลักครับ เช่น
ไฟล์หลัก: main.php
<?
$in_website = define ("in_website", true);
?>
ไฟล์ ย่อย: ไฟล์ที่เรา include() เข้ามา
<?
if (!$in_website) die("จาทำอารายคับท่านผู้ชม");
?>

4. ในการตรวจข้อมูลควรมีการดัดแปลงเพื่อให้ง่ายต่อการประมวลผล
เช่น ฟังชันท์ addslashes() เป็นฟังชันท์ที่นักโปรแกรมเมอร์ไม่ควรลืม เพราะอักษร ' " สามารถทำให้ script ของคุณล่มได้ แต่พอคุณประมวลผลเสร็จไม่แนะนำให้เอาค่าตัวแปรที่เรารับมามาปนกันนะครับ คืออย่าทำแบบนี้
$_GET['message'] = addslashes($_GET['message']);
เพื่อ ให้เราสามารถแยกแยะได้ว่าข้อมูลไหนเป็นของผู้ใช้หรือข้อมูลไหนคือข้อมูล บริสุทธิ์ที่เราป้องกันแล้ว

No comments:

Post a Comment