ฉันจะหลีกเลี่ยงคำพูดอย่างถูกต้องภายในแอตทริบิวต์ HTML ได้อย่างไร


267

ฉันมีหล่นลงบนหน้าเว็บซึ่งจะแตกเมื่อสตริงค่ามีคำพูด

ค่าคือ"asdแต่ใน DOM จะปรากฏเป็นสตริงว่างเสมอ

ฉันได้พยายามทุกวิถีทางที่ฉันรู้ที่จะหลบหนีสายอย่างถูกต้อง แต่ไม่มีประโยชน์

<option value=""asd">test</option>
<option value="\"asd">test</option>
<option value="&quot;asd">test</option>
<option value="&#34;asd">test</option>

ฉันจะแสดงสิ่งนี้บนหน้าเว็บอย่างไรเพื่อให้ข้อความแจ้งเตือนหลังมีค่าที่ถูกต้อง


คุณสร้างหน้าได้อย่างไร
Slaks

1
ถ้าคุณใช้คำพูดเดียว? <option value = '"asd'> test </option>
Wim ten Brink

5
ฉันต้องชี้ให้เห็นไม่มีคำตอบเหล่านี้พูดถึงวิธีการที่จะหลบหนีสตริงอย่างถูกต้องสำหรับการใช้งานในคุณลักษณะ HTML
reconbot

4
@reconbot นั้นจะขึ้นอยู่กับการสร้าง HTML คำถามนั้นเกี่ยวกับคำพูดดังนั้นในทางเทคนิคแล้วคำตอบที่ได้รับการยอมรับตอบคำถามที่ถามมา เป็นวิธีการอย่างถูกต้องหลบหนีสตริงผมไม่ได้มีการเชื่อมโยงที่มีประโยชน์สำหรับกรณีทั่วไป แต่ใน PHP htmlentitiesคุณต้องการใช้
Matt Browne

คำตอบ:


343

&quot; เป็นวิธีที่ถูกต้องหนึ่งในสามของการทดสอบของคุณ:

<option value="&quot;asd">test</option>

คุณสามารถดูนี้ทำงานด้านล่างหรือบนjsFiddle

alert($("option")[0].value);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<select>
  <option value="&quot;asd">Test</option>
</select>

หรือคุณสามารถกำหนดค่าแอตทริบิวต์ด้วยเครื่องหมายคำพูดเดี่ยว:

<option value='"asd'>test</option>

17
ตัวเลือกที่สี่ของ OP & # 34 ;, เป็นวิธีที่ถูกต้องในการหลีกเลี่ยงคำพูด มีประโยชน์ในการใช้เอนทิตี html ที่เป็นตัวเลขเหนือเอนทิตีที่มีชื่อในเอนทิตีที่มีชื่อนั้นจะไม่ครอบคลุมอักขระทั้งหมดในขณะที่เอนทิตีที่เป็นตัวเลขทำ รายการ HTML4 เต็มรูปแบบที่w3.org/TR/html4/sgml/entities.html
atk

38
@ atk: ใช่&quot;แมปกับตัวละครเดียวกันกับ&#34;แต่ไม่มีประโยชน์ในการใช้ตัวเลือกตัวเลขที่นี่เพราะ&quot;เป็นนิติบุคคลที่มีชื่อที่กำหนดไว้ &quot;ยังง่ายต่อการจดจำ
Andy E

6
ฉันเห็นด้วย. ในกรณีนี้คุณสามารถใช้ & quot; ฉันตั้งใจจะชี้เฉพาะกรณีทั่วไปเท่านั้น
atk

4
@SIDU: เปลี่ยนเป็น&amp;quot;a(แทนที่&ด้วย&amp;)
Andy E

4
^ infinite loop
Omar Meky

16

หากคุณใช้ PHP ลองโทรhtmlentitiesหรือhtmlspecialcharsฟังก์ชั่น


2
แค่ใช้มันอาจจะไม่พอลอง<option value='<?php echo htmlentities("' onmouseover='alert(123);' foo='"); ?>' />- ให้แน่ใจว่าคุณใช้มันกับ ENT_QUOTES มันปลอดภัย: <option value='<?php echo htmlentities("' onmouseover='alert(123);' foo='", ENT_QUOTES); ?>' /> แต่นอกเหนือจาก ENT_QUOTES คุณควรเพิ่ม ENT_SUBSTITUTE และ ENT_DISALLOWED ส่วนตัวแล้วฉันใช้กระดาษห่อนี้มานานหลายปี:function hhb_tohtml(string $str):string { return htmlentities($str, ENT_QUOTES | ENT_HTML401 | ENT_SUBSTITUTE | ENT_DISALLOWED, 'UTF-8', true); }
hanshenrik

12

ตามไวยากรณ์ HTMLและHTML5ต่อไปนี้เป็นตัวเลือกที่ถูกต้องทั้งหมด:

<option value="&quot;asd">test</option>
<option value="&#34;asd">test</option>
<option value='"asd'>test</option>
<option value='&quot;asd'>test</option>
<option value='&#34;asd'>test</option>
<option value=&quot;asd>test</option>
<option value=&#34;asd>test</option>

โปรดทราบว่าหากคุณกำลังใช้ไวยากรณ์ XMLจำเป็นต้องใช้เครื่องหมายคำพูด (เดี่ยวหรือคู่)

นี่คือ jsfiddle ที่แสดงการทำงานข้างต้นทั้งหมด


7

ตัวเลือกอื่นคือการแทนที่เครื่องหมายคำพูดคู่ด้วยเครื่องหมายคำพูดเดี่ยวถ้าคุณไม่คำนึงว่าจะเป็นอะไร แต่ฉันไม่ได้พูดถึงสิ่งนี้:

<option value='"asd'>test</option>

ฉันพูดถึงสิ่งนี้:

<option value="'asd">test</option>

ในกรณีของฉันฉันใช้วิธีนี้


9
แต่ถ้าค่านั้นมีเครื่องหมายคำพูดเดี่ยว & คู่สิ่งนี้จะล้มเหลว
Raptor

@Raptor ฉันบอกว่าถ้าค่ามีเครื่องหมายคำพูดคู่ให้แปลงเป็นเครื่องหมายคำพูดเดี่ยว หากค่ามีเครื่องหมายคำพูดเดี่ยวมันจะไม่มีปัญหา
csonuryilmaz


0

คุณควรอนุญาตให้ข้อมูลที่ไม่น่าเชื่อถือเป็นรายการที่อนุญาตของคุณลักษณะที่ดีเช่น: จัดตำแหน่ง, alink, alt, bgcolor, เส้นขอบ, cellpadding, การจัดพื้นที่เซลล์, คลาส, สี, cols, colspan, coords, dir, ใบหน้า, ความสูง, hspace, ismap, lang , marginheight, marginwidth, หลาย, nohref, noresize, noshade, nowrap, ref, rel, rev, แถว, rowspan, การเลื่อน, รูปร่าง, ช่วง, สรุป, tabindex, หัวเรื่อง, usemap, valign, ค่า, vlink, vspace, ความกว้าง

คุณต้องการเก็บข้อมูลที่ไม่น่าเชื่อถือออกจากตัวจัดการจาวาสคริปต์เช่นเดียวกับคุณสมบัติ id หรือชื่อ (พวกเขาสามารถปิดบังองค์ประกอบอื่น ๆ ใน DOM)

นอกจากนี้หากคุณใส่ข้อมูลที่ไม่น่าเชื่อถือลงในแอตทริบิวต์ SRC หรือ HREF ดังนั้น URL ที่ไม่น่าเชื่อถือดังนั้นคุณควรตรวจสอบความถูกต้องของ URL ตรวจสอบให้แน่ใจว่าไม่ใช่ javascript: URL และเข้ารหัสเอนทิตี HTML

รายละเอียดเพิ่มเติมเกี่ยวกับที่นี่ทั้งหมด: https://www.owasp.org/index.php/Abridged_XSS_Prevention_Cheat_Sheet


3
ฉันรู้ว่ามันสายไปแล้ว แต่คุณสมบัติเหล่านั้นเกือบทั้งหมดเลิกใช้แล้วใน HTML4.01 และถูกลบออกใน 5 ซึ่งตอนนี้อาจไม่สำคัญเนื่องจากมีวิธีที่ดีกว่าในการป้องกันตัวเองเพียงแค่ชี้ให้เห็น
trysis

1
คำถามกำลังถามเกี่ยวกับข้อมูลที่มีอักขระเครื่องหมายคำพูดอยู่ไม่ใช่ข้อมูลที่ไม่น่าเชื่อถือ
เควนติน

-3

ไม่มีทางที่จะหลีกเลี่ยงคำพูดในมูลค่าของข้อความที่ป้อน ... แต่คุณสามารถใช้จาวาสคริปต์ (หรือ jquery):

<input type="input" name="myinput" id="myinput" value="" />
<script>document.getElementById("myinput").value="This input has a [\"]";</script>

1
คำสั่งของคุณ "ไม่มีทางที่จะหลีกหนีคำพูดในมูลค่าของข้อความที่ป้อน" เป็นเรื่องผิดธรรมดา ดูคำตอบที่ยอมรับจากปี 2010 ที่ได้รับ 276 โหวตขึ้นไป
เควนติน

หนีฉันเควนติน แต่คำตอบนั้นบอกว่าไม่มีทางที่จะทำได้ มันบอกว่าคุณสามารถแทรกเครื่องหมายคำพูดคู่แบบ html ที่เข้ารหัสหรือคุณสามารถใช้คำพูดง่าย ๆ ในการกำหนด delimite de double quote แต่มันไม่มีทางที่จะแทรก double quote เป็นค่าที่กำหนดด้วย double quote มันกำลังเสนอทางเลือกให้กับสิ่งที่เป็นไปไม่ได้ซึ่งเหมือนกับสิ่งที่ฉันทำ
Miguel

วิธีแทรกเครื่องหมายคำพูดคู่ในค่าที่คั่นด้วยเครื่องหมายคำพูดคู่คือใช้การเข้ารหัส HTMLตามที่คุณเพิ่งพูด
เควนติน

(สวัสดีเควนติน ... เราออนไลน์) ฉันแค่บอกว่าค่าของสตริงนั้นไม่ใช่เครื่องหมายคำพูดคู่เป็น & quot; ซึ่งไม่เหมือนกัน
มิเกล

2
หากคุณแทรก & quot; ในค่าและคุณส่งในเซิร์ฟเวอร์ที่คุณรับ 6 ตัวอักษรจาก & ไปที่; คุณไม่ได้รับใบเสนอราคาซ้ำ มันไม่เหมือนกันและใช้งานไม่ได้สำหรับฉัน
มิเกล
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.