ฉันต้องเข้ารหัส '&' เป็น '& amp;' จริง ๆ หรือไม่


207

ฉันใช้ ' &' สัญลักษณ์กับ HTML5 และ UTF-8 <title>ในเว็บไซต์ของฉัน Google แสดงเครื่องหมายแอมป์แซนด์ใน SERPs เช่นเดียวกับเบราว์เซอร์ทั้งหมดในชื่อ

http://validator.w3.orgให้สิ่งนี้แก่ฉัน:

& ไม่ได้เริ่มการอ้างอิงตัวละคร (และน่าจะได้รับการยกเว้นว่าเป็น&amp;)

ฉันต้องทำจริงๆ&amp;เหรอ?

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


63
รายละเอียดไม่ได้พูดอย่างนั้น โปสเตอร์อ้างอิงถึง HTML5 ซึ่งไม่ต้องการการหลีกเลี่ยงจากเครื่องหมายและในทุกสถานการณ์
Matthew Wilson

2
นี่ควรเป็น Community Wiki ในขณะที่คุณกำลังมองหาความคิดเห็นและไม่ยุ่งเกี่ยวกับการตรวจสอบความถูกต้องหมายความว่าไม่มีพื้นฐานที่จะตอบ
Richard JP Le Guen

6
@ Richard: จริงเหรอ? ในขณะที่ฉันไม่เห็นด้วยว่า "การตรวจสอบความถูกต้องไม่สำคัญ" ฉันเห็นว่านี่เป็นคำถามที่มีวัตถุประสงค์: "สิ่งนี้ทำลายสิ่งอื่นนอกเหนือจากข้อมูลจำเพาะหรือไม่"
โจอาคิมซาวเออร์

2
@YiJiang ปัจจุบันเว็บเบราเซอร์ไปช่วงที่ดีที่จะเข้าใจผู้ใช้ Google ก็เช่นกัน มันเป็นส่วนหนึ่งของสเป็ค เว็บเบราว์เซอร์ในอนาคตอาจให้อภัยน้อยลง ดังนั้นจึงเป็นความคิดที่ดีที่จะตรวจสอบว่า Wikipedia ทำและคัดลอกมาอย่างไร
unixman83

2
ข้อมูลจำเพาะ HTML บอกว่าจะยอมรับอินพุตอึ หมายความว่าเว็บไซต์ของคุณ "ได้รับอนุญาต" กลายเป็นไร้สาระตอนนี้หรือไม่ ปิดแท็กที่ต้องปิดและหลบสิ่งต่างๆ! มากับผู้คน
doug65536

คำตอบ:


143

ใช่. เช่นเดียวกับข้อผิดพลาดที่กล่าวใน HTML แอตทริบิวต์คือ #PCDATA ซึ่งหมายถึงการแยกวิเคราะห์ ซึ่งหมายความว่าคุณสามารถใช้อักขระเอนทิตีในแอตทริบิวต์ การใช้งาน&ด้วยตนเองนั้นผิดและหากไม่ใช่สำหรับเบราว์เซอร์ที่ผ่อนปรนและความจริงที่ว่านี่ไม่ใช่ HTML XHTML จะทำให้การแยกวิเคราะห์เสียหาย เพียงแค่หลบหนี&amp;และทุกอย่างจะเรียบร้อย

HTML5 ช่วยให้คุณสามารถปล่อยให้มันไม่ใช้ค่า Escape ได้ แต่เฉพาะเมื่อข้อมูลที่ตามมานั้นดูไม่เหมือนการอ้างอิงอักขระที่ถูกต้อง อย่างไรก็ตามจะเป็นการดีกว่าที่จะหลีกเลี่ยงทุกกรณีของสัญลักษณ์นี้แทนที่จะกังวลว่าควรจะอยู่ที่ไหนและไม่จำเป็นต้องเป็นอันใด

