Langkah Langkah mengamankan Aplikasi Web atau Website
SQL Injection
htmlspecialchars
Lakukan filter terhadap segala input baik dalam bentuk $_POST maupun $_GET yang diterima oleh aplikasi anda, misalnya dengan cara berikut :
htmlspecialchars($_POST['username']);
Fungsi ini akan merubah single quote ( ‘ ) menjadi kode bentuk html ĵ |
Berikut beberapa perubahan karakter yang akan dikonvesi oleh fungsi ini
Ref :
http://php.net/manual/en/function.htmlspecialchars.php
https://stackoverflow.com/questions/8106579/is-using-htmlspecialchars-sufficient-in-all-situations
mysqli_real_escape_string
Jika anda menggunakan php native mesti melakukan escaping terhadap string $_POST atau $_GET yang anda terima.
Contoh penggunaannya adalah :
$con=mysqli_connect("localhost","my_user","my_password","my_db"); mysqli_real_escape_string($con, $_POST['firstname']);
Apabila menggunakan framework codeigniter (yang belum terintegrasi pada query raw) anda bisa gunakan code berikut :
function escape_string($val) { $db = get_instance()->db->conn_id; if (is_array($val)) { foreach ($val as &$value) { $value = mysqli_real_escape_string($db, $value); } } if (!is_array($val)) { $val = mysqli_real_escape_string($db, $val); } return $val; }
Lakukan perubahan terhadap Charset database atau tabel anda menjadi utf8
Mengapa sih perlu melakukan perubahan terhadap charset database, jawabannya adalah karena pada saat prepared statement (mysqli_real_escape diatas) maka requirementnya perlu bahwa tabel tersebut memiliki charset utf8.
https://stackoverflow.com/questions/367711/what-is-the-best-collation-to-use-for-mysql-with-php
http://php.net/manual/en/pdo.quote.php
Sesuaikan Header Charset response sesuai dengan konten
Perhatikan gambar berikut :
Pada tayangan diatas salah satu hacker melakukan Get Request dan dihasilkan Content-Type yang dapat diterima merupakan charset=UTF-8, padahal data yang akan dikirimakan oleh server merupakan data berupa json. Kesalahan dalam menentukan format data ini akan mengakibatkan url tersebut dapat di-injek dengan serangan script XSS atau HTML injection
Solusinya :
Lakukan pengaturan konfigurasi terhadap content – type apabila server menghasilkan data json atur dengan Content-Type: application/json
referensi :
Hack Open Journal System
Use PHP library and prepared the statement.
Tinggalkan php native kawan, begitu banyak yang mesti anda setup agar aplikasi bisa siap digunakan secara online. Gunakan best practices dari berbagai macam framework yang sudah tersedia. Memang anda perlu investasi waktu dalam memahami alur kerja dari framework atau library tersebut. Namun dalam proses selanjutnya anda akan sangat dimudahkan baik anda sadari atau tidak (misalnya dengan adanya auto escaping terhadap query anda). Library dari bagian framework tertentu misalnya Laravel Eloquent, ParisORM, Codeigniter Active Record dan yang lain akan secara otomatis melakukan escaping statement query anda.
Framework mana sih yang paling bagus… pertanyaan ini tentu tidak bisa dijawab langsung kawan. setiap framework memiliki keunggulan dan best cases masing-masing. Misalnya anda jor-joran menyampaikan dengan Pede-nya bahwa laravel paling bagus…. naay… bagaimana jika klien telah memiliki aplikasi yang telah dibangun dengan basis Codeigniter ? Tentu developer tidak bisa bilang bahwa aplikasi perlu dirancang dari awal yang tentunya sangat tidak efesien. Bagaimana jika kasus tertentu anda ingin membangun REST Api interface Sederhana ? Menggunakan laravel terlalu ribet dengan segala fitur dan kelemotannya.
Restriksi Eksekusi File pada folder tertentu
Hal ini bermanfaat misalnya saja pada folder upload di aplikasi anda ternyata hacker berhasil mengupload file aplikasi misal dalam bentuk file php, python dan lain sebagainya maka anda perlu pastikan bahwa folder tersebut bukan tempat yang bisa untuk menjalankan code yang ada pada jenis-jenis file tersebut. Caranya dengan menambahkan file .htaccess di folder tersebut dan tambahkan script berikut :
php_flag engine off <FilesMatch "\.(?:inc|php|py|rb|js|html)$"> deny from all </FilesMatch>
Block Iframe call
Pemanggilan situs anda menggunakan iframe akan membuka celah keamanan clickjacking. berikut cara melakukan pencegahan tersebut :
<ifModule mod_headers.c> Header set X-Frame-Options SAMEORIGIN <FilesMatch "\.(appcache|atom|bbaw|bmp|crx|css|cur|eot|f4[abpv]|flv|geojson|gif|htc|ico|jpe?g|js|json(ld)?|m4[av]|manifest|map|mp4|oex|og[agv]|opus|otf|pdf|png|rdf|rss|safariextz|svgz?|swf|topojson|tt[cf]|txt|vcard|vcf|vtt|webapp|web[mp]|webmanifest|woff2?|xloc|xml|xpi)$"> Header unset X-Frame-Options </FilesMatch> </ifModule>
Ref :
https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Frame-Options
https://stackoverflow.com/questions/7289139/why-are-iframes-considered-dangerous-and-a-security-risk
Test Your Websecurity
Test keamanan situs kamu dengan menggunakan tools seperti SecApps, Netsparker, http://w3af.org dan lainnya untuk menggambarkan kelemahan yang mungkin bisa kamu cegah di situs yang kamu miliki.
Disable error reporting
Untuk environment production jangan lupa mematikan error reporting. Untuk codeigniter anda dapat mengubah configurasi berikut
Pada file config/database.php
Ubah konfigurasi database pada line yang sama dengan pengaturan berikut :
$db['default']['db_debug'] = false;
Pada file index.php
Rubah line berikut (sebelumnya development menjadi production)
define('ENVIRONMENT', isset($_SERVER['CI_ENV']) ? $_SERVER['CI_ENV'] : ‘production’);
Atur pada konfigurasi php.ini terhadap error_reporting menjadi nilai 0.
Setup File Robot.txt
File robot txt merupakan file index dan petunjuk bagi search engine sebagai pengaturan boleh tidaknya suatu halaman di index oleh search engine. Misalnya anda memiliki folder / url admin dan folder tersebut tidak ingin diindex oleh search engine karena akan mengandung sensitif data maka sebaiknya lakukan pengaturan pada file robot.txt caranya.
- Buat file robot.txt pada root folder aplikasi anda
- Buat settingan (contoh) sebagai berikut :
User-agent: * Disallow: /cgi-bin/ Disallow: /wp-admin/ Disallow: /config.php Disallow: /application/ Disallow: /uploads/ Disallow: /admin/
Hilangkan atau sembunyikan banner server anda
Dengan menghilangkan banner (identitas server) maka akan mengurangi hacker untuk menganalisa environment server anda. Misalnya ternyata dideteksi server anda menggunakan apache 2.1 sedangkan di versi apache tersebut sudah dipublikasi mengandung bug tertentu maka hacker dapat memanfaatkan bug tersebut dengan mengexploitasi bug tersebut pada server anda.
caranya ?
cara nya agak rumit apalagi jika anda menggunakan hosting karena hosting pengelolaan server sudah ditangani oleh administrator server hosting tersebut. Namun apabila anda menggunakan VPS atau dedicated server dapat menggunakan cara yang ada pada referensi berikut :
https://www.tecmint.com/hide-apache-web-server-version-information/
https://www.tecmint.com/hide-php-version-http-header/
Pada dasarnya untuk mod_security2 anda perlu install dulu dengan cara berikut :
Kemudian lakukan setup dengan cara berikut :
https://blog.rapid7.com/2017/04/09/how-to-configure-modsecurity-with-apache-on-ubuntu-linux/
Cari dulu file apache2.conf anda dengan perintah berikut :
/usr/sbin/apache2 -V | grep SERVER_CONFIG_FILE
Edit file tersebut
sudo nano /etc/apache2/apache2.conf
Tambahkan line berikut :
SecServerSignature YourServerName
Atau menggunakan htaccess dengan menambahkan line berikut dengan sebelumnya mengaktifkan mod_security pada apache (Catatan cara ini hanya berlaku jika server menggunakan mod_security versi 1 jika versi 2 maka perlu di setup di http.conf) :
# Disable the server signature ServerSignature Off # If mod_headers module is included, we will disable the Server response header totally <IfModule mod_headers.c> Header unset Server Header unset X-Powered-By </IfModule> SecServerSignature ‘ ‘
Jika anda menggunakan script diatas namun mod_security anda tidak compatible maka anda akan menemukan pesan error berikut di apache.error.log lokasinya di ubuntu :
sudo nano /var/log/apache2/error.log Invalid command 'SecFilterEngine', perhaps misspelled or defined by a module not included in the server configu$ SecServerSignature not allowed here
Before :
After :
Disable Directory index
Matikan fitur directory index seperti tampilan berikut
# Disable directory browsing Options All -Indexes
Before :
After
Disable XSS
XSS adalah methode yang diterapkan oleh hacker untuk menyisipkan kode javascript pada isian / input yang ada di halaman web anda. Dengan kelemahan ini hacker tinggal menyebarkan link yang mengandung script javascript tersebut kepada potensial user yang akan di exploitasi. Ada dua cara dalam menangani XSS. pertama dengan cara mensetup server agar memblok aktivitas XSS ini caranya dengan menambahkan baris script berikut di .htaccess
Header set X-XSS-Protection "1; mode=block"
Cara kedua adalah anda mesti melakukan filterisasi kode atau karakter javascript yang ada di isian input kolom halaman situs anda. Ini dilakukan misalnya dengan memaksimalkan library html-purify yang sudah tersedia. Saya akan menjelaskan instalasi library ini dengan menggunakan framework codeigniter.
1. Copy script berikut dan tambahkan pada folder helpers dengan nama file html_purifier_helper.php
<?php if (!defined('BASEPATH')) { exit('No direct script access allowed'); } /* * Codeigniter HTMLPurifier Helper * * Purify input using the HTMLPurifier standalone class. * Easily use multiple purifier configurations. * * @author Tyler Brownell <tyler@bluefoxstudio.ca> * @copyright Public Domain * @license http://bluefoxstudio.ca/release.html * * @access public * @param string or array $dirty_html A string (or array of strings) to be cleaned. * @param string $config The name of the configuration (switch case) to use. * @return string or array The cleaned string (or array of strings). */ if (!function_exists('html_purify')) { function html_purify($dirty_html, $config = false) { require_once APPPATH . 'third_party/htmlpurifier-4.10.0-standalone/HTMLPurifier.standalone.php'; if (is_array($dirty_html)) { foreach ($dirty_html as $key => $val) { $clean_html[$key] = html_purify($val, $config); } } else { $ci = &get_instance(); switch ($config) { case 'comment': $config = HTMLPurifier_Config::createDefault(); $config->set('Core.Encoding', $ci->config->item('charset')); $config->set('HTML.Doctype', 'XHTML 1.0 Strict'); $config->set('HTML.Allowed', 'p,a[href|title],abbr[title],acronym[title],b,strong,blockquote[cite],code,em,i,strike'); $config->set('AutoFormat.AutoParagraph', true); $config->set('AutoFormat.Linkify', true); $config->set('AutoFormat.RemoveEmpty', true); break; case false: $config = HTMLPurifier_Config::createDefault(); $config->set('Core.Encoding', $ci->config->item('charset')); $config->set('HTML.Doctype', 'XHTML 1.0 Strict'); break; default: show_error('The HTMLPurifier configuration labeled "' . htmlspecialchars($config, ENT_QUOTES, $ci->config->item('charset')) . '" could not be found.'); } $purifier = new HTMLPurifier($config); $clean_html = $purifier->purify($dirty_html); } return $clean_html; } } /* End of htmlpurifier_helper.php */ /* Location: ./application/helpers/htmlpurifier_helper.php */
2. kemudian download sumber library ini disini :
3. Ekstract dan copikan file tersebut di folder third_party
jangan lupa di load helpers tersebut sehingga anda bisa menggunakan fungsi tersebut dengan cara berikut :
html_purify($_POST['username']);
https://www.petefreitag.com/item/505.cfm
https://geekflare.com/apache-web-server-hardening-security/
Encrypt Cookies
Tambahkan script berikut di .htaccess
php_value session.cookie_httponly 1 php_value session.cookie_secure 1
Or add this on main php file (if you dont use framework)
// **PREVENTING SESSION HIJACKING** // Prevents javascript XSS attacks aimed to steal the session ID ini_set('session.cookie_httponly', 1); // **PREVENTING SESSION FIXATION** // Session ID cannot be passed through URLs ini_set('session.use_only_cookies', 1); // Uses a secure connection (HTTPS) if possible ini_set('session.cookie_secure', 1);
Jika anda menggunakan framework cara diatas biasanya sudah disediakan konfigurasinya secara otomatis misalnya pada codeigniter maka anda bisa setting nilai berikut menjadi true pada file config.php
$config[‘cookie_secure’] = true;
Atur restriksi pada folder script utama
Kesalahan umum pemula adalah membiarkan seluruh folder script proyek anda bisa ditulis (write permission) oleh group user apache. Apa yang terjadi dengan setup sepertin ini… maka apabila ada backdoor yang berhasil dimasukkan ke situs anda dengan mudah hacker dapat mengganti seluruh file yang ada di proyek anda.
Caranya anda mesti atur bahwa hanya folder upload, cache saja yang bisa ditulis oleh group apache.
Cara ini misalnya di command linux bisa dituliskan dengan cara berikut
sudo chown -R root:root folder_proyek
Kemudian anda bisa atur hak akses terhadap folder dengan code berikut ( Izinkan apache untuk menulis) :
sudo chmod -R 775 www-data:www-data /folder_proyek
Atur restriksi aksesibilitas berbeda untuk tiap user di database
Jangan biarkan satu user di database digunakan oleh banyak aplikasi yang ada di server anda. Apabila salah satu aplikasi anda rentan dan ternyata mampu dibaca oleh hacker misalnya file .env , database.php , atau db_config.php maka besar kemungkinan seluruh aplikasi anda akan hancur berantakan. Caranya atur hak akses tiap user pada database yang digunakan khusus oleh user tersebut. Pada phpmyadmin anda bisa klik tab User Account :
Update server, library, plugin, framework
Selalu sedia untuk mengupdate segala plugin, aplikasi misalnya tinggalkan saja php versi 5.xx segera upgrade versi php anda menjadi php 7.xx. Php diatas versi 5 menjadikan banyak script backdoor yang tersedia bebas di internet menjadi tidak jalan (karena adanya perubahan standar penulisan di php 7). Jika anda menggunakan wordpress segera lakukan update terhadap core wp anda serta plugin yang terinstall. Update segala library yang ada di server anda misalnya imagemagick, apache dan lain sebagainya.
Baca juga bagaimana saya menangani wordpress yang kena hack disini : [insert page=’cara-menangani-wordpress-yang-di-hack’ display=’link’ inline]
Backup, Backup dan Backup
segera lakukan tindakan disaster recovery salah satunya membackup aplikasi web anda baik itu database maupun asset. Kita tidak tahu kapan kita bisa kena serang. Pengamanan dari aplikasi web anda bagus bagaimaan dengan pengamanan servernya, kesalahan teknis misalnya servernya fail, app web dari tetangga anda yang ada di share hosting atau ada kesalahan waktu anda melakukan perintah SSH. Selalu lakukan tindakan backup secara berkala dan ingat backup yang baik dilakukan di server yang berbeda bukan pada server yang sama.
Masih ada yang tertinggal, silahkan berikan saran apabila ada yang kurang dari langkah paranoid diatas hehe…
ok sama2
Terimakasih teman
THX gan