Monday, September 24, 2012

Keselamatan dalam Pengaturcaraan PHP




1. Pengenalan

Penulisan aplikasi PHP adalah mudah. Kebanyakan pengaturcara memahami sintaks dengan cepat dan dalam masa yang singkat dapat menghasilkan skrip berdasarkan tutorial, rujukan, buku, dan forum-forum bantuan seperti yang terdapat di sini. Walaubagaimanapun, kebanyakan orang terlupa tentang aspek keselamatan apabila menulis aplikasi PHP.

Secara umumnya, pengguna aplikasi anda akan menuruti arahan mengisi borang web sebagaimana yang diberitahu. Akan tetapi, terdapat sebahagian pengguna yang bersikap sebaliknya. Sesetengah pengguna berniat jahat dan cuba mencari peluang untuk melakukan kerosakan di laman web anda. Mereka akan meneliti aplikasi anda untuk mencari kelemahan keselamatan dan mengeksploitasi kelemahan tersebut. Seringkali pengaturcara peringkat awalan terlepas pandang hal ini dan akhirnya menemui masalah apabila kelemahan aplikasinya dieksploitasi oleh orang lain.

Terdapat beberapa isu yang mustahak dipelajari oleh anda supaya ianya dapat diurus dengan baik, dan lebih baik lagi, jika dapat dihalang dari terjadi. Kemahiran mengendalikan isu ini sudah tentunya belum memberi jaminan perlindungan selamanya kerana serangan keselamatan akan terus datang dan berubah dari masa ke semasa. Namun setidak-tidaknya ia membantu menjauhkan aplikasi anda dari cubaan pihak penceroboh.

2. Error Reporting (Laporan Ralat)
Laporan Ralat memberikan anda maklumat mengapa aplikasi anda gagal seperti apa yang berlaku dan di mana ia berlaku. Maklumat ini adalah penting untuk proses nyahpijat (debug). Walau bagaimanapun, mungkin bukan anda seorang sahaja yang berminat untuk mengetahui mengapa aplikasi anda gagal. Barangkali ada orang lain yang turut ingin tahu tentangnya. Mereka mungkin akan mengkaji dan merancang bagaimana mengambil kesempatan ke atasnya.

Oleh itu, anda tidak perlu output ralat skrin apabila aplikasi anda berjalan di persekitaran pengeluaran. Sebaliknya keluarkan Laporan Ralat dalam persekitaran pembangunan anda sahaja. Jejaki punca ralat dan selesaikannya di peringkat dalaman tanpa perlu diketahui umum.

Bagaimana pula sekiranya aplikasi telah dilancarkan tetapi anda masih bimbang akan kewujudan ralat di dalamnya? Anda boleh menulis ralat ini ke dalam fail log. Fail log, pada
asalnya, tidak ditetapkan oleh PHP untuk menyimpan maklumat ini. Maka anda perlu mengubahsuai ketetapan ini. Akses ke fail log adalah bergantung kepada kebenaran dari pihak penyedia perkhidmatan hosting. Jika akses tidak dibenarkan, maka anda perlu menyediakan fail sendiri untuk menyimpan maklumat ralat tadi.

Beberapa arahan php.ini yang relevan dangan hal ini
display_errors - arahan ini mengawal sama ada kesilapan PHP perlu dihantar ke skrin atau tidak. Dalam persekitaran pengeluaran ini perlu sentiasa dimatikan.

error_reporting - ini adalah arahan yang menentukan samada ralat perlu dilaporkan. Anda perlu menetapkan ini kepada E_ALL .

log_errors - ini adalah kawalan yang menentukan sama ada kesilapan perlu dilog ke fail. Adalah disyorkan kawalan ini dihidupkan.

error_log - ini adalah nama laluan fail di mana laporan ralat akan ditulis. Ia berfungsi jika log_errors dihidupkan.

Cadangan penetapan konfigurasi laporan ralat
Nama Arahan Pengeluaran Pembangunan
Display_erros off on
Error_reporting e_all e_all
Log_errors on on
Error_log bergantung bergantung

Bagaimana error_log sepatutnya dikonfigurasi jelas bergantung kepada bagaimana struktur direktori anda (yang akan dibincang kemudian dalam tutorial ini).

2.1. Menetapkan arahan

Terdapat beberapa cara yang berbeza di mana anda boleh menetapkan arahan pengaturcaraan yang selamat. Jika anda sudah tahu bagaimana untuk berbuat demikian maka anda boleh melangkau bahagian ini.

