Mekanisme Keamanan Aplikasi Web di Sistem Operasi Tizen

Toni Haryanto 26 September 2016

Mekanisme Keamanan Aplikasi Web di Sistem Operasi Tizen

Tizen sebagai sebuah sistem operasi terbuka, memungkinkan untuk dapat dikembangkan sehingga memiliki berbagai fitur yang lebih kaya dan variatif. Dengan peningkatan pengalaman pengguna tersebut, maka pengguna harus dapat mengontrol sejauh mana data yang dapat diakses oleh suatu aplikasi, terutama terkait privasi dan data-data sensitif pengguna. Itulah maksud dari istilah keamanan yang digunakan dalam konteks pengembangan aplikasi Tizen.

Contoh sederhana adalah akses aplikasi terhadap data pengguna seperti data pesan SMS. Walau bagaimanapun data SMS yang ada di dalam inbox pengguna adalah bagian dari privasi pengguna yang tidak boleh diakses sembarangan tanpa seizin pengguna. Di sisi lain, sistem operasi Tizen menyediakan API yang memungkinkan pengembang aplikasi untuk dapat membaca dan menulis data pesan SMS yang ada di dalam inbox pengguna. Apabila API ini dapat digunakan begitu saja tanpa pemberitahuan kepada pengguna, maka peluang penyalahgunaan aplikasi atas data-data pengguna akan sangat besar, seperti misalnya penyadapan pesan SMS.

Selain itu, kemanan pada aplikasi Tizen juga mencakup perihal akses data dari dan ke sumber eksternal seperti website atau server API. Pada artikel ini akan dijelaskan poin-poin penting terkait keamanan dalam pengembangan aplikasi Tizen khususnya aplikasi mobile web.

API Privileges

Tizen menyediakan sejumlah API untuk melakukan serangkaian operasi tertentu dan mengakses sejumlah fitur dan data, yang bila tidak digunakan dengan semestinya, dapat mengganggu privasi pengguna dan stabilitas sistem. Oleh karena itu, aplikasi yang menggunakan API yang sensitif harus mendeklarasikan terlebih dahulu sejumlah hak penggunaan/akses (privileges) pada file config.xml. 1

Ketika suatu aplikasi mengajukan penggunaan suatu API yang membutuhkan hak akses khusus, sistem Tizen akan mengecek terlebih dahulu apakah hak akses untuk API tersebut sudah didaftarkan di dalam file config.xml. Apabila hak akses belum dideklarasikan, maka sistem Tizen akan menahan aplikasi untuk menjalankan API tersebut.

Adapun daftar dari API beserta privilege yang harus dideklarasikan untuk mendapatan hak akses khusus API tersebut dapat dilihat pada tabel di halaman https://developer.tizen.org/development/getting-started/web-application/understanding-tizen-programming/security-and-api-privileges.

Cross Origin Resource Sharing

Cross-Origin Resource Sharing atau disingkat CORS adalah suatu mekanisme yang membolehkan suatu resource untuk dapat diakses dari suatu halaman web dengan domain tertentu di luar domain dari resource tersebut. Suatu halaman web dapat menyisipkan (embed) suatu resource/konten seperti gambar, video, script, dan iframe dari domain lain. Akan tetapi beberapa resource seperti embedded webfont dan rekues AJAX (XMLHttpRequest) hanya dapat diakses dari domain yang sama dari halaman induknya, berdasarkan ketentuan Same-origin policy. Same-origin policy membatasi bagaimana sebuah dokumen atau script yang dimuat dari suatu origin dapat berinteraksi dengan resource dari origin lain. Ini adalah bagian dari mekanisme pengamanan untuk menghindarkan dari dokumen yang berpotensi merusak.

Dua origin dikatakan yang sama ketika mereka memiliki protocol, port, dan host yang sama. Sebagai contoh misalkan kita punya sebuah halaman web di domain http://www.domain.com/index.html. Halaman tersebut hanya dapat mengakses rekues AJAX ke URL lain yang memiliki port, protokol dan host yang sama. Perhatikan tabel contoh URL berikut:

URLHasil rekuesAlasan
http://www.domain.com/ajax.htmlSukses
https://www.domain.com/ajax.htmlGagalBerbeda protokol
http://www.domain.com:8080/ajax.htmlGagalBerbeda port
http://api.domain.com/ajax.htmlGagalBerbeda host
Pada aplikasi Tizen, domain originnya adalah https://localhost:8080. Hal ini tentunya membuat aplikasi kita tidak dapat melakukan rekues AJAX ke server luar yang mana memiliki domain yang berbeda dengan aplikasi. Oleh karena itulah diperlukan proses cross-origin request (COR) terlebih dahulu. Tizen sudah mendukung mekanisme cross-origin resource sharing (CORS) yang berfungsi mengaktifkan client-side cross-origin request.

