Rumah >pembangunan bahagian belakang >tutorial php >Serangan skrip lintas tapak (XSS)

Serangan skrip lintas tapak (XSS)

William Shakespeare
William Shakespeareasal
2025-02-27 09:12:10521semak imbas

Cross-Site Scripting Attacks (XSS)

mata utama

    Serangan skrip lintas tapak (XSS) adalah serangan suntikan kod biasa yang berlaku disebabkan oleh pengesahan data pengguna yang tidak betul (biasanya memasukkan atau memanipulasi hiperpautan melalui bentuk web). Ini mungkin membenarkan kod klien yang berbahaya disimpan di pelayan atau dilaksanakan dalam penyemak imbas pengguna.
  • serangan XSS boleh dibahagikan kepada dua jenis: XSS yang tidak berterusan (kod jahat diluluskan melalui pelayan dan dibentangkan kepada mangsa) dan XSS yang berterusan (kod memintas kod yang berbahaya dan disimpan di kedai data laman web dan dilaksanakan apabila maklumat dipaparkan di laman web).
  • Mencegah serangan XSS memerlukan tidak mempercayai data dari pengguna atau sumber pihak ketiga, mengesahkan semua data di input, dan melarikan diri apabila output. Ini termasuk melaksanakan pengesahan data, pembersihan data dan langkah -langkah melarikan diri.
  • Walaupun banyak rangka kerja PHP menyediakan langkah-langkah keselamatan terbina dalam, adalah penting untuk terus menguji kod pengesahan dengan vektor ujian XSS terkini untuk memastikan bahawa kod tersebut tetap tidak terjejas oleh serangan XSS.
Serangan skrip lintas tapak adalah salah satu daripada lima serangan keselamatan utama yang berlaku setiap hari di Internet, dan skrip PHP anda mungkin tidak dapat diselamatkan. Serangan ini, juga dikenali sebagai XSS, pada dasarnya adalah serangan suntikan kod yang mungkin disebabkan oleh pengesahan data pengguna yang salah, yang biasanya dimasukkan ke dalam halaman melalui borang web atau menggunakan hiperpautan yang berubah. Kod yang disuntik boleh menjadi kod pelanggan yang berniat jahat, seperti JavaScript, VBScript, HTML, CSS, Flash, dll. Kod ini digunakan untuk menyimpan data berbahaya pada pelayan atau melakukan tindakan berniat jahat dalam penyemak imbas pengguna. Malangnya, serangan skrip lintas tapak berlaku terutamanya kerana pemaju gagal menyediakan kod selamat. Ia adalah tanggungjawab untuk setiap pengaturcara PHP untuk memahami bagaimana untuk menyerang skrip PHP mereka untuk mengeksploitasi kelemahan keselamatan yang mungkin. Baca artikel ini dan anda akan mengetahui lebih lanjut mengenai serangan skrip lintas tapak dan bagaimana untuk menghalangnya dalam kod anda.

Belajar melalui contoh

Mari lihat coretan kod berikut.

<code class="language-php"><form action="post.php" method="post">
  <input type="text" name="comment" value="">
  <input type="submit" name="submit" value="Submit">
</form></code>
di sini kita mempunyai borang mudah dengan kotak teks untuk kemasukan data dan butang hantar. Selepas mengemukakan borang, ia menyerahkan data ke post.php untuk diproses. Anggapkan Post.php hanya mengeluarkan data, seperti yang ditunjukkan di bawah:

<code class="language-php"><?php echo $_POST["comment"]; ?></code>
Tanpa penapisan, penggodam boleh menyerahkan perkara berikut melalui borang, yang akan menghasilkan pop timbul dalam penyemak imbas dengan mesej "Hacked".

<code class="language-javascript">alert("hacked")</code>
Contoh ini, walaupun bersifat berniat jahat, nampaknya tidak menimbulkan kemudaratan. Tetapi fikirkan tentang apa yang berlaku jika kod JavaScript ditulis untuk mencuri kuki pengguna dan mengeluarkan maklumat sensitif daripadanya? Terdapat serangan XSS yang lebih teruk daripada panggilan mudah () panggilan.

