Agen Terpercaya  
 
 
 
 
Pasang iklan, hanya lewat Contact Us.
Waspada penipuan iklan. Klik di sini untuk melihat daftar penipu.

SHARE Saran Jika Anda Sedang Menggunakan Node Js Pada Web Yang Anda Bikin Dan Cara Agar Aman

RayMantic

Moderator
Staff member
Moderator
Daftar
4 Oct 1988
Post
Like diterima
9.147
Bimabet
Ini saya share dengan sebuah pengalaman saya oprek web . web yang paling susah dan butuh waktu untuk mengukur tingkat kelemahan dan celah adalah web yang di bangun menggunakan Node-JS dan yang paling rentan adalah PHP .Meskipun Semuanya tergantung dari implementasi Dev untuk menganalogika keamanan itu sendiri...
ada yang menggunakan PHP namun rapat nya bukan main dengan beberapa lapisan sekuriti jadi satu sehingga membutuhkan banyak waktu untuk menganalisis nya bahkan tool pun kadang juga meleset untuk mengesekusinya karena sistem berlapis sehingga yang di baca tool itu adalah bukan hash yang sebenarnya.ada juga yang sudah memakai nodejs namun implementasi logikanya amburadul [biasanya saya jumpai pada web resmi instansi entah karena memang kesalahan pengambilan logika atau memang dev belum sempat upgrade skill ].

jadi tergantung seberapa besar kita niat untuk mengamankan web kita sendiri .

Berikut merupakan dasar keamanan yang dapat diterapkan dalam membangun aplikasi menggunakan Node JS :

1. Selalu gunakan ‘use strict’ pada awal program atau function
Tujuan penggunaan use strict adalah untuk memperketat penulisan kode pemrograman pada bahasa pemrograman javascript. Salah satu aturan yang terikat didalamnnya adalah bahwa semua penggunaan variable yang belum dideklare tidak dapat digunakan atau akan mengakibatkan error.
Beberapa hal yang dilarang dalam menulis program pada mode Strict diantaranya yaitu :
a. Membuat variable baru tanpa melakukan declare terlebih dahulu pada nama variable yang akan dibuat. Karena pada mode normal, variabel yang dibuat tanpa di declare akan tetap berjalan.
Code:
'use strict'

bola = 0; //Dikenali sebagai kesalahan (error)
b. Menggunakan delete statement yang digunakan pada variabel, fungsi ataupun argument.
Code:
'use strict'

var phi = 3.14;
delete phi; //Dikenali sebagai kesalahan (error)

c. Membuat duplicate property. Dengan kata lain semua properti yang dibuat dalam suatu object pada mode strict harus unik.
Code:
'use strict';
var indonesia  = { kabupaten: 1, kota: 2, kota: 3, provinsi: 4  }; // Dikenali sebagai kesalahan (error)
d. Mendefinisikan attribute pada object secara berulang pada variabel yang sama. Aturan mode strict melarang sebuah object yang telah didefinisikan dalam sebuah attribute atau property untuk didefinisikan kembali.
Code:
//Membuat object dengan property readonly

var facebook = {};
Object.defineProperty(facebook, 'app', { value: 50, writable: false });
facebook.app = 103; //Dikenali sebagai kesalahan (error)// Membuat object dengan property readonly

var twit**ter = { get app() { return 51; } };
twit**ter.app = 130; //Dikenali sebagai kesalahan (error)// Membuat object dengan property pada object yang tidak dikenali

var google = {};
Object.preventExtensions(google);
google.newProp = 'app'; // Dikenali sebagai kesalahan (error)
e. Mode strict mensyaratkan untuk membuat parameter pada fungsi secara unik.
Code:
'use strict'

function sum(data1, data1, data2) { // Dikenali sebagai kesalahan (error)
}
f. Mode strict melarang sintax oktal. Aturan baru pada ECMAScript 2015 penggunaan oktal dapat digunakan dengan prefix number yang digunakan sebagai awalan yaitu “0o”.
Code:
let Obj1 = 060; // Dikenali sebagai kesalahan (error)

let Obj2 = \060; // Dikenali sebagai kesalahan (error)
let Obj3 = 060 + 180 + 200; // Dikenali sebagai kesalahan (error)
g. Mode strict di ECMAScript 2015 melarang pengaturan properti pada nilai-nilai primitif.
Code:
function() {

'use strict';
false.true = ''; // Dikenali sebagai kesalahan (error)
(14).sailing = 'home'; // Dikenali sebagai kesalahan (error)
//Penggunaan with statement tidak diperbolehkan
'with'.you = 'so cool'; // Dikenali sebagai kesalahan (error)
})();