CORS mendukung dua tipe rekues: simple dan preflight.

Simple Request

Sebuah rekues dikatakan simple request bila memenuhi semua kondisi berikut:
  • HTTP method hanya menggunakan GET, POST dan HEAD
  • Tidak ada custom header yang diperbolehkan
  • Content-type memenuhi salahsatu opsi berikut:
    • application/x-www-form-urlencoded
    • multipart/form-data
    • text/plain
Ketika menggunakan simple request, respon dari server harus diset dengan menggunakan response header:
  • Access-Control-Allow-Origin (wajib)
  • Access-Control-Allow-Credentials (opsional)
  • Access-Control-Expose-Headers (opsional)
2

Berikut adalah contoh teknis dari implementasi simple request:

  1. Buat rekues XML HTTP dari aplikasi clien, dalam hal ini aplikasi mobile web Tizen, menggunakan kode JavaScript untuk merekues AJAX:
    <script>
    var method = "GET";
    var url = "http://another-domain.com/CORS/";
    var xhr = new XMLHttpRequest();
    xhr.open(method, url);
    xhr.send();
    </script>
  2. Di sisi server, definisikan domain yang akan diperbolehkan untuk mengirim rekues. Dalam kasus ini domainnya adalah http://origin-domain.com.
    <?php
      header("Access-Control-Allow-Origin: http://origin-domain.com");
    ?>
    Apabila kita hendak memperbolehkan semua rekues dari mana saja diterima, maka gunakan wildcard (*).
    <?php
      header("Access-Control-Allow-Origin: *");
    ?>
  3. Cek response header:
    • Apabila rekues diterima dengan otoritas akses, server akan membolehkan respon. Response header akan menyertakan header Access-Control-Allow-Origin di sisi server.
      HTTP/1/1 200 OK
      Access-Control-Allow-Origin: http://origin-domain.com
    • Bila rekues diterima tanpa otoritas akses, server tidak akan mengirimkan respon, dan akan muncul error:
      XMLHttpRequest cannot load http://another-domain.com/CORS.
      Origin http://another-domain.com/CORS is not allowed by Access-Control-Allow-Origin.

Preflight Request

Preflight request berarti rekues yang non-simple, dan bersifat case-sensitive. Apabila otoritas akses diperbolehkan melalui preflight request, maka kita dapat melakukan akses rekues selanjutnya untuk mengirim data. Preflight request dapat memperbolehkan akses berdasarkan variasi standar selain Origin, seperti HTTP certification, HTTP method (seperti GET, POST, PUT, dll), atau cara lain sesuai dengan headernya.

Bila menggunakan preflight request, respon yang diset di server harus menggunakan response header berikut:

  • Access-Control-Allow-Origin (wajib)
  • Access-Control-Allow-Methods (wajib)
  • Access-Control-Allow-Headers (wajib, bila menggunakan custom header)
  • Access-Control-Allow-Credentials (opsional)
  • Access-Control-Expose-Headers (opsional)
  • Access-Control-Max-Age (opsional)
3