Serangan skrip lintas tapak boleh dibahagikan kepada dua kategori berdasarkan bagaimana mereka menyampaikan muatan yang berniat jahat: XSS yang tidak berterusan dan XSS yang berterusan. Tolong izinkan saya membincangkan setiap jenis secara terperinci.

XSS

yang tidak berterusan

Juga dikenali sebagai serangan XSS reflektif, ini bermakna bahawa kod berniat jahat sebenarnya tidak disimpan di pelayan, tetapi diteruskan dan disampaikan kepada mangsa, yang merupakan strategi XSS yang lebih popular di antara kedua -dua kaedah penyampaian. Serangan dimulakan dari sumber luaran, seperti e-mel atau laman web pihak ketiga. Berikut adalah sebahagian daripada skrip hasil carian yang mudah:

<code class="language-php"><form action="post.php" method="post">
  <input type="text" name="comment" value="">
  <input type="submit" name="submit" value="Submit">
</form></code>

Contoh ini mungkin halaman hasil yang sangat tidak selamat di mana pertanyaan carian akan dipaparkan kembali kepada pengguna. Masalahnya di sini ialah pembolehubah $_GET["query"] tidak disahkan atau melarikan diri, jadi penyerang boleh menghantar pautan berikut kepada mangsa:

<code class="language-php"><?php echo $_POST["comment"]; ?></code>

tiada pengesahan diperlukan, halaman akan mengandungi:

<code class="language-javascript">alert("hacked")</code>

Permanen XSS

Jenis serangan ini berlaku apabila kod berniat jahat telah meluluskan proses pengesahan dan disimpan di kedai data. Ini boleh menjadi komen, fail log, mesej pemberitahuan, atau mana -mana bahagian laman web yang memerlukan input pengguna. Kemudian, apabila maklumat khusus ini dipaparkan di laman web, kod jahat dilaksanakan. Mari kita gunakan contoh berikut untuk membuat sistem komen berasaskan fail asas. Dengan mengandaikan bentuk yang sama yang saya diperkenalkan sebelum ini, dengan mengandaikan skrip penerima hanya memasukkan komen ke fail data.

<code class="language-php"><?php // 根据查询获取搜索结果
echo "You searched for: " . $_GET["query"];

// 列出搜索结果
...</code>

tempat lain, kandungan komen.txt dipaparkan kepada pelawat:

<code>http://example.com/search.php?query=alert("hacked")</code>

Apabila pengguna mengemukakan komen, ia disimpan ke fail data. Keseluruhan fail (dan oleh itu keseluruhan siri komen) akan dipaparkan kepada pembaca. Jika kod berniat jahat dikemukakan, ia akan disimpan dan dipaparkan seperti tanpa sebarang pengesahan atau melarikan diri.

Mencegah serangan skrip lintas tapak

bernasib baik, semudah serangan XSS di tapak yang tidak dilindungi, dan ia semudah menghalang mereka. Walau bagaimanapun, pencegahan mesti sentiasa diingat walaupun sebelum menulis baris kod. Peraturan pertama bahawa mana-mana persekitaran web (sama ada pembangunan, pementasan atau pengeluaran) perlu "dikuatkuasakan" adalah untuk tidak mempercayai data daripada pengguna atau mana-mana sumber pihak ketiga yang lain. Ini tidak boleh ditekankan terlalu banyak. Setiap bit input data mesti disahkan dan melarikan diri pada output. Ini adalah peraturan keemasan untuk mencegah XSS. Untuk melaksanakan langkah -langkah keselamatan yang boleh dipercayai untuk mencegah serangan XSS, kita harus memberi perhatian kepada pengesahan data, pembersihan data, dan output melarikan diri.

Pengesahan data