จำประเด็นนี้ไว้ในใจ; หากคุณไม่ได้หลบหนี & ไปยัง & amp; มันไม่ดีพอสำหรับข้อมูลที่คุณสร้าง (ซึ่งรหัสอาจไม่ถูกต้อง) คุณอาจไม่ได้กำลังหลบหลีกตัวคั่นแท็กซึ่งเป็นปัญหาใหญ่สำหรับข้อมูลที่ผู้ใช้ส่งมา ซึ่งอาจนำไปสู่ ​​HTML และการฉีดสคริปต์การขโมยคุกกี้และการหาประโยชน์อื่น ๆ ได้เป็นอย่างดี

โปรดเพิ่งหลบหนีรหัสของคุณ มันจะช่วยให้คุณประหยัดมากปัญหาในอนาคต


9
ไม่มีเบราว์เซอร์ที่จะ "ตีความ" ผิด & ตัวเอง ทุกเบราว์เซอร์ที่มีอยู่แสดงเป็น "&" พิจารณาอย่างชัดเจนเขาถามหาเหตุผลในทางปฏิบัติที่จะทำมันและที่เขาบอกว่าเขาไม่สนใจเกี่ยวกับการตรวจสอบ ..
โทมัส Bonini

47
ใช่. แต่ในทางศีลธรรมเราควรพึ่งพาข้อผิดพลาดและการจัดการเบราว์เซอร์ที่ "ดี" หรือไม่? หรือเราควรจะเขียนรหัสที่ถูกต้อง?
Delan Azabani

8
@Delan: ในขณะที่ฉันพยายามทำให้ทุกหน้าฉันเขียนตรวจสอบฉันเข้าใจจากการอ่านคำถามของเขาว่าเขาไม่สนใจ "คุณธรรม" เขาแค่สนใจว่ามันใช้ได้หรือไม่ พวกเขาเป็นปรัชญาที่แตกต่างกันสองแบบและทั้งสองมีข้อดีและข้อเสียและไม่มี "ที่ถูกต้อง" ตัวอย่างเช่นเว็บไซต์นี้ไม่ได้ตรวจสอบ แต่มันก็เป็นเว็บไซต์ที่ดี
โทมัสโบนินี

3
@Andreas แต่เบราว์เซอร์มีข้อบกพร่องมากพอในการตีความรหัสที่ถูกต้องขึ้นอยู่กับว่าพวกเขาได้รับผลลัพธ์ที่ถูกต้องเมื่อคุณส่งมาร์กอัปที่ไม่มีความหมายคือความไม่แน่นอน มันอาจใช้งานได้ในวันนี้ด้วยตัวอย่างนั้นแล้วล้มเหลวด้วยตัวอย่างถัดไป (พูดว่าตัวอย่างถัดไปมีเซมิโคลอนสักที่หลัง &)
Jon Hanna

11
ดูเหมือนว่าทุกคนจะพูดถึง HTML5 แต่คำถามเดิมระบุว่ามีการใช้ HTML5 HTML5 ช่วยให้ไม่สามารถหลีกเลี่ยง & ในสถานการณ์นี้ได้อย่างชัดเจนเว้นแต่สิ่งที่ตามมา & จะขยายไปยังเอนทิตีปกติ (เช่น & copy = 2 เป็นปัญหา แต่ & x = 2 ใช้ได้)
Matthew Wilson

55

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

การเข้ารหัส&เป็น&amp;ภายใต้สถานการณ์ทั้งหมดสำหรับฉันเป็นกฎง่ายขึ้นโดยสดลดโอกาสของความผิดพลาดและความล้มเหลว

เปรียบเทียบสิ่งต่อไปนี้: ไหนง่ายกว่ากัน? ซึ่งเป็นเรื่องง่ายที่จะเสพเวจมรรคขึ้น ?

วิธีการ 1

  1. เขียนเนื้อหาบางส่วนซึ่งมีอักขระเครื่องหมายและ
  2. เข้ารหัสพวกเขาทั้งหมด

วิธีการ 2