Berikut adalah contoh teknis dari implementasi preflight request:

  1. Buat XML HTTP Request di sisi klien, dalam hal ini di dalam aplikasi mobile web Tizen, menggunakan JavaScript untuk merekues AJAX. Tambahkan rekues Content-Type dan custom header.
    <script>
    var xhr = new XMLHttpRequest();
    xhr.open("PUT", "http://another-domain.com/CORS/");
    xhr.setRequestHeader("Content-Type", "application/json");
    xhr.setRequestHeader("Header-Custom-TizenCORS", "OK");
    xhr.send(data);
    </script>
  1. Di sisi server, definisikan domain yang diperbolehkan rekues. Dalam kasus ini domain yang memiliki otoritas adalah http://110.0.0.160:8081. Tambahkan juga beberapa pengaturan server lainnya.
    <?php
    header("Access-Control-Allow-Origin: http://110.0.0.160:8081");
    

    /* Allowed request method */ header("Access-Control-Allow-Methods: PUT");

    /* Allowed custom header */ header("Access-Control-Allow-Headers: Content-Type");

    /* Age set to 1 day to improve speed caching */ header("Access-Control-Max-Age: 86400");

    /* Options request exits before the page is completely loaded */ if (strtolower($_SERVER['REQUEST_METHOD']) == 'options') { exit(); }

    /* Response data */ $arr = array("user_name" => "tizen", "phone_number" => "12312334234");

    /* Response data returned in JSON format */ echo json_encode($arr);

    ?>

  2. Cek rekues dan respon header. Bila kita mengecek network log, kita akan menemukan 2 komunikasi antara browser dan server terjadi berturut-turut: pertama adalah preflight request dan responnya, baru kemudian request dan respon yang aktual.
    • Preflight request mengecek otoritas akses sebelum mengirim data yang aktual. Header Origin dan Access-Control-Request-Headers telah ditambahkan ke dalam request, karena request sudah memiliki custom header yang didefinisikan sendiri, dan Content-Type diset ke application/json.
      OPTION http://origin-domain.com/CORS/non_simple_reqeust.html HTTP/1.1
      Host: origin-domain.com
      Origin: http://origin-domain.com
      Access-Control-Request-Headers: Header-Custom-Tizen, origin, content-type
    • Bila request dikirim dari sisi browser, maka preflight response akan dikirim dari sisi server. Browser kemudian akan menentukan berdasarkan respon yang diterima, apakah data yang aktual sudah dikirim. Pada contoh preflight response berikut Content-Type dan Header-Custom-Tizen disertakan di dalam header Access-Control Allow-Headers.
      HTTP/1/1 200 OK
      Access-Control-Allow-Headers: Content-Type, Header-Custom-Tizen
      Access-Control-Allow-Methods: PUT
      Access-Control-Allow-Origin: http://origin-domain.com
      Access-Control-Max-Age: 86400
    • Sekali otoritas akses sudah dicek, browser akan mengirimkan data aktual yang direkues ke server. Rekues ini mengandung data yang aktual:
      PUT http://origin-domain.com/CORS/non_simple_reqeust.html HTTP/1.1
      Content-Type: application/json
      Host: origin-domain.com
      Origin: http://origin-domain.com
      Header-Custom-TizenCOURSTest: OK
    • Respon dari data aktual yang direkues mengandung hasil penanganan aktual:
      HTTP/1/1 200 OK
      Access-Control-Allow-Headers: Content-Type, Header-Custom-Tizen
      Access-Control-Allow-Methods: PUT
      Access-Control-Allow-Origin: http://origin-domain.com
      Access-Control-Max-Age: 86400
      Apabila otoritas akses ditolak, browser tidak akan mengirimkan data aktual, dan akan muncul pesan error di sisi browser:
      XMLHttpRequest cannot load http://another-domain.com/CORS.
      Request header field Header-Custom-Tizen is not allowed by Access-Control-Allow-Headers.

HTML5 iframe

HTML iframe biasa kita gunakan untuk menyisipkan halaman web lain ke dalam halaman web kita. Dalam hal pengembangan aplikasi mobile web Tize, iframe dapat digunakan untuk menangani isu keamanan dan juga desain dalam penyisipan konten web.

Fitur utama dari elemen iframe meliputi:

  1. Atribut sandbox Kita dapat menggunakan atribut sandbox pada elemen iframe untuk mengontrol eksekusi task yang dapat menghasilkan konten yang tidak reliabel, yang berarti meningkatkan keamanan aplikasi. Bila atribut sandbox diisi dengan nilai kosong, beberapa batasan berikut akan diterapkan:
    • Konten akan diperlakukan sebagai bagian dari origin yang unik. Akses ke cookie, local storage, dan halaman lain dari domain yang sama tidak akan diperkenankan.
    • Submit form akan dinonaktifkan
    • Eksekusi script akan dinonaktifkan
    • Navigasi link akan dinonaktifkan
    • Plugin akan dinonaktifkan
    • Popup akan dinonaktifkan
    Untuk dapat melalui pembatasan ini, kita dapat menggunakan kondisi pembatasan keamanan tambahan:
    • allow-same-origin, untuk mengaktifkan konten agar diperlakukan seolah-olah bagian dari origin yang sama
    • allow-top-navigation, mengaktifkan navigasi dari top-level context
    • allow-forms, mengaktifkan submisi form
    • allow-scripts, mengaktifkan eksekusi script, tetapi memblok popup
    • allow-popups, mengaktifkan pembukaan jendela popup dari elemen sandbox
  2. Atribut seamlessKita dapat menggunakan atribut seamless yang disediakan di elemen iframe untuk merender halaman sebagai bagian dari dokumen induk dan menampilkan di dalam elemen iframe.Catatan: atribut scrolling, align, frameborder, marginheight, marginwidth, dan longdesc tidak lagi didukung di versi terbaru dari HTML5.
 

Referensi:

https://developer.tizen.org/ko/development/getting-started/web-application/understanding-tizen-programming/security-and-api-privileges

https://developer.tizen.org/ko/development/tutorials/web-application/w3chtml5supplementary-features/security/cross-origin-resource-sharing

https://developer.tizen.org/ko/development/guides/web-application/w3chtml5supplementary-features/security/html5-iframe-element-0