Saya memiliki drop down pada halaman web yang rusak ketika string nilai berisi kutipan.
Nilainya "asd
, tetapi dalam DOM selalu muncul sebagai string kosong.
Saya telah mencoba segala cara yang saya tahu untuk melarikan diri dari string dengan benar, tetapi tidak berhasil.
<option value=""asd">test</option>
<option value="\"asd">test</option>
<option value=""asd">test</option>
<option value=""asd">test</option>
Bagaimana cara membuat ini di halaman sehingga pesan postback berisi nilai yang benar?
htmlentities
.Jawaban:
"
adalah cara yang benar, yang ketiga dari tes Anda:Anda dapat melihat ini berfungsi di bawah, atau di jsFiddle .
Atau, Anda dapat membatasi nilai atribut dengan tanda kutip tunggal:
sumber
"
memetakan ke karakter yang sama dengan"
, tetapi tidak ada manfaat menggunakan opsi numerik di sini karena"
merupakan entitas bernama yang ditentukan."
juga lebih mudah diingat.&quot;a
(ganti&
dengan&
)Jika Anda menggunakan PHP, coba panggil
htmlentities
atauhtmlspecialchars
fungsi.sumber
<option value='<?php echo htmlentities("' onmouseover='alert(123);' foo='"); ?>' />
- pastikan Anda menggunakannya dengan ENT_QUOTES, ini aman:,<option value='<?php echo htmlentities("' onmouseover='alert(123);' foo='", ENT_QUOTES); ?>' />
tetapi selain ENT_QUOTES Anda juga harus menambahkan ENT_SUBSTITUTE dan ENT_DISALLOWED, secara pribadi saya telah menggunakan pembungkus ini selama bertahun-tahun:function hhb_tohtml(string $str):string { return htmlentities($str, ENT_QUOTES | ENT_HTML401 | ENT_SUBSTITUTE | ENT_DISALLOWED, 'UTF-8', true); }
Per sintaks HTML , dan bahkan HTML5 , berikut ini semua opsi yang valid:
Perhatikan bahwa jika Anda menggunakan sintaks XML , tanda kutip (tunggal atau ganda) diperlukan.
Berikut ini adalah jsfiddle yang menunjukkan semua pekerjaan di atas .
sumber
Pilihan lain adalah mengganti tanda kutip ganda dengan tanda kutip tunggal jika Anda tidak keberatan apa pun itu. Tapi saya tidak menyebutkan yang ini:
Saya menyebutkan yang ini:
Dalam kasus saya, saya menggunakan solusi ini.
sumber
Jika Anda menggunakan Javascript dan Lodash, maka Anda dapat menggunakan _.escape (), yang lolos ", ', <,>, dan &.
Lihat di sini: https://lodash.com/docs/#escape
sumber
Anda benar-benar hanya boleh mengizinkan data yang tidak dipercaya ke dalam daftar putih atribut yang baik seperti: align, alink, alt, bgcolor, border, cellpadding, cellspacing, kelas, warna, cols, colspan, coords, dir, wajah, tinggi, hspace, ismap, lang , marginheight, marginwidth, banyak, nohref, noresize, noshade, nowrap, ref, rel, rev, baris, rowspan, pengguliran, bentuk, rentang, ringkasan, tabindex, judul, usemap, valign, nilai, vlink, vspace, lebar
Anda benar-benar ingin menjaga data yang tidak dipercaya keluar dari penangan javascript serta atribut id atau nama (mereka dapat mengalahkan elemen lain di DOM).
Juga, jika Anda memasukkan data yang tidak tepercaya ke atribut SRC atau HREF, maka itu benar-benar URL yang tidak tepercaya sehingga Anda harus memvalidasi URL, pastikan BUKAN javascript: URL, dan kemudian entitas HTML menyandikan.
Detail lebih lanjut tentang semuanya ada di sini: https://www.owasp.org/index.php/Abridged_XSS_Prevention_Cheat_Sheet
sumber
Tidak ada cara untuk menghindari kutipan dalam nilai teks input ... tetapi Anda dapat menggunakan javascript (atau jquery):
sumber