Posting silang ini sebagai referensi gabungan dari beta Dokumentasi SO yang sedang offline.
Masalah
Skrip lintas situs adalah eksekusi kode jarak jauh yang tidak disengaja oleh klien web. Aplikasi web apa pun dapat membuka dirinya ke XSS jika mengambil input dari pengguna dan mengeluarkannya langsung di halaman web. Jika input menyertakan HTML atau JavaScript, kode jarak jauh dapat dijalankan ketika konten ini diberikan oleh klien web.
Misalnya, jika pihak ke-3 berisi file JavaScript:
// http://example.com/runme.js
document.write("I'm running");
Dan aplikasi PHP langsung mengeluarkan string yang dilewatkan ke dalamnya:
<?php
echo '<div>' . $_GET['input'] . '</div>';
Jika parameter GET yang tidak dicentang mengandung <script src="http://example.com/runme.js"></script>
maka output dari skrip PHP adalah:
<div><script src="http://example.com/runme.js"></script></div>
JavaScript pihak ke-3 akan berjalan dan pengguna akan melihat "Saya sedang menjalankan" di halaman web.
Larutan
Sebagai aturan umum, jangan pernah percaya input yang datang dari klien. Setiap nilai GET, POST, dan cookie dapat berupa apa saja, dan karenanya harus divalidasi. Saat mengeluarkan salah satu dari nilai-nilai ini, lepas dari nilai-nilai ini sehingga tidak akan dievaluasi secara tak terduga.
Perlu diingat bahwa bahkan dalam aplikasi yang paling sederhana pun data dapat dipindahkan dan akan sulit untuk melacak semua sumber. Karena itu merupakan praktik terbaik untuk selalu keluar dari hasil.
PHP menyediakan beberapa cara untuk menghindari output tergantung pada konteksnya.
Fungsi Filter
Fungsi Filter PHP memungkinkan input data ke skrip php untuk disanitasi atau divalidasi dalam banyak cara . Mereka berguna saat menyimpan atau mengeluarkan input klien.
Pengkodean HTML
htmlspecialchars
akan mengonversi "karakter khusus HTML" apa pun ke penyandian HTML mereka, yang berarti mereka tidak akan diproses sebagai HTML standar. Untuk memperbaiki contoh kami sebelumnya menggunakan metode ini:
<?php
echo '<div>' . htmlspecialchars($_GET['input']) . '</div>';
// or
echo '<div>' . filter_input(INPUT_GET, 'input', FILTER_SANITIZE_SPECIAL_CHARS) . '</div>';
Akan menghasilkan:
<div><script src="http://example.com/runme.js"></script></div>
Segala sesuatu di dalam <div>
tag tidak akan diartikan sebagai tag JavaScript oleh browser, tetapi sebagai simpul teks sederhana. Pengguna akan melihat:
<script src="http://example.com/runme.js"></script>
Pengkodean URL
Saat mengeluarkan URL yang dihasilkan secara dinamis, PHP menyediakan urlencode
fungsi untuk menghasilkan URL yang valid dengan aman. Jadi, misalnya, jika pengguna dapat memasukkan data yang menjadi bagian dari parameter GET lain:
<?php
$input = urlencode($_GET['input']);
// or
$input = filter_input(INPUT_GET, 'input', FILTER_SANITIZE_URL);
echo '<a href="http://example.com/page?input="' . $input . '">Link</a>';
Setiap input jahat akan dikonversi ke parameter URL yang disandikan.
Menggunakan perpustakaan eksternal khusus atau daftar AntiSamy OWASP
Terkadang Anda ingin mengirim HTML atau input kode jenis lain. Anda perlu mempertahankan daftar kata yang diotorisasi (daftar putih) dan tidak resmi (daftar hitam).
Anda dapat mengunduh daftar standar yang tersedia di situs web OWASP AntiSamy . Setiap daftar cocok untuk jenis interaksi tertentu (ebay api, tinyMCE, dll ...). Dan itu open source.
Ada perpustakaan yang ada untuk menyaring HTML dan mencegah serangan XSS untuk kasus umum dan melakukan setidaknya serta daftar AntiSamy dengan penggunaan yang sangat mudah. Misalnya Anda memiliki Pemurni HTML