Itu selalu merupakan ide yang baik untuk memeriksa apakah sebuah string atau url valid atau tidak sebelum mencoba membuat permintaan. Permintaan akan tetap gagal tetapi jika kami mengujinya sebelum itu, kami selalu dapat menghindari kegagalan itu
Dengan python, kita dapat dengan mudah mengetahui apakah sebuah url valid atau tidak. Dalam posting ini, saya akan menunjukkan kepada Anda bagaimana melakukannya dengan contoh
modul validator
validator adalah modul python yang menyediakan berbagai jenis metode validasi. Dengan menggunakan modul ini, kita dapat memvalidasi berbagai jenis input dengan Python
Untuk memvalidasi url, kita bisa menggunakan metode url. Metode ini didefinisikan sebagai berikut
def url(value, public=False)
Dibutuhkan url sebagai nilai. Jika url valid, ia mengembalikan True, selain itu akan membuang satu ValidationFailure. public disetel ke True untuk alamat IP publik
Di bagian ini, tugasnya adalah menemukan apakah string berisi URL dan jika kondisinya benar, URL dikembalikan
import re def ck_url(x): # Regular expression for url re_equ = r"(?i)\b((?:https?://|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:'\".,<>?«»“”‘’]))" ck_url = re.findall(re_euq, x) if ck_url: return "The url in the string is : ",[i[0] for i in ck_url] else: return "No URL present!" ip_str = input("Enter the string : ") print(ck_url(ip_str))_Keluaran 1
Keluaran 2
Penjelasan
Dalam kode python di atas, untuk memeriksa URL dalam string kami telah membuat ekspresi reguler untuk URL dan dengan menggunakan fungsi built-in findall() kami memeriksa pola URL dalam string input. Fungsi findall() memindai string dari kiri ke kanan dan nilainya dikembalikan
Segala sesuatu di internet memiliki Uniform Resource Locator (URL) yang mengidentifikasinya secara unik — memungkinkan pengguna Internet untuk mendapatkan akses ke file dan media lain. Misalnya, artikel ini memiliki URL unik yang membantu perayap pengoptimalan mesin telusur (SEO) mengindeksnya untuk ditemukan pengguna.
Definisi pertama dari sintaks URL ada di 1994 Request for Comments (RFC) 1738. Sejak saat itu, struktur URL telah mengalami banyak revisi untuk meningkatkan keamanannya. Namun, pengembang sering gagal menggunakan definisi RFC sebagaimana dimaksud, berkontribusi terhadap banyak serangan berbahaya
Contoh terbaru adalah exploit RCE 0-day yang ditemukan di Log4j, paket logging Java yang populer. Serangan ini terjadi ketika Java Naming and Directory Interface (JNDI) mengevaluasi string log berbahaya. JNDI adalah API Java untuk layanan direktori yang memungkinkan klien perangkat lunak Java menemukan dan mencari data dan sumber daya (dalam bentuk objek Java) menggunakan nama. Saat mengevaluasi string log berbahaya, ia terhubung ke server jarak jauh dan mengeksekusi kode Java berbahaya. Oleh karena itu, perusahaan harus terus memvalidasi URL yang disediakan oleh agen eksternal, seperti pelanggan, mitra, dan sebagainya
Contoh lain adalah serangan pemalsuan permintaan sisi server yang dapat membahayakan program server saat mengakses URL yang tidak aman. Pengguna jahat dapat memanfaatkan bidang masukan yang disediakan untuk menyebabkan kerusakan pada solusi web kami — dan lebih buruk lagi, citra publik organisasi kami
Dalam artikel ini, kami akan menjelajahi tantangan URL yang rusak, bagaimana URL tersebut dapat merusak aplikasi Anda, dan cara untuk mengatasi masalah tersebut. Untuk mengikuti, pastikan Anda telah menginstal dan mengatur Python di mesin Anda.
Risiko keamanan dengan URL
URL bisa berisiko, karena dapat mengarahkan pengguna dari halaman web yang sah ke halaman yang berbahaya. Mereka juga dapat membuka beberapa vektor serangan — termasuk cross-site scripting (XSS), kerentanan keamanan di beberapa aplikasi web. Kerentanan XSS memungkinkan penyerang menyuntikkan skrip sisi klien ke halaman web yang dilihat oleh pengguna lain
Risiko keamanan ini dapat menimbulkan konsekuensi serius di industri tertentu, seperti perbankan. Pelanggan yang tidak mengetahuinya dapat membuka halaman yang tampak asli yang dikendalikan oleh penyerang karena mereka yakin itu adalah halaman login untuk aplikasi perbankan mereka. Ini adalah jenis serangan phishing, dibangun di atas rekayasa sosial, di mana penyerang mengirimkan pesan penipuan, palsu, atau menipu yang dirancang untuk mengelabui seseorang agar mengungkapkan informasi sensitif kepada penyerang. Mereka juga dapat menyebarkan perangkat lunak berbahaya di infrastruktur korban, termasuk ransomware. Jika penyerang menangkap nama pengguna dan kata sandi pengguna perbankan, penyerang dapat menggunakan informasi ini untuk masuk ke rekening bank pengguna dan menyebabkan kerusakan
Serangan yang lebih canggih dengan URL dapat terjadi karena pemalsuan permintaan sisi server. Serangan ini terjadi di server yang mengirimkan permintaan ke URL yang disediakan oleh pelanggan. Saat membuat permintaan, penyerang dapat mengambil alih server untuk melakukan tindakan yang tidak diperbolehkan, seperti memindai port dan informasi jaringan, meminta metadata infrastruktur, mencetak, dan mengeluarkan informasi sensitif seperti kata sandi atau token
Bagian berikut menunjukkan cara memvalidasi dan membersihkan URL yang tidak Anda kontrol. Misalnya, jika kami membangun platform sosial tempat pengguna dapat berkomunikasi dan berbagi data, kami dapat mengontrol URL mana yang diizinkan dan mana yang dapat kami sembunyikan
Cara melakukan validasi URL dengan Python
Python, bahasa pemrograman, banyak digunakan untuk membangun aplikasi web dan situs untuk jutaan pelanggan di seluruh dunia. Meskipun Python tidak memiliki pemindai dan validator URL bawaan, parser dan validator URL berbasis komunitas tersedia untuk Python — yang dapat digunakan untuk memvalidasi URL kita dan membuatnya lebih aman. Beberapa kerangka kerja aplikasi web juga menyediakan pemindai dan validator URL untuk mengembangkan aplikasi web
Memvalidasi URL
Salah satu metode validasi URL yang populer di Python adalah paket validator Python. Kita dapat menggunakan paket validator untuk menentukan apakah suatu URL valid. Agar valid, URL harus
- Terbentuk dengan baik, artinya mengikuti semua aturan spesifikasi HTTP atau HTTPS
- Miliki sumber daya di alamat tersebut, karena URL tidak valid tanpa sumber daya terkait
Paket validator Python memaparkan metode URL yang memverifikasi URL, dan menguji apakah itu aman, dan mencari kata kunci dan karakter yang tidak valid. Jika URL tersedia di domain publik (artinya tidak berada di belakang firewall, paywall, atau penghalang lain untuk mengakses), itu akan melewati alamat IP internal mana pun
Untuk menggunakan paket validator, unduh dan atur ketergantungan pada lingkungan Python lokal Anda menggunakan pip. Untuk mengunduh paket validator, jalankan kode berikut di terminal lokal atau antarmuka baris perintah Anda
$ python3 -m pip install validatorsSetelah perintah ini selesai, kami akan memiliki paket validator di mesin kami
Selanjutnya, buat file Python bernama main.py, dan tulis kode Python untuk menguji URL
import validators validation = validators.url("/www.google.com") if validation: print("URL is valid") else: print("URL is invalid")Setelah memasukkan kode ini ke dalam file main.py_, jalankan kode dalam juru bahasa Python menggunakan antarmuka baris perintah Python
$ python main.py_Kode mencetak "URL is invalid" karena ada import validators validation = validators.url("/www.google.com") if validation: print("URL is valid") else: print("URL is invalid")0 karakter yang hilang di URL setelah import validators validation = validators.url("/www.google.com") if validation: print("URL is valid") else: print("URL is invalid")1
Paket juga dapat menentukan apakah URL dapat diakses publik, yang berguna saat mencoba memvalidasi apakah pengguna mencoba meminta alamat IP internal. Tambahkan kode berikut dalam file Python yang sama dan jalankan untuk mencoba dan memvalidasi URL
validation = validators.url("//10.0.0.1", public=True) if validation: print("URL is valid") else: print("URL is invalid")Sekali lagi, output menyatakan bahwa URL tidak valid. Ini karena URL tidak tersedia di domain publik — meskipun faktanya tidak ada masalah dengan URL itu sendiri. Untuk mempelajari lebih lanjut tentang fitur paket validator, lihat dokumentasinya
Parsing menggunakan ekspresi reguler
Pendekatan lain yang dapat kita gunakan untuk memvalidasi URL adalah menggunakan ekspresi reguler. Kami dapat, misalnya, menggunakan ekspresi reguler untuk meminta URL menyertakan HTTPS sebelum dapat divalidasi. Kode untuk menyelesaikan validasi ini terlihat seperti ini
^\/\/[0-9A-z.]+.[0-9A-z.]+.[a-z]+$_Ekspresi reguler ini cocok dengan istilah import validators validation = validators.url("/www.google.com") if validation: print("URL is valid") else: print("URL is invalid")_2, tetapi tidak import validators validation = validators.url("/www.google.com") if validation: print("URL is valid") else: print("URL is invalid")3, meskipun keduanya merupakan URL yang valid. Anda dapat mempelajari lebih lanjut tentang ekspresi reguler di situs web ini. Kita bisa mencoba ekspresi di atas dalam kode Python
import re pattern = "^\/\/[0-9A-z.]+.[0-9A-z.]+.[a-z]+$" result = re.match(pattern, "//www.google.com") if result: print(result) else: print("Invalid URL")Keluaran untuk kode di atas adalah URL yang cocok. Jika Anda mengubah string URL di atas dan menghapus HTTPS atau menjadikannya HTTP, Anda mendapatkan objek import validators validation = validators.url("/www.google.com") if validation: print("URL is valid") else: print("URL is invalid")4 — menunjukkan tidak ada URL yang cocok
Namun, ekspresi reguler rumit dan tidak praktis untuk skenario dunia nyata. Ekspresi reguler sulit dibaca dan rumit untuk di-debug dan diskalakan. Inilah sebabnya perpustakaan umumnya merupakan solusi yang lebih baik
Untuk kasus penggunaan ekspresi reguler yang lebih lanjut yang mem-parsing URL dengan semua struktur dan sintaks yang sesuai, lihat utas Stack Overflow ini
Salah satu keuntungan menggunakan ekspresi reguler adalah Anda juga dapat menemukan URL yang tidak valid di dalam string input. Ini hanya mungkin dengan ekspresi reguler — dan bukan dengan perpustakaan umum. Paket validator tidak berfungsi, bahkan jika string berisi spasi putih di belakang atau sebelumnya. Untuk menggunakan paket dengan sebaik-baiknya, Anda harus membersihkan string input dan meneruskannya ke paket validator
Menggunakan urllib
Paket lain yang mem-parsing URL dan memperlihatkan bagian-bagian dari URL adalah urllib. Kita bisa menggunakannya dengan interpreter Python 3.
Kode berikut memverifikasi apakah URL valid
Ketika kami mengatur skema dan bidang import validators validation = validators.url("/www.google.com") if validation: print("URL is valid") else: print("URL is invalid")_5 untuk variabel import validators validation = validators.url("/www.google.com") if validation: print("URL is valid") else: print("URL is invalid")6, URL valid dan dapat digunakan. Jika tidak, URL tersebut tidak valid, dan kami harus berhati-hati
Mengidentifikasi kerentanan umum
Beberapa kerangka kerja di Python, seperti Django, menyediakan paket validator bawaan yang memungkinkan kami memvalidasi URL dalam kerangka itu. Namun, tantangan dengan mengandalkan pustaka ini adalah, meskipun kami terbiasa dengan kerangka kerja tersebut, kami masih harus memastikan bahwa paket itu sendiri aman. Dan open source hanya membuat mempercayai paket menjadi lebih kompleks
Kami dapat menggunakan alat keamanan seperti Snyk Advisor untuk meninjau dengan cepat semua paket sumber terbuka yang kami gunakan — dan paket baru yang ingin kami terapkan — untuk kerentanan umum. Dari ulasan ini, Snyk memberi kami laporan keamanan yang dapat kami gunakan untuk menentukan apakah paket tersebut harus disertakan atau tidak. Misalnya, kami dapat menggunakan Snyk Advisor untuk memastikan paket kami, seperti paket validator yang kami gunakan dalam demonstrasi di atas, aman.
Kami juga dapat menggunakan Sumber Terbuka Snyk bersama Penasihat Snyk untuk menemukan masalah lisensi, kerentanan, dan masalah terkait keamanan lainnya yang mungkin ada di tumpukan alat sumber terbuka kami. Dan, kita dapat berkonsultasi dengan Snyk Vulnerability Database (VulnDB) untuk mencari kerentanan terkait URL yang diketahui — seperti kerentanan ini dalam kerangka Flask, yang mengarahkan pengguna ke lokasi tanpa validasi URL. Dengan berkonsultasi dengan database ini, kami dapat mengamankan halaman web dan aplikasi kami secara proaktif
Memvalidasi URL dengan Python
Dalam artikel ini, kami menjelajahi tantangan yang ditimbulkan oleh URL yang tidak dibersihkan ke aplikasi web, dan cara membersihkan URL sesuai kebutuhan. Kami mulai dengan validasi dasar URL menggunakan paket validator dan urllib. Dan mendemonstrasikan cara menggunakan paket-paket ini untuk mengonfirmasi apakah semua URL bersifat publik, atau jika ada URL internal yang digunakan untuk menyerang aplikasi web. Kemudian, kami menggunakan ekspresi reguler primer untuk menunjukkan bagaimana kode satu baris sederhana dapat memindai URL untuk informasi dasar yang diperlukan, seperti semua URL menjadi HTTPS. Kami juga membahas mengapa ekspresi reguler merupakan cara yang rumit dan menantang untuk memvalidasi URL
Terakhir, kami membahas cara terbaik memilih pustaka sumber terbuka yang aman. Snyk Advisor menyediakan sumber kebenaran yang berharga saat menggunakan paket sumber terbuka. Untuk informasi selengkapnya, tinjau lembar contekan praktik terbaik keamanan Python untuk membantu menyiapkan continuous integration and continuous development pipeline (CI/CD) untuk meninjau setiap kerentanan yang ditambahkan ke kode Anda
Amankan perangkat lunak sumber terbuka Anda secara gratis
Buat akun Snyk hari ini untuk menemukan dan memperbaiki masalah lisensi, kerentanan, dan masalah terkait keamanan lainnya
Mendaftar gratis
Diskusikan blog ini di Discord
Bergabunglah dengan Komunitas DevSecOps di Discord untuk membahas topik ini dan lebih banyak lagi dengan praktisi lain yang berfokus pada keamanan