ควรใช้อักขระใดกับหน่วยงาน HTML ตัวอย่างเช่นมีการหนีไปกับ&
&
ควร'
หนีด้วย'
ไหม?
ควรใช้อักขระใดกับหน่วยงาน HTML ตัวอย่างเช่นมีการหนีไปกับ&
&
ควร'
หนีด้วย'
ไหม?
คำตอบ:
ฉันไม่มีสิทธิ์แสดงความคิดเห็นหรือฉันจะทิ้งสิ่งนี้ไว้เป็นความคิดเห็นในคำตอบก่อนหน้า
ไม่ฉันขอย้ำอย่าใช้เครื่องหมายอัญประกาศเดี่ยวใน HTML โดยใช้
'
นี่ไม่ใช่การอ้างอิงเอนทิตีอักขระ HTML ที่ถูกต้อง มันเป็นการอ้างอิงเอนทิตีอักขระ XML ในขณะที่ Firefox และ Chrome อย่างน้อยที่สุดจะแสดงข้อความข้างต้นเป็นเครื่องหมายอัญประกาศเดี่ยวในเอกสาร HTML แต่ Internet Explorer จะไม่แสดง และเป็นไปตามมาตรฐานเมื่อปฏิเสธที่จะทำเช่นนั้น
คุณสามารถใช้เครื่องหมายอัญประกาศเดี่ยวใน HTML ได้
'
แต่ฉันไม่เชื่อว่าโดยทั่วไปจำเป็น
http://fishbowl.pastiche.org/2003/07/01/the_curse_of_apos/
http://en.wikipedia.org/wiki/List_of_XML_and_HTML_character_entity_references
ฉันไม่เห็นด้วยกับเนท คุณควรใช้การหลบหนีให้น้อยที่สุดเท่าที่จะทำได้และใช้ UTF-8 เพื่อแสดงตัวละครโดยกำเนิด ในการดำเนินการนี้คุณต้องมีเครื่องมือแก้ไขที่สามารถจัดการ UTF-8 ได้เช่นเดียวกับการประกาศชุดอักขระที่ถูกต้องเช่น:
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
อย่างไรก็ตามคุณควรทำให้เป็นนิสัยที่จะหลีกเลี่ยงตัวละครที่มีความหมายพิเศษใน (X) HTML กล่าวคือ:
< <
> >
" "
& &
' '
สิ่งนี้จะทำให้แน่ใจว่าคุณไม่ได้เขียนมาร์กอัปโดยไม่ตั้งใจเมื่อคุณต้องการเขียนอักขระเหล่านี้ สิ่งนี้สำคัญอย่างยิ่งสำหรับการป้อนข้อมูลของผู้ใช้เพื่อรักษาความปลอดภัย มันเห็นได้ชัดน้อยลง "
แต่มันเป็นสิ่งสำคัญที่จะหลบหนีจริง หากสตริงสิ้นสุดลงในแอตทริบิวต์ HTML ( title="something"
ฯลฯ ) ผู้ใช้สามารถสิ้นสุดคุณสมบัติและแทรกมาร์กอัปของตนเอง ลองนึกภาพว่าจะเกิดอะไรขึ้นหากผู้ใช้ป้อน" onclick="alert('hello');
และคุณใส่สิ่งนั้นลงไปtitle="..."
หากคุณใช้ PHP คุณสามารถใช้htmlspecialchars
ฟังก์ชั่นนี้ได้ ภาษาอื่น ๆ อาจมีฟังก์ชั่นอื่นที่คล้ายคลึงกัน
อัปเดต:ฉันได้รับการแก้ไขในเรื่อง apos ไอ้เวรที่น่ารำคาญ
'
'
หากไม่ว่าด้วยเหตุผลใดก็ตามคุณใช้เครื่องหมายคำพูดเดี่ยวสำหรับแอตทริบิวต์ HTML อย่างtitle='something'
ชัดเจนคุณจะต้องหลีกเลี่ยงคำพูดใด ๆ ที่อยู่ภายในค่าแอตทริบิวต์นั้น
มันขึ้นอยู่กับกรณีการใช้งานของคุณ แต่เราอาจไม่แนะนำให้ใช้'
ในภาษาธรรมชาติโดยทั่วไปดังนั้นปัญหาไม่ควรเกิดขึ้นหากคุณไม่มีรหัสคอมพิวเตอร์ใน XML ของคุณ
ที่เรามีการแปลสตริงเราพบว่านักแปลบางคนแทนที่อัญประกาศปิดด้วยอัญประกาศโค้ง Unicode แต่ปล่อยให้คำพูดตรงเป็นคำพูดเปิดให้พวกเขาไม่สมดุลสายตาและมองไม่เป็นมืออาชีพ
อักขระ Unicode ‘
และ’
ควรเปลี่ยน'
ที่เป็นไปได้มากที่สุดเท่าที่“
และควรเปลี่ยน”
"
สิ่งนี้มีประโยชน์เพราะคอมพิวเตอร์ไม่รู้จักเครื่องหมายวรรคตอนเป็นพิเศษ (แม้ว่าฉันจะขบขันที่จะเห็นว่า Stack Overflow / Chrome ถือว่า ' don’t
' เป็นข้อผิดพลาดในการสะกดคำ แต่ในขณะที่พอใจกับ ' don't
')
มันไม่ได้ช่วยให้เรามีสิ่งที่น่าหลงใหล'
และมี"
ตัวละครอยู่บนคีย์บอร์ด
ดังนั้นเรามาดูว่า StackExchange เข้ารหัส apostrophe โดยใช้เอนทิตี HTML หรือไม่
นี่คือตัวอย่างจากซอร์สโค้ดของหน้านี้
(1) ชื่อคำถาม: เข้ารหัส
Should I escape the Apostrophe ( ' ) character with its HTML entity (&#39;)?
(2) คำตอบของ drew: ไม่ได้เข้ารหัส
But I don't believe it is, in general, necessary.
(3) ความเห็นของทอมต่อคำตอบของ nitro2k01: เข้ารหัส
I've got two contradicting answers now. One recommends escaping ' and the other does not. What should I believe?
ดังนั้นมันจึงไปได้ทั้งสองทาง
'
อย่างไรก็ตามซอร์สโค้ดของหน้านี้ไม่เคยใช้ '
ทั้งหมดการเข้ารหัสที่มีรูปแบบ ซึ่งสอดคล้องกับ nitro2k01 และคำแนะนำของ Drew '
ไม่ได้ที่จะใช้งาน
คำตอบของคุณขึ้นอยู่กับบริบท:
หากคุณกำลังเขียนย่อหน้าใน HTML ด้วยข้อมูลนี้มันอาจจะเพียงพอที่จะหลบหนี <,> และ &:
<p>{string}</p>
หากคุณกำลังเขียนถึงคุณลักษณะ HTML เช่น
<a href='/some/path/{string}'>...</a>
จากนั้นคุณก็ควรหลีกเลี่ยงอะพอสโทรฟี นี่อาจเป็นเวกเตอร์การโจมตีหากผู้โจมตีใส่สิ่งนี้ไว้ในstring
:
string = "' onmouseover='alert(\"nasty script here!\")' data-ignore='"
สิ่งเดียวกันสำหรับคำพูดสองครั้ง ฉันได้อ่านด้วยว่า backtick `นั้นมีความเสี่ยงเนื่องจากสามารถใช้สำหรับแอตทริบิวต์ HTML ได้เช่นกัน หากคุณไม่มีสคริปต์ตรวจสอบไวยากรณ์ HTML อัตโนมัติซึ่งเป็นส่วนหนึ่งของรูทีนการปรับใช้ของคุณให้สมมติว่าหนึ่งในสามเหล่านี้สามารถใช้งานได้และจะต้องหลีกเลี่ยงสำหรับแอตทริบิวต์ HTML
ที่สุดขีดแม้แอตทริบิวต์ที่ไม่มีเครื่องหมายจะถูกต้องดังนั้นอักขระเว้นวรรคก็จะต้องหลบหนี และ!
, @
, $
, %
, (
, )
, =
, +
, {
, }
, [
และ]
ซึ่งทั้งหมดนี้สามารถแยกออกจากแอตทริบิวต์และอนุญาตให้ใส่ใหม่
ในการหลบหนีใน JavaScript ฉันใช้ JQuery $(element).text(string)
หรือ$(element).attr(attrname, string)
เพื่อหลบหนีสำหรับฉัน ระวังให้ดีด้วย$(element).html(unsafe)
ซึ่งจะไม่หนี HTML ของคุณ!
ในรหัสฝั่งเซิร์ฟเวอร์ฉันต้องประเมินความเสี่ยงอย่างรอบคอบสำหรับแต่ละกรณีและอ่านเอกสารอย่างละเอียด สิ่งนี้จะขึ้นอยู่กับภาษาและไลบรารีที่คุณใช้เช่น Rails, Django, PHP ดิบ, Drupal เป็นต้น
หากคุณกำลังพิจารณาที่จะหยุดปัญหาให้เร็วที่สุดก่อนที่มันจะเข้าไปในฐานข้อมูลของคุณให้จับม้าไว้ HTML ที่หนีออกมาจากข้อความที่เก็บไว้ในฐานข้อมูลของคุณสามารถนำคุณไปสู่ความสนุกสนาน ถ้าคุณต้องการอนุญาตแท็ก HTML บางอันในภายหลัง แต่ไม่ใช่แท็กอื่น ๆ เช่นตัวเอียงตัวหนาสีและตาราง เกิดอะไรขึ้นถ้าคุณพลาดอะไรบางอย่างในครั้งแรกผ่านของคุณ แต่คุณ Escaper หนีแล้ว&
เป็น&
และ"
เป็น"
? มันจะเปลี่ยนสิ่งเหล่านั้นเป็น&amp;
และ&quot;
?
วิธีการของฉันคือการใช้ SQL escaping สำหรับฐานข้อมูล แต่ปล่อยให้ตัวอักษรพิเศษ HTML ทั้งหมดสำหรับการประมวลผลในภายหลัง ด้วยวิธีนี้ฉันสามารถดีบักและปรับแต่ง HTML ของฉันได้อย่างง่ายดาย ใจนั่นก็หมายความว่าฉันไม่สามารถเชื่อถือตาราง SQL ของตัวเองถ้าพวกเขามีสตริงที่ผู้ใช้ให้
อย่าไว้ใจอินพุตที่ผู้ใช้ควบคุมและให้อ้างคุณลักษณะ HTML ของคุณเสมอ!
จาก: ยังมีอีกมากมายที่จะหลีกเลี่ยง HTML มากกว่า &, <,> และ "โดย Ryan Grove
หากเครื่องหมายอัญประกาศเดี่ยวของคุณเป็นเนื้อหาให้หนีไป อักขระเนื้อหาอื่นใดที่อาจสับสนกับรหัสให้หลีกเลี่ยง
วิธีที่ง่ายที่สุดในการทำงานโดยไม่ต้องใช้เอนทิตีที่แท้จริงคือการใช้ PHP htmlentities()
หรือhtmlspecialchars()
ฟังก์ชั่น:
$val = htmlspecialchars("Don't", ENT_QUOTES, 'UTF-8');
if($_POST){
$val = htmlspecialchars(trim($_POST['val']), ENT_QUOTES, 'UTF-8');
}
echo "<!DOCTYPE html PUBLIC '-//W3C//DTD XHTML 1.0 Strict//EN' 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd'>
<html xmlns='http://www.w3.org/1999/xhtml' xml:lang='en' lang='en' class='njs'>
<head>
<meta http-equiv='Content-type' content='text/html;charset=utf-8' />
<title>Special Characters</title>
<style type='text/css'>
@import 'special.css';
</style>
</head>
<body>
<form method='post' action='' id='fm' name='fm'>
<input type='text' value='$val' name='val' id='val' />
<input type='submit' value='submit' name='sub' id='sub' />
</form>
</body>
<script type='text/javascript' src='special.js'></script>
</html>";
&apos
ซึ่งตอนนี้ดูเหมือนว่าจะถูกต้องของ HTML5 ดังที่กล่าวไว้ถ้าคุณต้องสนับสนุนเบราว์เซอร์รุ่นเก่าหรือเขียนอีเมล HTML สำหรับ Outlook คุณจะต้องดำเนินการให้ดีที่สุด'
หากคุณเห็นว่าจำเป็นต้องหลีกเลี่ยงอักขระ