(ด้วยเกลือเม็ดโปรด;)

  1. เขียนเนื้อหาบางส่วนซึ่งมีอักขระเครื่องหมายและ
  2. ในแต่ละกรณีให้ดูที่เครื่องหมายและแต่ละตัว ตรวจสอบว่า:
    • มันแยกได้และเป็นเครื่องหมายแอมเปอร์แซนด์ เช่น. volt & amp
       > ในกรณีนี้จะไม่รบกวนการเข้ารหัส
    • มันไม่ได้ถูกแยกออก แต่คุณรู้สึกว่ามันไม่ได้คลุมเครือ แต่อย่างใดเนื่องจากเอนทิตีที่เป็นผลลัพธ์ไม่ได้มีอยู่และจะไม่เกิดขึ้นเนื่องจากรายการเอนทิตีไม่สามารถพัฒนาได้ เช่นamp&volt
       > ในกรณีนั้นจะไม่รบกวนการเข้ารหัส
    • มันไม่ได้โดดเดี่ยวและคลุมเครือ เช่น. volt&amp
       > เข้ารหัสมัน

??


3
กรณีที่สองของการamp&volt เป็นที่คลุมเครือ: คือ&voltตอนนี้การอ้างอิงนิติบุคคลหรือไม่?
Gumbo

6
@Gumbo เครื่องหมายในamp&voltคือไม่เครื่องหมายคลุมเครือ (ตามคำนิยามใน HTML ข้อมูลจำเพาะ) ดูmathiasbynens.be/notes/ambiguous-ampersandsและmothereff.in/ampersands#amp%26volt
งัด Bynens

@MathiasBynens โดยขณะนี้ (2019) ซึ่งเป็นความหมายของเครื่องหมายคลุมเครือดูเหมือนว่าจะมีการเปลี่ยนแปลงเล็กน้อยจากนิยามที่คุณยกมาย้อนกลับไปในปี 2011 ในmathiasbynens.be/notes/ambiguous-ampersands
Jacob C. พูดว่า Reinstate Monica

21

กฎ HTML5 นั้นแตกต่างจาก HTML4 ไม่จำเป็นต้องใช้ใน HTML5 ยกเว้นว่าเครื่องหมายและตัวอักษรดูเหมือนจะเริ่มต้นชื่อพารามิเตอร์ "& copy = 2" ยังคงมีปัญหาเช่นเนื่องจาก & copy; เป็นสัญลักษณ์ลิขสิทธิ์

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


2
มันเหมือนกับการอ้างอิงค่าคุณลักษณะ - คุณไม่จำเป็นต้องทำ แต่คุณไม่สามารถผิดพลาดได้หากคุณทำตลอดเวลา
Paul D. Waite

3
&copy=2ไม่ใช่ปัญหาใหญ่อย่างที่คุณคิด ในค่าแอตทริบิวต์ (เช่นhrefแอตทริบิวต์) ที่จะไม่ได้รับการพิจารณาเป็นข้อมูลอ้างอิงสำหรับตัวละคร&copy ©นอกค่าคุณลักษณะก็จะ
Mathias Bynens

เนื่องจากปกติแล้วเครื่องหมายแอมเปอร์แซนด์จะนำหน้าและตามด้วยช่องว่างในข้อความภาษาอังกฤษมันไม่ยากที่จะจดจำหรือคิดเกี่ยวกับกฎที่ฉันติดตาม: หากแอมเปอร์แซนด์ไม่ได้สัมผัสตัวละครอื่นที่มองเห็นได้ซึ่งเกือบตลอดเวลา การเข้ารหัส มิฉะนั้นเพียงเข้ารหัสเพื่อประโยชน์ของความเรียบง่าย
Carl Smith เมื่อ

คุณสามารถเพิ่มการอ้างอิงถึงกฎ HTML5 ได้หรือไม่
Ferrybig

17

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