Pengesahan data adalah proses memastikan aplikasi berjalan dengan data yang betul. Jika skrip PHP anda mengharapkan pengguna memasukkan integer, sebarang jenis data lain akan dibuang. Setiap sekeping data pengguna yang diterima mesti disahkan untuk memastikan jenisnya betul dan dibuang jika ia gagal proses pengesahan. Sebagai contoh, jika anda ingin mengesahkan nombor telefon, anda akan membuang mana -mana rentetan yang mengandungi huruf, kerana nombor telefon hanya mengandungi nombor. Anda juga harus mempertimbangkan panjang rentetan. Jika anda ingin menjadi sedikit longgar, anda boleh membenarkan set aksara khas yang terhad, seperti tanda, tanda kurung, dan sengkang, yang sering digunakan untuk memformat nombor telefon khusus untuk lokasi sasaran anda.

<code class="language-php"><form action="post.php" method="post">
  <input type="text" name="comment" value="">
  <input type="submit" name="submit" value="Submit">
</form></code>

Pembersihan data

Pembersihan data memberi tumpuan kepada memanipulasi data untuk memastikan ia selamat dengan mengeluarkan sebarang bit yang tidak diingini dari data dan menormalkannya ke dalam bentuk yang betul. Sebagai contoh, jika anda mengharapkan rentetan teks biasa sebagai input pengguna, anda mungkin mahu mengeluarkan sebarang tag HTML daripadanya.

<code class="language-php"><?php echo $_POST["comment"]; ?></code>

Kadang -kadang, pengesahan data dan pembersihan/normalisasi boleh dilakukan secara serentak.

<code class="language-javascript">alert("hacked")</code>

Output Escape

Untuk melindungi integriti data paparan/output, anda harus melarikan diri dari data apabila ia dibentangkan kepada pengguna. Ini menghalang penyemak imbas daripada menggunakan sebarang makna yang tidak dijangka kepada mana -mana urutan watak khas yang boleh dijumpai.

<code class="language-php"><?php // 根据查询获取搜索结果
echo "You searched for: " . $_GET["query"];

// 列出搜索结果
...</code>

bersama sekarang!

Untuk lebih memahami tiga aspek pemprosesan data, mari kita lihat sistem komen berasaskan fail sebelumnya sekali lagi dan ubah suai untuk memastikan keselamatannya. Kerentanan yang berpotensi dalam kod berpunca dari fakta bahawa $_POST["comment"] secara membuta tuli dilampirkan pada fail komen.txt dan kemudian dipaparkan terus kepada pengguna. Untuk memastikan ia selamat, nilai $_POST["comment"] hendaklah disahkan dan dibersihkan sebelum menambahkannya ke fail, dan ia harus dilepaskan apabila kandungan fail dipaparkan kepada pengguna.

<code>http://example.com/search.php?query=alert("hacked")</code>

Skrip pertama mengesahkan komen masuk untuk memastikan pengguna telah menyediakan rentetan bukan sifar. Lagipun, komen kosong tidak begitu menarik. Pengesahan data perlu dilakukan dalam konteks yang jelas, yang bermaksud bahawa jika saya mengharapkan untuk mendapatkan integer dari pengguna, maka saya mengesahkannya dengan sewajarnya dengan menukar data ke dalam integer dan memprosesnya sebagai integer. Sekiranya ini menghasilkan data yang tidak sah, hanya buangnya dan biarkan pengguna tahu. Skrip kemudian membersihkan komen dengan mengeluarkan sebarang tag HTML yang boleh dimasukkan. Akhirnya, dapatkan, menapis, dan memaparkan komen. Biasanya, fungsi cukup untuk menapis output yang dimaksudkan untuk dilihat dalam penyemak imbas. Walau bagaimanapun, jika pengekodan watak yang anda gunakan dalam laman web bukan ISO-8859-1 atau UTF-8, anda mungkin perlu menggunakan htmlspecialchars(). Untuk maklumat lanjut mengenai kedua -dua fungsi ini, baca deskripsi masing -masing dalam dokumentasi PHP rasmi. Ingat bahawa tidak ada penyelesaian tunggal yang 100% selamat pada medium yang berkembang seperti web. Secara menyeluruh menguji kod pengesahan anda dengan vektor ujian XSS terkini. Menggunakan data ujian dari sumber berikut harus mendedahkan sama ada kod anda masih terdedah kepada serangan XSS. htmlentities()

    RSNake XSS CheatSheet (senarai vektor XSS yang cukup komprehensif yang boleh anda gunakan untuk menguji kod anda)
  • data ujian XSS Zend Framework
  • cheatsheet XSS (menggunakan ciri HTML5)

