Input dan Output

Selesai

Kelemahan keamanan yang paling umum dari aplikasi saat ini adalah kegagalan untuk memproses data yang diterima dari sumber eksternal dengan benar, terutama masukan pengguna. Anda harus selalu mencermati masukan apa pun untuk memastikannya telah divalidasi sebelum digunakan. Gagal menganalisis masukan pengguna yang membahas terkait kemungkinan serangan dapat mengakibatkan kehilangan atau paparan data, elevasi hak istimewa, atau bahkan eksekusi kode berbahaya di komputer pengguna lain.

Tragedi dalam situasi ini adalah bahwa skenario ini merupakan masalah yang mudah dipecahkan. Di unit ini kita akan membahas cara memperlakukan data saat diterima, ketika ditampilkan di layar, dan kapan disimpan untuk digunakan nanti.

Mengapa kita perlu memvalidasi input kita?

Bayangkan Anda membangun antarmuka untuk memungkinkan pengguna membuat akun di situs web Anda. Data profil kami mencakup nama, email, dan nama panggilan yang akan kami tampilkan kepada semua orang yang mengunjungi situs tersebut. Bagaimana jika pengguna baru membuat profil dan memasukkan nama panggilan yang menyertakan beberapa perintah SQL? Misalnya, bagaimana jika pengguna jahat memasukkan sesuatu seperti kutipan berikut:

Eve'); DROP TABLE Users;--

Jika kita secara membabi buta memasukkan nilai ini ke dalam database, itu berpotensi mengubah pernyataan SQL untuk menjalankan perintah yang sama sekali tidak ingin kita jalankan! Contoh ini disebut sebagai serangan "SQL Injection", yang merupakan salah satu dari banyak jenis eksploitasi yang berpotensi dilakukan bila Anda tidak menangani masukan pengguna dengan benar. Jadi, apa yang bisa kita lakukan untuk mengatasi situasi ini? Unit ini akan mengajari Anda kapan harus memvalidasi input, cara mengenkode output, dan cara membuat kueri berparameter (yang menyelesaikan eksploit di atas). Teknik-teknik ini adalah tiga teknik pertahanan utama terhadap masukan berbahaya yang dimasukkan ke dalam aplikasi Anda.

Kapan saya perlu memvalidasi input?

Jawabannya adalah selalu. Anda harus memvalidasi setiap masukan untuk aplikasi Anda. Ini termasuk parameter dalam URL, input dari pengguna, data dari database, data dari API, dan apa pun yang diteruskan dengan jelas bahwa pengguna berpotensi memanipulasi. Selalu gunakan pendekatan daftar yang diizinkan, yang berarti Anda hanya menerima input "baik yang diketahui", alih-alih daftar blokir (di mana Anda secara khusus mencari input buruk) karena tidak mungkin untuk memikirkan daftar lengkap input yang berpotensi berbahaya. Lakukan pekerjaan ini di server, bukan sisi klien (atau selain sisi klien), untuk memastikan bahwa pertahanan Anda tidak dapat dialihkan. Perlakukan SEMUA data sebagai tidak tepercaya, dan Anda akan melindungi diri Anda dari sebagian besar kerentanan aplikasi web umum.

Jika Anda menggunakan ASP.NET, kerangka kerja memberikan dukungan besar untuk memvalidasi input di sisi klien dan server.

Jika Anda menggunakan kerangka kerja web lain, ada beberapa teknik hebat untuk melakukan validasi input yang tersedia pada Cheatsheet Validasi Input OWASP.

Selalu gunakan kueri berparameter

Database SQL umumnya digunakan untuk menyimpan data; misalnya, aplikasi Anda dapat menyimpan informasi profil pengguna dalam database. Anda tidak boleh membuat SQL sebaris atau kueri database lainnya dalam kode Anda menggunakan input pengguna mentah dan mengirimkannya langsung ke database; perilaku ini adalah resep untuk bencana, seperti yang kita lihat sebelumnya.

Misalnya, jangan buat kode seperti contoh SQL sebaris berikut:

string userName = Request.QueryString["username"]; // receive input from the user BEWARE!
...
string query = "SELECT *  FROM  [dbo].[users] WHERE userName = '" + userName + "'";

Di sini kita menggabungkan string teks bersama-sama untuk membuat kueri, mengambil input dari pengguna dan membuat kueri SQL dinamis untuk mencari pengguna. Sekali lagi, jika pengguna jahat menyadari bahwa kita melakukan ini, atau hanya mencoba gaya masukan yang berbeda untuk melihat apakah ada kerentanan, kita bisa-bisa mengalami bencana besar. Sebagai gantinya, gunakan pernyataan SQL berparameter atau prosedur tersimpan seperti ini:

-- Lookup a user
CREATE PROCEDURE sp_findUser
(
@UserName varchar(50)
)

SELECT *  FROM  [dbo].[users] WHERE userName = @UserName

Dengan metode ini, Anda dapat memanggil prosedur dari kode Anda dengan aman, meneruskannya userName string tanpa khawatir akan diperlakukan sebagai bagian dari pernyataan SQL.

Selalu enkodekan output Anda

Setiap output yang Anda tampilkan baik secara visual atau dalam dokumen harus selalu dienkodekan dan dengan konversi karakter. Ini dapat melindungi Anda jika ada sesuatu yang terlewatkan dalam pass sanitasi atau kode secara tidak sengaja menghasilkan sesuatu yang dapat digunakan dengan berbahaya. Prinsip desain ini akan memastikan bahwa semuanya ditampilkan sebagai output dan tidak ditafsirkan sebagai sesuatu yang harus dijalankan, yang merupakan teknik serangan umum lainnya yang disebut sebagai "Scripting Lintas Situs" (XSS).

Karena pencegahan XSS adalah persyaratan aplikasi yang umum, teknik keamanan ini adalah area lain di mana ASP.NET akan melakukan pekerjaan untuk Anda. Secara default, semua output sudah dienkodekan. Jika Anda menggunakan kerangka kerja web lain, Anda dapat memverifikasi opsi anda untuk pengodean output di situs web dengan OWASP XSS Prevention Cheatsheet.

Ringkasan

Membersihkan dan memvalidasi input Anda adalah persyaratan yang diperlukan untuk memastikan input Anda valid dan aman untuk digunakan dan disimpan. Sebagian besar kerangka kerja web modern menawarkan fitur bawaan yang dapat mengotomatiskan beberapa pekerjaan ini. Anda dapat memeriksa dokumentasi kerangka kerja pilihan Anda dan melihat fitur apa yang ditawarkannya. Meskipun aplikasi web adalah tempat paling umum di mana hal ini terjadi, perlu diingat bahwa jenis aplikasi lain juga bisa sama rentannya. Jangan berpikir Anda aman hanya karena aplikasi baru Anda adalah aplikasi desktop. Anda masih harus menangani input pengguna dengan benar untuk memastikan seseorang tidak menggunakan aplikasi Anda untuk merusak data Anda atau merusak reputasi perusahaan Anda.

Uji pengetahuan Anda

1.

Manakah dari sumber data berikut yang perlu divalidasi?

2.

Kueri berparameter (prosedur tersimpan dalam SQL) adalah cara aman untuk berbicara dengan database karena:

3.

Manakah dari data berikut yang perlu dienkodekan outputnya?