2. Gunakan TLS dan SSL untuk mengamankan Transmisi Data
Contoh Implementasi HTTPS pada Node JS :

Code:
let https = require('https');
let fs = require('fs');

let options = {
  key: fs.readFileSync('/opt/certs/example.com.key'),
  cert: fs.readFileSync('/opt/certs/example.com.crt')
};

https.createServer(options, function (req, res) {
  res.writeHead(200);
  res.end("Welcome to Node.js HTTPS Server!!!");
}).listen(3443);


3. Melakukan konfigurasi keamanan pada HTTP Header
Tahap pengamanan pada HTTP Header ini pada dasarnya dapat dilakukan pada 2 sisi yaitu server (Contoh: Apache, Nginx dll) dan juga dari sisi Aplikasi (Node JS). Pada sisi aplikasi yang dibuat dengan menggunakan Node.js, metode atau cara mengamankannnya dapat dilakukan dengan cara menerapkan module baru yaitu helmet. Module ini dilengkapi dengan beberapa variasi konfigurasi yang dapat diterapkan pada HTTP header. Module yang berjalan diatas framework Express ini juga dapat digunakan dengan sangat mudah, berikut merupakan tahap instalasi module helmet pada Node Js:

a. Install module helmet pada aplikasi node JS
Code:
npm install helmet –save
b. Menggunakan modul helmet pada baris program
Code:
var express = require('express')
var helmet = require('helmet')
var app = express()
app.use(helmet())


Contoh script yang rentan terhadap serangan SQL Injection :

Code:
var mysql = require('mysql');
var express = require('express');
var connection = mysql.createConnection({
    host: 'localhost',
    user: 'root',
    database: 'injection',
    password: '',
    multipleStatements: true // Mengaktifkan eksekusi multiple statement
});
connection.connect(function(err){
if(!err) {
    console.log("Berhasil terkoneksi dengan database !!!"); 
} else {
    console.log("Gagal terkoneksi dengan database !!!"); 
}
});
var app = express();
app.get('/:id', function(req, res, next) {
    //Query SQL yang tidak terfilter dengan benar
    connection.query('SELECT * FROM users WHERE id="' + req.param('id') + '"', function(err, rows, fields) {
        if (err) {
            next(err);
            return;
        }
        res.send(JSON.stringify(rows));
    });
});
app.listen(3000);
console.log('Server Berjalan Port 3000 :)');


b. Dump database menggunakan sample data dibawah ini