มาตรฐานไม่ใช่สิ่ง "ปัจจุบัน" พวกเขาเป็นสิ่งที่ "อนาคต" หากเราในฐานะนักพัฒนาทำตามมาตรฐานเว็บผู้จำหน่ายเบราว์เซอร์มีแนวโน้มที่จะใช้มาตรฐานเหล่านั้นอย่างถูกต้องมากขึ้นและเราเข้าใกล้เว็บที่ทำงานร่วมกันได้อย่างสมบูรณ์โดยไม่จำเป็นต้องใช้ CSS แฮ็กการตรวจจับคุณสมบัติและการตรวจสอบเบราว์เซอร์ ที่ซึ่งเราไม่ต้องคิดออกว่าเหตุใดเค้าโครงของเราจึงแตกในเบราว์เซอร์หนึ่ง ๆ หรือวิธีการแก้ไข

โดยเฉพาะถ้า HTML5 ไม่ต้องการใช้ & amp; ในสถานการณ์เฉพาะของคุณและคุณกำลังใช้ประเภท HTML5 (และคาดหวังว่าผู้ใช้ของคุณจะใช้เบราว์เซอร์ที่สอดคล้องกับ HTML5) ดังนั้นจึงไม่มีเหตุผลที่จะทำ


1
โดยทั่วไปแล้วคุณจะต้องจำไว้ว่าวิธี "มาตรฐาน" ส่วนใหญ่ยังคงอยู่ในโหมดร่างและอาจมีการเปลี่ยนแปลงในอนาคต
refaelio

6

ถ้ามันมาจากการป้อนข้อมูลของผู้ใช้ใช่อย่างแน่นอนด้วยเหตุผลที่ชัดเจน คิดว่าเว็บไซต์นี้ไม่ได้ทำ: ชื่อของคำถามนี้จะปรากฏขึ้นเช่นเดียวกับที่ฉันต้องเข้ารหัส '&' เป็น '&'?

หากเป็นเช่นecho '<title>Dolce & Gabbana</title>';นั้นคุณก็ไม่จำเป็นต้องพูดอย่างเคร่งครัด มันจะดีกว่า แต่ถ้าคุณไม่มีผู้ใช้จะสังเกตเห็นความแตกต่าง


5

คุณช่วยแสดงให้เราเห็นว่าtitleจริง ๆ แล้วคุณคืออะไร? เมื่อฉันส่ง

<!DOCTYPE html>
<html>
<title>Dolce & Gabbana</title>
<body>
<p>am i allowed loose & mpersands?</p>
</body>
</html>

เพื่อhttp://validator.w3.org/ - ขอให้ใช้โหมด HTML 5 รุ่นทดลองอย่างชัดเจน - ไม่มีการร้องเรียนเกี่ยวกับ&s ...


1
ใช่ HTML5 มีตัวแยกวิเคราะห์ที่แตกต่างจากตัวแยกวิเคราะห์ HTML และ XHTML ก่อนหน้าและอนุญาตให้แอมป์แซนด์ที่ไม่ใช้ค่า Escape ในบางสถานการณ์
kevinji

เท่าที่ตัวอย่างเหล่านี้ดำเนินไปสิ่งนี้ไม่มีอะไรใหม่ใน HTML5 ทั้งสอง<title>Dolce & Gabbana</title>และ<p>Dolce & Gabbana</p>เป็น HTML 2.0 ที่ถูกต้อง
งัด Bynens

4

ในแบบ HTML &เครื่องหมายเริ่มต้นของการอ้างอิงอย่างใดอย่างหนึ่งของการอ้างอิงตัวละครหรือการอ้างอิงเอนทิตี จากจุดบนตัวแยกวิเคราะห์คาดว่าอย่างใดอย่างหนึ่งที่แสดงถึงการอ้างอิงตัวละครหรือชื่อนิติบุคคลที่แสดงถึงการอ้างอิงนิติบุคคลทั้งสองตามมาด้วย# ;นั่นเป็นพฤติกรรมปกติ

แต่ถ้าชื่ออ้างอิงหรือเพียงแค่เปิดอ้างอิง&ตามด้วยพื้นที่สีขาวหรือตัวคั่นอื่น ๆ เช่น", ', <, >, &, สิ้นสุด;และแม้กระทั่งการอ้างอิงเพื่อเป็นตัวแทนของธรรมดา&สามารถละเว้น:

<p title="&amp;">foo &amp; bar</p>
<p title="&amp">foo &amp bar</p>
<p title="&">foo & bar</p>

เฉพาะในกรณีเหล่านี้การสิ้นสุด;หรือแม้แต่การอ้างอิงสามารถละเว้นได้ (อย่างน้อยใน HTML 4) ผมคิดว่าต้องใช้ HTML 5 ;ตอนจบ

แต่ข้อมูลจำเพาะแนะนำให้ใช้การอ้างอิงเช่นการอ้างอิงอักขระ&#38;หรือการอ้างอิงเอนทิตีเสมอ&amp;เพื่อหลีกเลี่ยงความสับสน:

ผู้เขียนควรใช้ " &amp;" (ASCII ทศนิยม 38) แทน " &" เพื่อหลีกเลี่ยงความสับสนกับการเริ่มต้นของการอ้างอิงอักขระ (เอนทิตีอ้างอิงเปิดนิติบุคคล) ผู้เขียนควรใช้ " &amp;" ในค่าแอตทริบิวต์เนื่องจากอนุญาตให้มีการอ้างอิงอักขระภายในค่าแอตทริบิวต์ CDATA


1
นั่นคือข้อกำหนด HTML 4 ที่คุณลิงก์ไป จากการอ่านข้อมูลจำเพาะ HTML 5 (ฉบับร่าง) ของฉันไม่อนุญาตให้ใช้เครื่องหมายแอมเปอร์แซนด์ที่ไม่ชัดเจนเท่านั้น เครื่องหมายแอมเปอร์แซนด์แล้วตามด้วยเว้นวรรคไม่ควรคลุมเครือและควรอนุญาต (อีกครั้งโดยการอ่านของฉัน) - ดูคำตอบของฉันสำหรับมาร์กอัปที่ HTML 5 validator ยอมรับ
AakashM

1
@AakashM: ฉันไม่แน่ใจว่ามันฟังดูเหมือนว่า
Gumbo

3

หากผู้ใช้ผ่านมันมาให้คุณหรือมันจะจบใน URL คุณจะต้องหลีกเลี่ยง

หากปรากฏเป็นข้อความคงที่ในหน้า? เบราว์เซอร์ทั้งหมดจะได้รับสิ่งนี้อย่างใดอย่างหนึ่งคุณไม่ต้องกังวลมากเพราะมันจะทำงาน


3

อัปเดต (มีนาคม 2563):เครื่องมือตรวจสอบ W3C ไม่ได้บ่นเกี่ยวกับการหลบหนี URL อีกต่อไป

ฉันถูกตรวจสอบเหตุผลความจำเป็นในภาพของ URL หลบหนีจึงพยายามมันในhttps://validator.w3.org คำอธิบายค่อนข้างดี มันเป็นการเน้นว่าแม้แต่ความต้องการของ URL ที่จะต้องถูกหลบหนี [PS: ผมคิดว่ามันจะไม่ใช้ Escape &เมื่อบริโภคนับตั้งแต่ความต้องการของ ใครช่วยอธิบายได้ไหม]

<img alt="" src="foo?bar=qut&qux=fop" />

พบการอ้างอิงเอนทิตีในเอกสาร แต่ไม่มีการอ้างอิงตามชื่อที่กำหนดไว้ บ่อยครั้งที่สิ่งนี้เกิดจากการสะกดชื่ออ้างอิง, เครื่องหมายแอมเปอร์แซนด์ที่ไม่ได้เข้ารหัสหรือออกจากเครื่องหมายอัฒภาคต่อท้าย (;) สาเหตุที่พบบ่อยที่สุดของข้อผิดพลาดนี้คือเครื่องหมายแอมเปอร์แซนด์ใน URL ตามที่อธิบายโดย WDG ใน "แอมเปอร์แซนด์ใน URL" การอ้างอิงเอนทิตีเริ่มต้นด้วยเครื่องหมายแอมเปอร์แซนด์ (&) และจบด้วยเซมิโคลอน (;) หากคุณต้องการใช้เครื่องหมายและตัวอักษรในเอกสารของคุณคุณต้องเข้ารหัสเป็น "&" (แม้จะอยู่ใน URL!) โปรดระมัดระวังในการสิ้นสุดการอ้างอิงเอนทิตีด้วยเซมิโคลอนหรือการอ้างอิงเอนทิตีของคุณอาจถูกตีความโดยเชื่อมโยงกับข้อความต่อไปนี้ นอกจากนี้โปรดทราบว่าการอ้างอิงเอนทิตีที่มีชื่อเป็นกรณี ๆ & Aelig; และæเป็นตัวละครที่แตกต่างกัน