Ringkasan

Harap artikel ini menerangkan dengan baik apa serangan skrip lintas tapak dan bagaimana untuk menghalang mereka daripada berlaku dalam kod anda. Jangan sekali-kali mempercayai data dari pengguna atau mana-mana sumber pihak ketiga yang lain. Anda boleh melindungi diri anda dengan mengesahkan nilai masuk dalam konteks yang jelas, membersihkan data untuk melindungi kod anda, dan melepaskan output untuk melindungi pengguna anda. Selepas menulis kod, pastikan anda berfungsi dengan betul dengan menguji kod tersebut dengan teliti.

(gambar dari inge schepers / shutterstock)

Jika anda suka siaran ini, anda akan suka belajar; Ahli-ahli dengan serta-merta boleh mengakses semua e-buku SitePoint dan kursus dalam talian interaktif, seperti Jump Start PHP.

Komen dalam artikel ini telah ditutup. Ada soalan mengenai PHP? Mengapa tidak mengemukakan soalan di forum kami?

FAQs (FAQ) Mengenai PHP Keselamatan dan Serangan Skrip Laluan (XSS)

Apakah kesan serangan skrip lintas tapak (XSS) terhadap aplikasi PHP?

Serangan skrip lintas tapak (XSS) boleh memberi kesan yang signifikan terhadap aplikasi PHP. Mereka boleh membawa kepada kecurian data, rampasan sesi, rasuah laman web, dan juga pengedaran kod berniat jahat kepada pengguna. Serangan XSS mengeksploitasi kelemahan dalam aplikasi web untuk menyuntik skrip berniat jahat dan kemudian melaksanakannya dengan penyemak imbas pengguna. Ini boleh menjejaskan interaksi pengguna dengan aplikasi dan boleh mendedahkan maklumat sensitif.

Bagaimana mengenal pasti kelemahan XSS yang berpotensi dalam aplikasi PHP saya?

Mengenal pasti kelemahan XSS yang berpotensi dalam aplikasi PHP memerlukan gabungan kajian semula kod manual dan ujian automatik. Cari kawasan dalam kod di mana input pengguna dimasukkan secara langsung dalam output tanpa pembersihan atau pengesahan yang betul. Alat automasi seperti pengimbas XSS juga boleh membantu mengenal pasti kelemahan yang berpotensi dengan menguji pelbagai vektor serangan XSS.

Apakah beberapa kaedah biasa yang digunakan dalam serangan XSS?

serangan XSS biasanya melibatkan suntikan skrip berniat jahat ke laman web yang dilihat oleh pengguna lain. Ini boleh dilakukan dalam pelbagai cara, seperti menanam skrip ke dalam parameter URL, membentuk input, dan juga cookies. Skrip jahat kemudian boleh melakukan tindakan bagi pihak pengguna, seperti mencuri cookies sesi mereka atau memanipulasi kandungan laman web.

Bagaimana untuk mencegah serangan XSS dalam aplikasi PHP saya?