Code:
CREATE TABLE IF NOT EXISTS `users` (
`id` int(11) NOT NULL,
  `full_name` varchar(255) NOT NULL,
  `user_name` varchar(255) NOT NULL,
  `email` varchar(100) NOT NULL
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;

INSERT INTO `users` (`id`, `full_name`, `user_name`, `email`) VALUES
(1, 'Sam Ben', 'samben', '[email protected]'),
(2, 'Ofani Dariyan', 'ofani', '[email protected]'),
(3, 'Toni Stark', 'toni', '[email protected]'),
(4, 'Mrs Valak', 'valak', '[email protected]'),
(5, 'Iron Wine', 'iron', '[email protected]');

c. Ketika anda menjalankan program diatas http://localhost:3000/1 , secara normal halaman web akan menampilkan data pada id 1 :

[{"id":1,"full_name":"Sam Ben","user_name":"samben","email":"[EMAIL][email protected][/EMAIL]"}]

d. Filter data yang tidak divalidasi memungkinkan user untuk menginjeksi command SQL secara langsung dengan mengakses :

[URL='http://localhost:3000/%22;SELECT%20*%20FROM%20users%20WHERE%20%221%22=%221']SELECT%20*%20FROM%20users%20WHERE%20%221%22=%221[/URL]

e. Sistem akan melakukan query secara berulang dengan manipulasi yang diterima melalui user , hingga sistem akan mengeksekusi query dibawah ini :

SELECT * FROM users WHERE name="";SELECT * FROM users WHERE "1"="1";

f. Dampaknya sistem akan menampilkan semua data yang ada pada tabel users.

[[],[{"id":1,"full_name":"Sam Ben","user_name":"samben","email":"[EMAIL][email protected][/EMAIL]"},{"id":2,"full_name":"Ofani Dariyan","user_name":"ofani","email":"[EMAIL][email protected][/EMAIL]"},{"id":3,"full_name":"Toni Stark","user_name":"toni","email":"[EMAIL][email protected][/EMAIL]"},{"id":4,"full_name":"Mrs Valak","user_name":"valak","email":"[EMAIL][email protected][/EMAIL]"},{"id":5,"full_name":"Iron Wine","user_name":"iron","email":"[EMAIL][email protected][/EMAIL]"}]]

g. Hal ini juga memungkinkan untuk melakukan drop tabel users menggunakan command line dibawah ini:

;DROP%20TABLE%20users;

Opsi berikut ini merupakan teknik pengamanan yang tepat dan efektif yang dapat dilakukan pada aplikasi Node JS:
Code:
//Query SQL yang sudah terfilter dengan benar
connection.query('SELECT * FROM users WHERE id= ?', [req.param('id')], function(err, rows, fields) {
  if (err) {
   next(err);
   return;
  }
  res.send(JSON.stringify(rows));
});

5. OS Command Injection
Berikut merupakan contoh penerapan fungsi child_process.exec() pada Node JS yang memungkinkan aplikasi menampilkan data pada suatu path/folder.

a.Contoh dasar shell command execution pada node JS untuk menampilkan data pada path tertentu.
Code:
const exec = require('child_process').exec;
var express = require('express');
var app = express();

app.get('/listfile', function(req, res, next) {
    exec('ls -la' , (error, stdout, stderr) => {
  if (error) {
    throw error;
  }
  console.log(stdout);
  res.send(stdout);
});
});
app.listen(3000);
console.log('Server Berjalan Port 3000 :)');

b. Bagaimana jika user diberikan hak akses melalui input untuk melakukan eksekusi secara langsung ?
Code:
const exec = require('child_process').exec;
var express = require('express');
var app = express();

app.get('/listfile/:data', function(req, res, next) {
    exec('ls -la' + req.param('data'), (error, stdout, stderr) => {
  if (error) {
    throw error;
  }
  console.log(stdout);
  res.send(stdout);
});
});
app.listen(3000);
console.log('Server Berjalan Port 3000 :)');

c. Hasil eksekusi pada user input
total 18 drwxr-xr-x 1 Ofani 197609 0 Apr 4 00:11 . drwxr-xr-x 1 Ofani 197609 0 Apr 3 21:43 .. -rw-r--r-- 1 Ofani 197609 952 Apr 4 00:09 app.js -rw-r--r-- 1 Ofani 197609 624 Apr 4 00:17 child.js drwxr-xr-x 1 Ofani 197609 0 Apr 3 22:01 node_modules -rw-r--r-- 1 Ofani 197609 364 Apr 3 22:01 package.json

d. User dengan leluasa melakukan eksekusi untuk pindah dan masuk kedalam folder yang diinginkan.
total 4 drwxr-xr-x 1 Ofani 197609 0 Apr 4 00:29 . drwxr-xr-x 1 Ofani 197609 0 Apr 4 01:15 .. -rw-r--r-- 1 Ofani 197609 952 Apr 4 00:09 app.js

e. Untuk membatasi akses user pada sub-command anda dapat menerapkan fungsi child_process.execFile(), dimana fungsi ini berjalan dengan cara mengambil perintah yang diterima melalui user sebagai array dan tidak dijalankan pada lingkup shell, hal ini dapat dikatakan bahwa fungsi tersebut tidak rentan terhadap perintah injeksi.
Code:
const execFile = require('child_process').execFile;
var express = require('express');
var app = express();

app.get('/listfile/:data', function(req, res, next) {
    execFile('ls' , ['-la',req.param('data')], (error, stdout, stderr) => {
  if (error) {
    throw error;
  }
  console.log(stdout);
  res.send(stdout);
});
});
app.listen(3000);
console.log('Server Berjalan Port 3000 :)');


SEMOGA ADA MANFAATNYA
MESKIPUN KITA BISA OPREK NAMUN ADA BAIKNYA BISA MEMBERIKAN SARAN BAGAIMANA MENGAMANKAN.
LEBIH BAIK MEMBANTU DARIPADA MERUSAK.
HARGAILAH HASIL KARYA ORANG LAIN
 
Terakhir diubah:
Gaple Online Indonesia
Pasang iklan hanya lewat CONTACT US
Back
Top
We are now part of LS Media Ltd