1
อ่านคำตอบที่ได้รับคะแนนสูงสุด คุณสมบัติเป็น #PCDATA และแยกวิเคราะห์ดังนั้น หน่วยงานได้รับการจัดการที่นั่น ในตัวอย่างของคุณการ&เริ่มต้นการอ้างอิงเอนทิตี หลังจากอ่าน&quxแล้วตัวแยกวิเคราะห์จะไม่พบเซมิโคลอน ( ;) สุดท้ายแต่ทำงานเป็นเครื่องหมายเท่ากับ ( =) ซึ่งไม่สามารถเป็นส่วนหนึ่งของชื่อเอนทิตีได้ นี่ควรเป็นข้อผิดพลาดในการแยกวิเคราะห์ถ้า parser พยายามเข้มงวดมาก (ตาม HTML 4) ใน HTML 5 เอนทิตี้การแยกวิเคราะห์โดยรวมดูผ่อนคลายมากขึ้น
Palec

1
ฉันสงสัยว่าโดยทั่วไปจะเป็นการดีที่สุดที่จะใช้;เป็นตัวคั่นในสตริงการสืบค้น (เมื่อคุณควบคุมลิงก์) ด้วยเหตุผลดังกล่าว
Demi

2

ใช่คุณควรลองใช้รหัสที่ถูกต้องถ้าเป็นไปได้

เบราว์เซอร์ส่วนใหญ่จะแก้ไขข้อผิดพลาดนี้อย่างเงียบ ๆ แต่มีปัญหากับการพึ่งพาการจัดการข้อผิดพลาดในเบราว์เซอร์ ไม่มีมาตรฐานสำหรับวิธีจัดการกับรหัสที่ไม่ถูกต้องดังนั้นจึงขึ้นอยู่กับผู้ขายเบราว์เซอร์แต่ละรายเพื่อลองหาว่าจะทำอย่างไรกับข้อผิดพลาดแต่ละครั้งและผลลัพธ์อาจแตกต่างกันไป

ตัวอย่างบางส่วนที่เบราว์เซอร์มีแนวโน้มที่จะตอบสนองแตกต่างกันคือถ้าคุณใส่องค์ประกอบไว้ในตาราง แต่นอกเซลล์ตารางหรือหากคุณซ้อนลิงก์ไว้ภายในกัน

สำหรับตัวอย่างเฉพาะของคุณอาจไม่ก่อให้เกิดปัญหาใด ๆ แต่การแก้ไขข้อผิดพลาดในเบราว์เซอร์อาจทำให้เบราว์เซอร์เปลี่ยนจากโหมดที่เป็นไปตามมาตรฐานเป็นโหมด quirks ซึ่งอาจทำให้เค้าโครงของคุณพังทลายลงอย่างสมบูรณ์

ดังนั้นคุณควรแก้ไขข้อผิดพลาดเช่นนี้ในรหัสหากไม่ใช่เพื่อสิ่งอื่นดังนั้นเพื่อให้รายการข้อผิดพลาดในตัวตรวจสอบความถูกต้องสั้นเพื่อให้คุณสามารถตรวจพบปัญหาที่ร้ายแรงยิ่งขึ้น


2

สองสามปีที่ผ่านมาเราได้รับรายงานว่าหนึ่งในเว็บแอปของเราแสดงไม่ถูกต้องใน Firefox ปรากฎว่าหน้านั้นมีแท็กที่ดูเหมือน

<div style="..." ... style="...">

เมื่อต้องเผชิญกับแอตทริบิวต์ของลักษณะซ้ำ ๆ กัน IE จะรวมสไตล์ทั้งสองเข้าด้วยกันในขณะที่ Firefox ใช้เพียงหนึ่งลักษณะเท่านั้นดังนั้นพฤติกรรมที่แตกต่าง ฉันเปลี่ยนแท็กเป็น

<div style="...; ..." ...>

และก็เพียงพอที่จะแก้ไขปัญหาได้! คุณธรรมของเรื่องราวคือเบราว์เซอร์มีการจัดการ HTML ที่ถูกต้องมากกว่า HTML ที่ไม่ถูกต้อง ดังนั้นแก้ไขมาร์กอัปแช่งของคุณแล้ว! (หรือใช้ HTML Tidy เพื่อแก้ไข)


1

ถ้า&ใช้ในhtmlคุณควรหลีกเลี่ยง

หาก&ใช้ในสตริง javascript เช่น a alert('This & that');หรือ document.href คุณไม่จำเป็นต้องใช้มัน

หากคุณใช้ document.write คุณควรใช้มันเช่น document.write(<p>this &amp; that</p>)


document.writeควรหลีกเลี่ยง เห็นกล่องเตือนในw3.org/html/wg/drafts/html/master/dom.html#document.write%28%29
Oriol

document.write()จุดที่ดีเกี่ยวกับ แต่ประเด็นทั้งหมดที่อเล็กซ์กำลังทำเกี่ยวกับการเขียนเอกสารจากสคริปต์ย่อมาจาก imo +1
Patrick M

1

ขึ้นอยู่กับความน่าจะเป็นของเครื่องหมายอัฒภาคที่อยู่ใกล้คุณ&ทำให้มันแสดงบางสิ่งที่แตกต่างออกไป

ตัวอย่างเช่นเมื่อจัดการกับอินพุตจากผู้ใช้ (เช่นถ้าคุณใส่หัวข้อที่ผู้ใช้ระบุไว้ในโพสต์ฟอรัมในแท็กชื่อของคุณ) คุณจะไม่มีทางรู้ว่าพวกเขาจะใส่เครื่องหมายอัฒภาคแบบสุ่มได้อย่างไร ดังนั้นจงหลบหนีในสถานการณ์นั้นเสมอ

สำหรับ HTML แบบคงที่ของคุณเองแน่นอนคุณสามารถข้ามได้ แต่มันก็สำคัญมากที่จะรวมการหลบหนีที่เหมาะสมว่าไม่มีเหตุผลที่ดีที่จะหลีกเลี่ยง


0

หากคุณกำลังพูดถึงข้อความคงที่จริงๆ

<title>Foo & Bar</title>

เก็บไว้ในไฟล์บางส่วนบนฮาร์ดดิสก์และให้บริการโดยตรงจากเซิร์ฟเวอร์แล้วใช่: มันอาจไม่จำเป็นต้องหลบหนี

อย่างไรก็ตามเนื่องจากมีเนื้อหา HTML น้อยมากในปัจจุบันที่ไม่มีการเปลี่ยนแปลงอย่างสมบูรณ์ฉันจะเพิ่มข้อจำกัดความรับผิดชอบต่อไปนี้ซึ่งสันนิษฐานว่าเนื้อหา HTML ถูกสร้างขึ้นจากแหล่งข้อมูลอื่น (เนื้อหาฐานข้อมูลการป้อนข้อมูลผู้ใช้ผลการเรียกบริการเว็บ .. ):

หากคุณไม่ได้หลบหนีออกมาง่ายๆ&แล้วโอกาสที่คุณยังไม่ได้หลบหนี&amp;หรือ&nbsp;หรือ<b>หรือ<script src="http://attacker.com/evil.js">หรือข้อความที่ไม่ถูกต้องอื่น ๆ นั่นหมายความว่าคุณกำลังแสดงเนื้อหาของคุณอย่างผิดพลาดและมีแนวโน้มที่จะสงสัยว่ามีการโจมตี XSSมากขึ้น

กล่าวอีกนัยหนึ่ง: เมื่อคุณตรวจสอบและหลบหนีคดีที่มีปัญหามากกว่านี้แล้วก็แทบไม่มีเหตุผลที่จะปล่อยให้รูปแบบสแตนด์อโลนที่ไม่แตกหัก แต่ยังคงค่อนข้างคาว


2
ฉันไม่ได้ลงคะแนน แต่ถ้าฉันต้องเดาฉันจะบอกว่าคุณถูกโหวตเพราะคำตอบของคุณ (ในขณะที่ฉลาด) เป็นคำถามที่ไม่ตรงกันเล็กน้อย เขาไม่ได้ถามเกี่ยวกับการหลีกเลี่ยงการป้อนข้อมูลของผู้ใช้ เขาสามารถควบคุมตัวละครได้และถามว่า "ถ้าฉันทำในสิ่งที่ฉันต้องการมันเป็นสิ่งสำคัญหรือไม่ที่จะทำตามสเป็คภาษาของจดหมาย?" คือเขารู้ว่ามี & เพราะเขาใส่เข้าไป
แมตต์

@ แมท: ฉันเห็นและนั่นจะเป็นเหตุผล ฉันแค่สมมติว่าไม่มีใครเขียนหน้า HTML แบบคงที่อีกต่อไปแล้วและเนื้อหาทั้งหมดนั้นค่อนข้างมีความเคลื่อนไหวค่อนข้างน้อย (โดยทั่วไปจะขึ้นอยู่กับเนื้อหาฐานข้อมูลบางส่วน) บางทีข้อสันนิษฐานนั้นน่าจะชัดเจน
โจอาคิมซาวเออร์

-1

ไม่แน่ใจว่าสิ่งนี้จะเป็นประโยชน์กับทุกคนหรือไม่ ... ฉันกำลังต่อสู้กับมันอยู่ครู่หนึ่ง ... นี่คือ regex อันรุ่งโรจน์ที่คุณสามารถใช้เพื่อแก้ไขลิงก์, javascript, เนื้อหาทั้งหมดของคุณ ฉันต้องจัดการกับเนื้อหาดั้งเดิมที่ไม่มีใครต้องการแก้ไข

เพิ่มสิ่งนี้ในการแทนที่ Render ของคุณในหน้าต้นแบบหรือการควบคุมของคุณ:

โปรดอย่าโยนฉันใส่ผิดที่:

// remove the & from href="blaw?a=b&b=c" and replace with &amp; 
//in urls - this corrects any unencoded & not just those in URL's
// this match will also ignore any matches it finds within <script> blocks AND
// it will also ignore the matches where the link includes a javascript command like
// <a href="javascript:alert{'& & &'}">blaw</a>
html = Regex.Replace(html, "&(?!(?<=(?<outerquote>[\"'])javascript:(?>(?!\\k<outerquote>|[>]).)*)\\k<outerquote>?)(?!(?:[a-zA-Z][a-zA-Z0-9]*|#\\d+);)(?!(?>(?:(?!<script|\\/script>).)*)\\/script>)", "&amp;", RegexOptions.Singleline | RegexOptions.IgnoreCase);

-1

ลิงค์มีตัวอย่างที่ดีเมื่อไรและทำไมคุณต้องหลบ&ไป&amp;

https://jsfiddle.net/vh2h7usk/1/

ที่น่าสนใจคือฉันต้องหนีจากตัวละครเพื่อที่จะนำเสนอมันอย่างถูกต้องในคำตอบของฉันที่นี่ หากฉันต้องใช้ตัวเลือกตัวอย่างโค้ดในตัว (จากแผงคำตอบ) ฉันสามารถพิมพ์&amp;และปรากฏตามที่ควร แต่ถ้าฉันต้องใช้<code></code>องค์ประกอบด้วยตนเองฉันก็ต้องหลบหนีเพื่อที่จะแสดงมันอย่างถูกต้อง :)

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