Cara pertama:
Mengubahsuai pembolehubah dalam fail tetapan php.ini. Perubahan ini boleh mendatangkan ancaman keselamatan. Walau bagaimanapun, ini hanya boleh dilakukan oleh pentadbir komputer pelayan. Penggodam tidak akan dapat melakukannya.

Cara kedua:
Sistem Pelayan Apache mempunyai beberapa fail konfigurasi yang dipanggil “.htaccess” di mana anda boleh memberi arahan Apache untuk folder tertentu (dan sub-folder nya). Sesetengah penyedia perkhidmatan hosting tidak membenarkan pengubahsuaian fail ini. Sekiranya mereka membenarkannya, anda boleh menggunakan arahan “php_flag” seperti ini:
php_flag directive_name directive_value

Perhatikan bahawa anda tidak boleh menggunakan pemalar seperti E_ALL sebaliknya gunakan nilai angka 8191. Angka ini mungkin berubah pada masa hadapan maka anda perlu semak dari masa ke semasa. Senarai nilai pemalar pada Laporan Ralat boleh disemak di URL berikut: http://php.net/manual/en/errorfunc.constants.php.

Untuk persekitaran pengeluaran anda boleh lakukan seperti berikut:
php_flag display_errors off
php_flag error_reporting 8191
php_flag log_errors on
php_flag error_log /home/someone/logs/php_errors.log

Cara ketiga: Menggunakan fungsi PHP ini_set (). Fungsi ini menerima dua parameter iaitu nama arahan dan nilai yang mahu diberikan padanya. Anda boleh menggunakan pemalar di sini. Terdapat fungsi dipanggil error_reporting () yang mana anda boleh gunakannya untuk menetapkan Laporan Ralat secara terus.

3. Suntikan SQL (SQL Injection)

Salah satu masalah kebiasaan dalam aplikasi web adalah suntikan SQL. Komik di bawah menggambarkan kesan kes Suntikan SQL. Perenggan seterusnya akan menghuraikan maksud yang tersirat di dalam komik tersebut.

(http://xkcd.com/327/)

Suntikan SQL adalah merujuk kepada proses memasukkan arahan SQL ke dalam pernyataan query yang terdapat dalam skrip anda. Adakalanya skrip anda memerlukan input dari pengguna untuk proses berikutnya. Nilai ini sepatutnya membantu proses berjalan seperti yang dirancangkan. Walaubagaimanapun ia boleh bertindak sebaliknya jika kandungannya mengelirukan aplikasi anda.


Dalam contoh di atas, kita andaikan pihak sekolah mempunyai pernyataan query seperti berikut:
$Sql = "INSERT INTO Pelajar (nama) VALUE ('{$ _POST [' student_name ']}')";

Dalam pernyataan tersebut aplikasi sepatutnya akan menyimpan nilai student_name ke dalam field nama pada table Pelajar. Selagi pengguna mematuhi format yang ditetapkan, sistem akan berfungsi seperti yang dijangka. Seandainya pengguna memasukkan nilai yang ganjil (si ibu memasukkan potongan arahan SQL kononnya sebagai sebahagian dari nama anaknya), maka aplikasi mungkin bertindak di luar jangkaan.


Mari kita lihat bagaimana pertanyaan kelihatan apabila kita memasuki rentetan yang diberikan oleh ibu:
INSERT INTO students (name) VALUES ('Robert'); DROP TABLE Students;--')
Seperti yang anda mungkin tahu, semicolon (;) adalah tanda henti bagi satu baris arahan manakala tanda hyphens (--) bermaksud bahawa teks sesudahnya adalah komen dan bukan skrip arahan. Dalam kes di atas, nilai input telah mengubahsuai pernyataan query asal dengan mencipta pernyataan query tambahan “DROP TABLE Students;”. Seterusnya, hyphens mengakibatkan skrip aplikasi mengabaikan baki kod di dalam peryataan query asal. Kesudahannya, pernyataan query tambahan ini telah mengakibatkan skrip aplikasi memadam table student dari database aplikasi tersebut.

Percubaan di atas tidak memerlukan kuasa minda yang tinggi untuk menjayakannya. Penggodam hanya perlu meneka arahan query aplikasi dan seterusnya menyusun arahan SQL Injection yang sesuai. Akibatnya, data boleh dicuri atau dihapuskan.

No comments:

Post a Comment