Langkah-langkah mengamankan aplikasi web atau website

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

raw php inject script

 

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.

  1. Buat file robot.txt pada root folder aplikasi anda
  2. 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 :

https://www.digitalocean.com/community/tutorials/how-to-set-up-mod_security-with-apache-on-debian-ubuntu

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…

3 thoughts on “Langkah-langkah mengamankan aplikasi web atau website”

Leave a Comment

Your email address will not be published. Required fields are marked *

Exit mobile version