Mencegah serangan XSS dalam aplikasi PHP melibatkan pengesahan dan pembersihan input pengguna, output yang dikodkan, dan menggunakan tajuk HTTP yang sesuai. Sentiasa merawat input pengguna sebagai tidak dipercayai dan mengesahkannya terhadap senarai nilai yang boleh diterima. Bersihkan input untuk mengeluarkan sebarang aksara atau kod yang mungkin berbahaya. Output dikodkan untuk memastikan bahawa mana -mana aksara yang mungkin berbahaya menjadi tidak berbahaya. Gunakan tajuk HTTP seperti dasar keselamatan kandungan untuk mengehadkan sumber skrip dan sumber lain.

Apakah peranan yang dimainkan oleh dasar keselamatan kandungan dalam mencegah serangan XSS?

Dasar Keselamatan Kandungan (CSP) HEADER HTTP memainkan peranan penting dalam mencegah serangan XSS. Ia membolehkan anda menentukan domain bahawa penyemak imbas harus dipertimbangkan sebagai sumber skrip yang boleh dilaksanakan. Ini bermakna bahawa walaupun penyerang boleh menyuntik skrip ke laman web anda, penyemak imbas tidak akan menjalankannya kecuali sumber skrip disenaraikan dalam CSP anda.

Apakah perbezaan antara serangan XSS penyimpanan dan serangan XSS reflektif?

Penyimpanan serangan XSS melibatkan suntikan skrip berniat jahat yang disimpan secara kekal pada pelayan sasaran. Kemudian, apabila pengguna melihat halaman tertentu, skrip diberikan kepada pengguna. Serangan XSS reflektif, sebaliknya, melibatkan menyuntik skrip melalui URL atau input bentuk, yang pelayan segera kembali dalam respons dan dilaksanakan oleh penyemak imbas pengguna.

Bagaimana menggunakan fungsi terbina dalam PHP untuk mencegah serangan XSS?

PHP menyediakan beberapa fungsi terbina dalam yang dapat membantu mencegah serangan XSS. Sebagai contoh, fungsi htmlspecialchars() boleh digunakan untuk menyandikan aksara khas dalam input pengguna, membuat skrip berpotensi tidak berbahaya. filter_input() Fungsi boleh digunakan untuk membersihkan input pengguna, memadam atau mengodkan aksara yang berbahaya.

Apakah peranan yang dimainkan oleh cookies httponly dalam mencegah serangan XSS?

Httponly Cookie adalah cookie yang tidak dapat diakses melalui skrip klien. Ini bermakna bahawa walaupun penyerang boleh menyuntik skrip ke laman web anda, mereka tidak boleh menggunakan skrip untuk membaca atau mengubah suai cookies httponly. Ini dapat membantu melindungi maklumat sensitif (seperti pengecam sesi) daripada dicuri oleh serangan XSS.

Bolehkah serangan XSS digunakan untuk memintas perlindungan CSRF?

Ya, serangan XSS boleh digunakan untuk memintas perlindungan pemalsuan permintaan lintas tapak (CSRF). Jika penyerang boleh menyuntik skrip ke laman web anda, mereka boleh menggunakannya untuk melakukan tindakan bagi pihak pengguna, yang berpotensi memintas sebarang perlindungan CSRF yang telah anda laksanakan. Inilah sebabnya penting untuk melindungi terhadap serangan XSS dan CSRF.

Kerangka PHP apa yang memberikan perlindungan terbina dalam serangan XSS?

Ya, banyak kerangka PHP menyediakan perlindungan terbina dalam terhadap serangan XSS. Sebagai contoh, Laravel secara automatik menyandikan output untuk mencegah serangan XSS. Rangka kerja lain seperti Symfony dan CodeIgniter juga menyediakan fungsi untuk membersihkan input pengguna dan output yang dikodkan. Walau bagaimanapun, perlu diingat bahawa tiada rangka kerja dapat memberikan perlindungan lengkap dan anda masih harus mengikuti amalan terbaik untuk mencegah serangan XSS.

Atas ialah kandungan terperinci Serangan skrip lintas tapak (XSS). Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn