พวกมันเหมือนกับ XML หรืออาจบวกกับช่องว่างหนึ่ง (
)
ฉันพบรายการอักขระหลบหลีก HTML ขนาดใหญ่ แต่ฉันคิดว่าไม่ต้องหลบหนี ฉันต้องการที่จะรู้ว่าสิ่งที่ต้องการที่จะหลบหนี
พวกมันเหมือนกับ XML หรืออาจบวกกับช่องว่างหนึ่ง (
)
ฉันพบรายการอักขระหลบหลีก HTML ขนาดใหญ่ แต่ฉันคิดว่าไม่ต้องหลบหนี ฉันต้องการที่จะรู้ว่าสิ่งที่ต้องการที่จะหลบหนี
คำตอบ:
หากคุณกำลังใส่เนื้อหาข้อความในเอกสารของคุณในสถานที่ที่มีเนื้อหาข้อความคาด1 , คุณมักจะต้องหลบหนีตัวอักษรเดียวกันตามที่คุณต้องการในรูปแบบ XML ภายในองค์ประกอบนี้รวมถึงแอมป์เอสเคป&
และตัวคั่นองค์ประกอบที่มีเครื่องหมายน้อยกว่าและใหญ่กว่า<
>
:
& becomes &
< becomes <
> becomes >
ภายในค่าคุณลักษณะคุณต้องหลีกเลี่ยงอักขระเครื่องหมายคำพูดที่คุณใช้:
" becomes "
' becomes '
ในบางกรณีอาจปลอดภัยที่จะข้ามการหลบหนีตัวละครบางตัว แต่ฉันขอแนะนำให้คุณหลบหนีทั้งห้าในทุกกรณีเพื่อลดโอกาสในการทำผิดพลาด
หากการเข้ารหัสเอกสารของคุณไม่รองรับอักขระทั้งหมดที่คุณใช้เช่นถ้าคุณกำลังพยายามใช้อิโมจิในเอกสารที่มีการเข้ารหัส ASCII คุณจะต้องหลีกเลี่ยง เอกสารส่วนใหญ่ในทุกวันนี้ได้รับการเข้ารหัสโดยใช้การเข้ารหัส UTF-8 ที่สนับสนุน Unicode อย่างสมบูรณ์โดยไม่จำเป็นต้องทำเช่นนี้
โดยทั่วไปแล้วคุณไม่ควรหนีพื้นที่เป็น
ไม่ได้เป็นพื้นที่ปกติมันเป็นพื้นที่ที่ไม่ทำลาย คุณสามารถใช้สิ่งเหล่านี้แทนช่องว่างปกติเพื่อป้องกันไม่ให้มีการแทรกตัวแบ่งบรรทัดระหว่างสองคำหรือเพื่อแทรกช่องว่างเพิ่มเติมโดยไม่ยุบลงโดยอัตโนมัติ แต่โดยทั่วไปจะเป็นกรณีที่ไม่ค่อยเกิดขึ้น อย่าทำสิ่งนี้จนกว่าคุณจะมีข้อ จำกัด ในการออกแบบที่จำเป็นต้องใช้
1โดย "ตำแหน่งที่คาดว่าจะมีเนื้อหาข้อความ" ฉันหมายถึงภายในองค์ประกอบหรือค่าแอตทริบิวต์ที่เสนอราคาโดยใช้กฎการแยกวิเคราะห์ตามปกติ ตัวอย่างเช่น: หรือ<p>HERE</p>
<p title="HERE">...</p>
สิ่งที่ฉันเขียนด้านบนไม่สามารถใช้กับเนื้อหาที่มีการแยกกฎหรือความหมายพิเศษเช่นด้านในของสคริปต์หรือแท็กสไตล์หรือเป็นองค์ประกอบหรือชื่อแอตทริบิวต์ ตัวอย่างเช่น<NOT-HERE>...</NOT-HERE>
, <script>NOT-HERE</script>
, หรือ<style>NOT-HERE</script>
<p NOT-HERE="...">...</p>
ในบริบทเหล่านี้กฎมีความซับซ้อนและง่ายต่อการแนะนำช่องโหว่ความปลอดภัย ฉันขอแนะนำให้คุณแทรกเนื้อหาแบบไดนามิกในสถานที่เหล่านี้ ฉันได้เห็นทีมงานของผู้พัฒนาที่ตระหนักถึงความปลอดภัยได้แนะนำช่องโหว่ด้วยการสมมติว่าพวกเขาเข้ารหัสค่าเหล่านี้อย่างถูกต้อง แต่ไม่มีช่องโหว่ โดยทั่วไปจะมีทางเลือกที่ปลอดภัยกว่าเช่นการใส่ค่าแบบไดนามิกในแอตทริบิวต์แล้วจัดการด้วย JavaScript
หากคุณต้องการโปรดอ่านกฎการป้องกัน XSS ของ Open Web Application Security Projectเพื่อช่วยให้เข้าใจถึงข้อกังวลบางอย่างที่คุณต้องคำนึงถึง
มันขึ้นอยู่กับบริบท บริบทที่เป็นไปได้บางอย่างใน HTML:
ดูเอกสารประกอบการป้องกันการเขียนสคริปต์ข้ามไซต์ของ OWASP โดยเฉพาะในส่วน " ทำไมฉันถึงไม่สามารถเข้ารหัสเอนทิตี HTML ของเอนทิตีที่ไม่น่าเชื่อถือได้? " และ " กฎการป้องกัน XSS " อย่างไรก็ตามเป็นการดีที่สุดที่จะอ่านเอกสารทั้งหมด
โดยทั่วไปมีตัวละครหลักสามตัวที่ควรหลีกเลี่ยงในไฟล์ HTML และ XML ของคุณเสมอดังนั้นพวกเขาจึงไม่โต้ตอบกับส่วนที่เหลือของมาร์กอัปดังนั้นอย่างที่คุณคาดหวังสองคนในนั้นจะเป็นตัวห่อไวยากรณ์ > พวกเขาอยู่ด้านล่าง:
1) < (<)
2) > (>)
3) & (&)
นอกจากนี้เราอาจใช้เครื่องหมายคำพูดคู่ (") เป็น" และเครื่องหมายคำพูดเดี่ยว (') เป็น & apos
หลีกเลี่ยงการใส่เนื้อหาแบบไดนามิกใน<script>
และ<style>
กฎเหล่านี้ไม่ได้ใช้สำหรับพวกเขา ตัวอย่างเช่นหากคุณต้องรวม JSON ใน a, แทนที่ <ด้วย \ x3c, อักขระ U + 2028 ด้วย \ u2028 และ U + 2029 ด้วย \ u2029 หลังจากซีเรียลไลซ์ชัน JSON)
อักขระ Escape HTML: รายการที่สมบูรณ์: http://www.theukwebdesigncompany.com/articles/entity-escape-characters.php
ดังนั้นคุณต้องหลบหนี <หรือหรือเมื่อตามด้วยสิ่งใดก็ตามที่สามารถเริ่มการอ้างอิงอักขระได้ นอกจากนี้กฎบนเครื่องหมายแอมเปอร์แซนด์เป็นเพียงกฎดังกล่าวสำหรับคุณลักษณะที่ยกมาเนื่องจากเครื่องหมายคำพูดที่ตรงกันเป็นสิ่งเดียวที่จะยกเลิกหนึ่ง แต่หากคุณไม่ต้องการยกเลิกค่าแอททริบิวนั้น
การเปลี่ยนเป็น UTF-8 หมายถึงการบันทึกไฟล์ของคุณอีกครั้ง:
การใช้การเข้ารหัสอักขระ UTF-8 สำหรับหน้าเว็บของคุณหมายความว่าคุณสามารถหลีกเลี่ยงความต้องการการหลบหนีส่วนใหญ่และทำงานกับตัวละครได้ อย่างไรก็ตามโปรดทราบว่าการเปลี่ยนการเข้ารหัสเอกสารของคุณไม่เพียงแค่เปลี่ยนการประกาศการเข้ารหัสที่ด้านบนของหน้าหรือบนเซิร์ฟเวอร์ คุณต้องบันทึกเอกสารของคุณอีกครั้งในการเข้ารหัสนั้น สำหรับความช่วยเหลือในการทำความเข้าใจวิธีการทำกับแอปพลิเคชันของคุณอ่านการตั้งค่าการเข้ารหัสในแอปพลิเคชันการเขียนเว็บอักขระที่มองไม่เห็นหรือไม่ชัดเจน:
บทบาทที่มีประโยชน์อย่างยิ่งสำหรับการหลบหนีคือการแสดงตัวละครที่มองไม่เห็นหรือคลุมเครือในการนำเสนอ
ตัวอย่างหนึ่งก็คืออักขระ Unicode U + 200F เครื่องหมาย RIGHT-TO-LEFT อักขระนี้สามารถใช้เพื่ออธิบายทิศทางในข้อความสองทิศทาง (เช่นเมื่อใช้สคริปต์อารบิกหรือฮิบรู) อย่างไรก็ตามไม่มีรูปแบบกราฟิกดังนั้นจึงเป็นเรื่องยากที่จะเห็นว่าตัวละครเหล่านี้อยู่ในข้อความและถ้าพวกเขาหายไปหรือลืมพวกเขาสามารถสร้างผลลัพธ์ที่ไม่คาดคิดในระหว่างการแก้ไขในภายหลัง การใช้ (หรือการอ้างอิงอักขระตัวเลขเทียบเท่า) แทนทำให้ง่ายต่อการสังเกตเห็นอักขระเหล่านี้
ตัวอย่างของอักขระที่ไม่ชัดเจนคือ U + 00A0 NO-BREAK SPACE พื้นที่ประเภทนี้ป้องกันการแตกของเส้น แต่มันก็เหมือนกับพื้นที่อื่น ๆ เมื่อใช้เป็นตัวละคร การใช้ทำให้ค่อนข้างชัดเจนเมื่อมีช่องว่างดังกล่าวปรากฏในข้อความ
คำตอบที่แน่นอนขึ้นอยู่กับบริบท โดยทั่วไปตัวอักษรเหล่านี้จะต้องไม่ปรากฏ ( HTML 5.2 §3.2.4.2.5 ):
โหนดข้อความและค่าแอตทริบิวต์ต้องประกอบด้วยอักขระ Unicode ต้องไม่มีอักขระ U + 0000 ต้องไม่มีอักขระ Unicode ที่ไม่ได้กำหนดอย่างถาวร (ไม่ใช่อักขระ) และต้องไม่มีอักขระควบคุมอื่นที่ไม่ใช่อักขระเว้นวรรค ข้อมูลจำเพาะนี้มีข้อ จำกัด เพิ่มเติมเกี่ยวกับค่าที่แน่นอนของโหนดข้อความและค่าแอตทริบิวต์ขึ้นอยู่กับบริบทที่แม่นยำ
สำหรับองค์ประกอบใน HTML ข้อ จำกัด ของรูปแบบเนื้อหาข้อความก็ขึ้นอยู่กับประเภทขององค์ประกอบด้วย ตัวอย่างเช่น "<" ในองค์ประกอบ textarea ไม่จำเป็นต้องหลบหนีใน HTML เพราะ textarea เป็นองค์ประกอบข้อความดิบที่หลีกเลี่ยงไม่ได้
ข้อ จำกัด เหล่านี้กระจายอยู่ทั่วข้อกำหนด ตัวอย่างเช่นค่าแอตทริบิวต์ ( §8.1.2.3 ) ต้องไม่มีเครื่องหมายแอมเปอร์คลุมเครือและต้องเป็น(i)ว่างเปล่า(ii)ภายในเครื่องหมายคำพูดเดี่ยว (และต้องไม่มีอักขระ U + 0027 APOSTROPHE '
), (iii)ภายในเครื่องหมายคำพูดคู่ ( ต้องไม่มีอักขระเครื่องหมายคำพูด U + 0022 เครื่องหมายอัญประกาศ"
) หรือ(iv) ไม่ระบุ - โดยมีข้อ จำกัด ดังต่อไปนี้:
... ต้องไม่มีอักขระเว้นวรรคตามตัวอักษรอักขระเครื่องหมายอัญประกาศ U + 0022 ใด ๆ ("), U + 0027 อักขระ APOSTROPHE ('), U + 003D อักขระการลงชื่อเท่ากับ (=), U + 003C อักขระการลงชื่อน้อยกว่า ( <), U + 003E ตัวอักษรยิ่งใหญ่กว่าเครื่องหมาย (>) หรือ U + 0060 GRAVE ACCENT อักขระ (`) และต้องไม่เป็นสตริงว่าง
<p onclick="NOT-HERE">...</p>
<p style="NOT-HERE">...</p>