PHP dan Keselamatan Web
-----
-----
-----
WEB SECURITY - PHP PROGRAMMING PERSPECTIVE
Internet and Worldwide Web
Internet adalah gabungan rangkaian komputer serata dunia. Gabungan ini melibatkan penggunaan berbagai jenis perkakasan dan perisian komputer yang dimiliki oleh syarikat telekomunikasi, organisasi awam dan orang persendirian. Melalui gabungan rangkaian ini, pelbagai perkhidmatan berasaskan pertukaran data dapat diwujudkan termasuklah Worldwide Web (Web).
Antara teknologi utama yang digunakan di dalam Internet ialah TCP/IP. TCP bermaksud Transfer Control Protocol. Ia merangkumi aspek pemindahan data dari satu peranti komunikasi (communication device) ke peranti yang lain. IP bermaksud Internet Protocol. Ia merangkumi aspek penentuan lokasi setiap komputer yang berada di dalam rangkaian Internet (atau mana2 rangkaian setempat yang menggunakan teknologi TCP/IP). Melalui teknologi TCP/IP, maklumat elektronik dapat dihantar dari satu komputer ke komputer yang lain dengan cekap meskipun jarak perhubungan ini sangat jauh.
Lihat klip video ini untuk memahami bagaimana teknologi TCP/IP berfungsi (http://www.youtube.com/watch?v=Ve7_4ot-Dzs)
Worldwide Web (Web)
Worldwide Web atau WEB adalah sejenis perkhidmatan perkongsian dokumen dan aplikasi elektronik melalui rangkaian Internet. Pertukaran data elektronik dilakukan dengan berdasarkan teknologi HTTP (Hyper Text Transfer Protocol). Apabila dua komputer berhubung melalui kaedah HTTP, kedua-duanya akan melalui kitaran yang dipanggil HTTP Request/Response
HTTP Request/Response Basics
HTTP Request/Response adalah sebahagian dari kitaran perhubungan di antara dua mesin yang berinteraksi menggunakan teknologi HTTP melalui rangkaian Internet. Maklumat lanjut tentangnya boleh dibaca di http://devhub.fm/http-requestresponse-basics/.
Ringkasnya:
1. Perhubungan bermula apabila pengguna melawat sesebuah tapak web melalui URL tapak tersebut, e.g google.com
2. Komputer pengguna akan menghantar HTTP Request untuk mendapatkan laman web di komputer google.com.
3. Komputer google.com menerima HTTP Request, lalu memprosesnya dan mengembalikan data yang diperlukan melalui HTTP Response.
Client-Server Architecture
Client-Server Architecture adalah satu senibina perhubungan komputer di mana peranan dua komputer yang sedang berinteraksi melalui rangkaian komputer (seperti Internet) ditakrif sebagai Client (komputer yang memohon data, iaitu HTTP Request) dan Server (komputer yang melayan permohonan data, iaitu HTTP Response).
Sesebuah komputer Client perlu mempunyai perisian Web Client seperti perisian Web Browser untuk membolehkannya menghantar isyarat HTTP Request dan memaparkan isyarat HTTP Response yang diterima dari Server.
Sesebuah komputer Server pula perlu mempunyai perisian Web Server seperti Apache, Microsoft IIS atau Apple OS X untuk membolehkannya menerima isyarat HTTP Request, memproses permohonan dan memulangkan isyarat HTTP Response ke komputer Client.
History of Web Browsers
Terdapat berbagai perisian Web Browser yang digunakan pada hari ini. Sejarah perisian ini bermula pada tahun 1990 pada Tim Berners Lee memperkenalkan teknologi Web. Lihat infografik berikut untuk mengikuti perjalanan sejarah Web Browser.
Lihat pautan berikut http://sixrevisions.com/web-development/the-history-of-web-browsers/
History of Web Server Software
Web Server pertama di dunia terletak di URL http://info.cern.ch/. Jika anda melawatnya, anda berpeluang membaca kisah tentangnya termasuklah komputer pertama (komputer NEXT) yang menjadi hos perkhidmatan ini.
Perisian Web Server yang pertama dikenali sebagai CERN HTTPD (http://en.wikipedia.org/wiki/CERN_httpd), kemudiannya diikuti oleh NCSA HTTPD (http://en.wikipedia.org/wiki/NCSA_HTTPd). Pembangunan perisian NCSA HTTPD diteruskan oleh projek Apache (http://en.wikipedia.org/wiki/Apache_HTTP_Server). Projek Apache terus berkembang sehingga sekarang. Pada tahun 2009, ia telah mencatat rekod melepasi jumlah penggunaan oleh 100 juta tapak web.
Antara perisian Web Server terawal selain Apache adalah Netscape Enterprise Server 1994 (http://en.wikipedia.org/wiki/Netscape_Enterprise_Server) yang kini dikenali sebagai Oracle iPlanet Web Server (http://en.wikipedia.org/wiki/Oracle_iPlanet_Web_Server). Syarikat perisian gergasi Microsoft turut mempunyai perisian Web Server sendiri yang dipanngil Internet Information Service, IIS yang mula diedar melalui perisian Sistem Operasi NT seawal tahun 1995 (http://en.wikipedia.org/wiki/Internet_Information_Services).(Lihat juga imbasan sejarah syarikat Microsoft terhadap pembabitan mereka di dalam Web, http://www.microsoft.com/misc/features/features_flshbk.htm)
Pada hari ini terdapat berbagai produk perisian Web Server (lihat http://en.wikipedia.org/wiki/Comparison_of_web_server_software).
Apache masih kekal popular dan terdapat berbagai jenis produk variant yang dihasilkan daripadanya. Tutorial dalam dokumen ini juga akan menggunakan perisian Apache yang diedarkan olehhttp://www.usbwebserver.net/en/
Web Application Development
Pembangunan Aplikasi Web merujuk kepada aktiviti membangunkan perisian yang dicapai melalui persekitaran Web. Oleh kerana bahasa asal Web iaitu HTML adalah terhad kepada paparan maklumat, bahasa pengaturcaraan khas diperlukan untuk menjalankan aktiviti pemprosesan maklumat yang akan dijalankan oleh Server Machine. Antara bahasa pengaturcaraan popular pada hari ini termasuklah PHP (PHP Hypertext Processor), ASP (Active Server Page) dan JSP (Java Server Page). Ketiga-tiga bahasa ini mempunyai sejarah dan komuniti yang tersendiri.
PHP pernah merekodkan catatan sebagai bahasa pengaturcaraan yang digunakan oleh sejumlah 20 juta Internet Domain pada bulan April 2007. PHP juga turut dicatatkan sebagai penyumbang kepada 30% Web Vulnerabilities. Antara punca yang dikenalpasti adalah kelalaian pengaturcara di samping ralat teknikal pada bahasa tersebut.
Memandangkan Bahasa PHP adalah antara yang popular dan isu pertahanannya juga kritikal, tutorial dalam dokumen ini memberikan tumpuan kepada aspek pertahanan Web melalui perspektif pengaturcaraan PHP.
Categories of Web Vulnerabilities
1) Kegagalan Proses Penentusahan (Authentication), 62% - Kegagalan pada mekanisma login yang membolehkan penyerang mengesan katakunci yang lemah, melancarkan serangan bertubi-tubi (brute force) atau melangkaui sekatan login.
2) Kegagalan Kawalan Capaian (Access Control), 71 % - Kegagalan mengawal capaian sumber mengakibatkan penceroboh dapat memperolehi maklumat atau memperolehi status Pengguna Pentadbir (Admin User).
3) Injeksi SQL (SQL Injection), 32% - Penyerang berjaya mengubahsuai kod input sehingga mengakibatkan sistem hujung-belakang (back-end) memproses input yang memberi kelebihan kepadanya samada untuk memperolehi atau membuat pemprosesan data.
4) Serangan Skrip Silang-Tapak (Cross-Site Scripting), 94% - Penyerang mensasarkan pengguna lain, mencapai data mereka, bertindak di bawah identiti mereka atau menyerang mereka.
5) Kebocoran Maklumat, 78% - Aplikasi membocorkan maklumat akibat kegagalan sistem menangani ralat atau apa-apa insiden lain.
6) Pemalsuan Silang-Tapak (Cross-Site forgery), 92% - Penyerang memperdaya pengguna menggunakan skrip di tapaknya untuk berinteraksi dan mencapai akses aplikasi mangsa.
Web and Database Server
Kebanyakan Aplikasi Web menyimpan, memproses dan menghantar data dalam kuantiti yang sangat besar. Oleh itu perisian Database Server merupakan sokongan utama terhadap Web Server sedia ada. Antara perisian Database Server yang popular termasuklah MySQL, MSSQL Oracle dan Access (http://www.w3schools.com/hosting/host_databases.asp).
Apache-MySQL-PHP (AMP) Package
Apache, MySQL dan PHP pada mulanya adalah produk berasingan bagi memenuhi objektif tersendiri di dalam persekitaran Web; Apache digunakan untuk memproses HTTP, MySQL digunakan untuk menyimpan data manakala PHP digunakan untuk memproses data dalam aplikasi Web. Walaubagaimanapun, memandangkan ketiga-tiganya diedarkan sebagai Perisian Sumber Terbuka, komuniti pengaturcara telah menggabungkannya ke dalam satu pakej untuk memudahkan aktiviti pembangunan perisian dimulakan. Pakej ini dikenali sebagai AMP (http://en.wikipedia.org/wiki/List_of_Apache%E2%80%93MySQL%E2%80%93PHP_packages). Jika ia dijalankan di dalam WIndows, ia dipanggil WAMP. Jika ia dijalankan di dalam Linux, ia dipanggil LAMP. Walaupun sistem operasi berbeza, pakej AMP tetap akan menghasilkan output, iaitu hasil pemprosesan maklumat yang sama. Pengguna juga akan melihat paparan yang sama meskipun menggunakan perisian Web Browser yang berbeza.
Pakej AMP yang digunakan dalam tutorial ini diambil dari http://www.usbwebserver.net/en/.
Sekiranya anda mahu mencuba pakej LAMP (Linux-Apache-MySQL-PHP), pakej terkini yang paling mudah ialah SLAMPP (http://slampp.abangadek.com/info/ tarikh akses: 6 Okt 2012). Pautan yang diberikan menyediakan anda sumber Live CD Linux Slackware yang telah siap dipasang dengan perisian XAMPP (http://www.apachefriends.org). Live CD tersebut turut menyediakan fungsi pemasangan terus ke Hard Disk di mana anda boleh pilih sama ada mahu memasang ke Hard Disk Fizikal atau melalui Sistem Maya seperti VirtualBox atau VMWare.
USBWebServer Package
Pakej USBWebserver adalah satu rangkuman perisian Apache-MySQL-PHP yang dihasilkan oleh sebuah syarikat Jerman untuk dijalankan di dalam persekitaran Windows. Ianya berkonsepkan portable, iaitu boleh dipindah dan dijalankan tanpa perlu pemasangan ke dalam sistem Windows. Keanjalan ini sangat berguna kerana pengaturcara boleh memindahkan kandungan program dan data ke mana-mana peranti tanpa perlu mengganggu tetapan Windows.
Di samping itu, USBWebserver menyediakan paparan Control Panel (seperti di atas) yang memudahkan pengguna membuat tetapan yang berkaitan. Paparan ini sangat mudah digunakan dan ia amat praktikal untuk persekitaran pembangunan (Development Environment). USBWebserver tidak disyorkan untuk persekitaran pengeluaran (Production Environment).
Running PHP-powered Apache Web Server for first time
1. Download perisian USBWebserver dari laman web http://www.usbwebserver.net/en/. Ketika dokumen ini ditulis, ia berada pada versi 8.5. Versi 8.5 menyokong PHP5, Apache 2, MySQL5 dan Sqlite 3. Ia cukup untuk menyokong keperluan semua tutorial dalam dokumen ini.
2. Sebaiknya letakkan Directory Pangkal (Root Directory) pada C:\ seperti ilustrasi di bawah:
C........ [USBW]........ [apache2]
[lang]
[mysql]
[php]
[phpmyadmin]
[root]
[settings]
usbwebserver.exe
3. Double-Click ikon usbwebserver.exe. (imej ikon tertera seperti di atas).
4. Tetingkap Control Panel akan muncul seperti di bawah.
5. Lihat butang tertulis “Localhost”. Klik butang tersebut. Tetingkap Web Browser akan mempamerkan laman seperti di bawah.
6. Lihat pautan “Click here to go to the PHPINFO file”. Laman PHPINFO akan dipamerkan seperti di bawah. Secara ringkasnya, laman ini adalah isyarat bahawa PHP dalam keadaan tersedia. Anda mungkin perlu merujuk laman ini ketika mengikuti tutorial selanjutnya.
7. Kembali semula ke USBW Control Panel. Lihat butang tertulis “Root dir”. Klik butang tersebut. Windows File Explorer akan memaparkan kandungan direktori pangkal web (Web Root Directory).
C........ [USBW]........ [apache2]
[lang]
[mysql]
[php]
[phpmyadmin]
[root]
[settings]
usbwebserver.exe
8. Sehingga ke tahap ini, anda perlu ingat dua perkara berikut:
8.1. URL untuk website adalah http://localhost:8080
8.2. LOCAL PATH untuk website adalah C:\USBW\ROOT\
9. Cipta direktori baru di bawah ROOT, namakannya “mypage”, perhatikan laluan berikut:
9.1. URL untuk website adalah http://localhost:8080/mypage
9.2. LOCAL PATH untuk website adalah C:\USBW\ROOT\mypage
10. Dengan menggunakan program Notepad++(http://portableapps.com/apps/development/notepadpp_portable) atau Notepad biasa, cipta File helloworld.php, Save di dalam direktori mypage. Taip kod berikut ke dalam helloworld.php
<?php
echo "Hello World";
?>
Data Processing With PHP
1. Cipta direktori baru di bawah mypage, namakannya “100”, perhatikan laluan berikut:
1.1. URL untuk website adalah http://localhost:8080/mypage/100
1.2. PATH untuk website adalah C:\USBW\ROOT\mypage\100
2. Cipta fail “101-add-numbers.php. Taipkan kod berikut:
<?php //name:101-add-numbers.php
echo "1+2= ";
echo 1+2;
?>
3. hasilnya,
Arahan echo digunakan untuk mengeluarkan paparan di laman web.
Arahan “1+2= “ digunakan untuk memaparkan teks di laman web.
Arahan 1+2 digunakan untuk memaparkan hasil pengiraan 1 tambah 2.
4. Melalui contoh ini, anda belajar:
4.1. Menggunakan arahan PHP untuk mengeluarkan teks atau nombor.
4.2. Menggunakan arahan PHP untuk memproses nombor.
4.3. Simbol “//” digunakan sebagai penanda komen (teks yang tidak diproses PHP).
4.4. Adalah satu praktis yang baik meletakkan komen nama fail di dalam kod PHP anda.
5. Anda boleh meneruskan pembelajaran pemprosesan nombor dengan merujuk laman berikut, http://www.w3schools.com/php/php_operators.asp. Untuk aktiviti berikutnya, kita akan mempelajari penggunaan variable.
Using Variables In PHP Script
1. Cipta fail baru “102-add-variables.php”. Taipkan kod berikut:
<?php //name:102-add-variables.php
$var1 = 1;
$var2 = 2;
$var3 = $var1 + $var2;
echo $var1." + ".$var2." = ".$var3;
?>
2. Hasilnya, anda akan mendapat output yang sama seperti latihan 101-add-numbers.
3. Melalui contoh ini, anda belajar:
3.1. variable adalah sejenis memori untuk menyimpan nilai.
3.2. variable boleh diproses menggunakan operators.
3.3. variable dan string (teks) boleh digabungkan dengan join operator (.).
Web application problem starts with input variables
1. Sebelum memulakan latihan ini, anda perlu menghidupkan tetapan register_globals. Pergi ke dalam direktori USBW dan masuk ke dalam SETTINGS. Buka fail php.ini, cari perkataan “register_globals” dan letakkan arahan on seperti di bawah. Tutup USBW Control Panel dan Double-Click usbwebserver.exe (dalam kata lain, matikan dan hidupkan semula server.)
2.Cipta fail baru “103-register-globals.php”. Taipkan kod berikut:
<?php //name:103-register-globals.php
//$var1 = 1;
//$var2 = 2;
$var3 = $var1 + $var2;
echo $var1." + ".$var2." = ".$var3;
?>
Perhatikan, baris 2 dan 3 dimatikan arahannya dengan tanda komen //.
3.Taipkan “http://localhost:8080/mypage/100/103-register-globals.php?var1=100&var2=200”. Hasilnya, Browser akan memaparkan “100 + 200 = 300”. Maknanya jika skrip program tidak memberi nilai kepada $var1 dan $var2, PHP akan mencarinya dari input pengguna.
4. Perhatikan pula, jika anda menaip URI “http://localhost:8080/mypage/100/103-register-globals.php?var1=100&var2=a”. Hasilnya, Browser akan memaparkan “100 + a = 100”. Hasil seperti ini adalah mengelirukan!
5. Melalui contoh ini, anda belajar:
5.1. Tetapan “register_globals=on” dalam fail “php.ini”
5.2. Apabila tetapan register_globals dihidupkan, kita boleh memberikan nilai untuk variable melalui Uniform Resource Identifier, URI (iaitu menambah masukan pada URL, contohnya, “?var1=100&var2=200”)
5.3. PHP variables bersifat typeless, i.e., ia boleh menerima nilai nombor atau teks.
5.4. Akibat dari sifat typeless, PHP tidak akan mengesan kesalahan jenis data bagi setiap nilai input.
5.5. Sekiranya pengguna diberi kebebasan memasukkan apa sahaja nilai yang mereka suka seperti dalam contoh 4, aplikasi PHP mungkin menghasilkan output yang mengelirukan. Keadaan ini seterusnya membuka ruang bagi penggodam menyerang sesebuah laman web.
PHP Error Message
Mesej ralat PHP dikenali sebagai error reporting. Terdapat beberapa jenis error seperti yang disenaraikan di http://www.w3schools.com/php/php_error.asp . Lazimnya, tetapan asal akan membenarkan PHP memaparkan mesej ralat ke skrin untuk membolehkan pengaturcara mengambil tindakan pembaikan yang sepatutnya.
Sebagai contohnya, jika skrip 102-register-globals.php dipanggil tanpa disertakan masukan “?var1=100&var2=200” atau “?var1=100&var2=a”, pengguna akan melihat mesej ralat dipaparkan di skrin seperti di bawah.
Mesej ralat ini sangat berguna kerana ia memberitahu pengaturcara jenis kesalahan dan nombor baris di mana ralat berlaku. Walaubagaimanapun mesej ini sangat merbahaya jika ia dibaca oleh pengunjung laman web anda. Mereka akan tahu bahawa anda mempunyai dua variable (beserta namanya) yang tidak sempurna pengisytiharannya. Maka pengguna yang nakal pasti akan cuba memasukkan nilai untuk variable ini.
Untuk mengelakkan mesej ralat dipaparkan di persekitaran pengeluaran, gunakan arahan error_reporting (0). (Arahan error_reporting(-1) pula akan memberikan kesan sebaliknya.) Perlu diingatkan penggunaan arahan ini sepatutnya bersifat sementara sahaja. Walaupun mesej ralat tidak muncul, ralat tetap wujud. Pengaturcara perlu segera membetulkannya sebelum ia diketahui orang. Adakalanya pengaturcara terlupa atau sengaja membiarkannya (kod seperti skrip di atas masih dapat berfungsi walaupun ada ralat. Ada sesetengah pengaturcara malas membuat pembetulan yang kononnya dianggap remeh seperti ini.). Hal ini ibarat bom jangka yang boleh meletup pada bila-bila masa sahaja.
PHP Access and Log Files
PHP menyimpan maklumat akses dan ralat di dalam direktori “usbw\apache2\logs”.
Apabila pengguna menaip URL, contohnya “localhost:8080/mypage/100/101-add-numbers.php”, maklumat ini disimpan sebagai log arahan GET di dalam fail access.log. Pengaturcara boleh meneliti setiap kod skrip PHP yang cuba diakses oleh pengguna Web apabila server ini hidup di atas talian. Ia memberi gambaran kod skrip mana yang terdedah kepada risiko ancaman yang lebih tinggi.
PHP akan mencatat log ralat ke dalam fail “error.log”. Contohnya apabila pengguna menaip “http://localhost:8080/mypage/100/103-register-globals.php”, ralat tentang “undefined variable” akan dicatat. Lihat contoh di bawah. Dengan memerhatikan log ini, pengaturcara boleh melakukan kerja-kerja semakan dan pembetulan tanpa perlu mengarahkan PHP memaparkan maklumat ralat di skrin.
Walaupun maklumat akses dan ralat sangat penting, sesetengah pengaturcara PHP terlepas pandang akan hal ini. Mereka jarang menyemak fail akses dan log. Akibatnya, mereka tidak sedar tentang kelemahan yang wujud di dalam kod skrip PHP mereka. Kelambatan mengesan kelemahan sistem boleh memberi impak negatif jika sekiranya ia diketahui umum seperti kes Tumblr di bawah.
Managing the scope of variables
Penggunaan variable yang tidak terkawal boleh mengundang ancaman godaman. Salah satu pendekatan mengawal penggunaan variable ialah melalui pentakrifan skop (scope, maksudnya ruang lingkup untuk variable itu aktif).
1. Cipta skrip “104-variable-scope.php”. Taipkan kod berikut:
<?php //name:104-variable-scope.php
//two global var
$var1 = 1;
$var2 = 2;
function addNum($var1,$var2) { //two local var
$var3 = $var1 + $var2;
$var1=0;
$var2=0;
return $var3;
}
$result=addNum($var1,$var2);
echo $var1." + ".$var2." = ".$result;
?>
2. Apabila skrip ini dijalankan, ia akan menghasilkan output berikut.
1 + 2 = 3
|
3. Cipta skrip “105-variable-scope.php”. Taipkan kod berikut:
<?php //name:105-variable-scope.php
//two global var
$var1 = 1;
$var2 = 2;
function addNum($var1,$var2) { //two local var
$var3 = $var1 + $var2;
$var1=0;
$var2=0;
return $var3;
}
function incrementNum($var1) {
static $var2=0;
if ($var2==0) { $var2=$var1;}
else { $var2+=$var1;}
return $var2;
}
$result=addNum($var1,$var2);
echo $var1." + ".$var2." = ".$result;
echo "<br/>"; //go to newline
echo "increments of ".$result."=";
echo incrementNum($result)."...";
echo incrementNum($result)."...";
echo incrementNum($result)."...";
?>
4. Apabila skrip ini dijalankan ia akan menghasilkan output berikut.
1 + 2 = 3
increments of 3=3...6...9...
|
5. melalui contoh ini anda belajar:
5.1. Global Variable
5.2. Local Variable
5.3. Static Variable
5.4. Terdapat banyak variable di dalam contoh di atas, tetapi skop masing-masing berbeza. Variable yang aktif sepanjang masa hanyalah tiga sahaja, i.e. $var1, $var2 dan $result.
Test your understanding
1. Cipta skrip “106-test-page.php”. Taipkan kod berikut:
<?php
error_reporting(-1);/*development*/
//error_reporting(0); /*production*/
function showNav(){}
function showPage(){}
?>
<head>
</head>
<body>
<div class=side">
<?php showNav(); ?>
</div>
<div class="content">
<h1>My Website</h1>
<?php showPage($page);?>
</div>
</div>
</body>
2. Lihat output di Web Browser. Apa yang anda lihat?
3. Kaji kod skrip ini. Apakah masalah pada kod ini?
Rujukan Tambahan
11. Basic HTML tutorial
12. Basic PHP tutorial
13. Basic CSS tutorial
14. Basic SQL tutorial
15. Basic JavaScript tutorial