Tôi có nên thoát ký tự Apostrophe (') bằng thực thể HTML (& # 39;) không?


38

Những ký tự nào cần được thoát với các thực thể HTML của chúng. Ví dụ, &được thoát với &.

Có nên 'trốn thoát với '?

Câu trả lời:


41

Tôi không có đặc quyền nhận xét, hoặc tôi sẽ để lại nhận xét này như một nhận xét về câu trả lời trước đó.

KHÔNG, tôi nhắc lại, KHÔNG thoát khỏi dấu nháy đơn trong HTML bằng cách sử dụng

'

Đây không phải là một tham chiếu thực thể ký tự HTML hợp lệ. Nó là một tham chiếu thực thể ký tự XML. Mặc dù Firefox và Chrome, ít nhất, sẽ hiển thị ở trên dưới dạng dấu nháy đơn trong tài liệu HTML, Internet Explorer sẽ không. Và nó đang theo tiêu chuẩn khi nó từ chối làm như vậy.

Bạn có thể thoát khỏi dấu nháy đơn trong HTML bằng cách sử dụng

'

Nhưng tôi không tin rằng, nói chung, là cần thiết.

http://fishbowl.pastiche.org/2003/07/01/the_curse_of_apos/

http://en.wikipedia.org/wiki/List_of_XML_andTube_character_entity_Vferences


Tôi nhận ra điều này sẽ đúng khi điều này được đăng, tuy nhiên nhìn vào bài viết Wikipedia nó xuất hiện &aposbây giờ là hợp lệ của HTML5. Điều đó có nghĩa là nếu bạn phải hỗ trợ các trình duyệt cũ hoặc viết email HTML cho Outlook thì tốt nhất bạn nên tuân thủ 'nếu bạn thấy cần phải thoát khỏi ký tự.
tomhughes

24

Tôi không đồng ý với Nate. Tốt nhất bạn nên sử dụng càng ít thoát càng tốt và sử dụng UTF-8 để thể hiện các ký tự nguyên bản. Để làm điều này, bạn cần một trình soạn thảo có thể xử lý UTF-8 cũng như khai báo bộ ký tự chính xác, chẳng hạn như:

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />

Tuy nhiên, bạn nên tạo thói quen thoát khỏi các ký tự có ý nghĩa đặc biệt trong (X) HTML, cụ thể là:

< &lt;
> &gt;
" &quot;
& &amp;
' &#39;

Điều này sẽ đảm bảo bạn không vô tình viết đánh dấu khi bạn muốn viết các ký tự này. Điều này đặc biệt quan trọng đối với đầu vào của người dùng, để duy trì bảo mật. Nó ít rõ ràng hơn, nhưng nó thực sự quan trọng để trốn thoát ". Nếu một chuỗi bao giờ kết thúc trong một thuộc tính HTML ( title="something"v.v.), người dùng có thể kết thúc thuộc tính đó và chèn đánh dấu của riêng họ. Hãy tưởng tượng điều gì xảy ra nếu người dùng nhập " onclick="alert('hello');và bạn chèn nó vàotitle="..."

Nếu bạn đang sử dụng PHP, bạn có thể sử dụng htmlspecialcharshàm để làm điều này. Các ngôn ngữ khác có thể có chức năng tương tự khác.

Cập nhật: Tôi đứng sửa về vấn đề apos. Chết tiệt IE pesky.


Bây giờ tôi đã có hai câu trả lời trái ngược nhau. Một người khuyên bạn nên trốn thoát 'còn người kia thì không. Tôi nên tin cái gì?
Tom

7
Nói ngắn gọn. Bạn có thể hoặc không thể thoát khỏi nó theo ý của bạn. Nếu bạn làm, sử dụng &#39;không &apos;. Nếu vì bất kỳ lý do gì, bạn sử dụng các trích dẫn đơn cho một thuộc tính HTML như title='something'bạn rõ ràng phải thoát khỏi bất kỳ dấu ngoặc đơn nào bên trong giá trị thuộc tính đó.
nitro2k01

đoạn thứ hai của bạn là điều quan trọng đối với tôi, OCD của tôi đã phát triển quá mức khi tôi thấy các đoạn văn bản màu đỏ trong cam kết git của tôi do các dấu nháy đơn không được giải thích imgur.com/a/LN0Pu89
eballeste

6

Nó phụ thuộc vào trường hợp sử dụng của bạn, nhưng có lẽ chúng ta không nên khuyến khích sử dụng 'ngôn ngữ tự nhiên nói chung, vì vậy vấn đề không nên phát sinh trừ khi bạn có mã máy tính trong XML.

Khi chúng tôi có các chuỗi dịch, chúng tôi thấy rằng một số dịch giả thay thế các trích dẫn đóng bằng các trích dẫn xoăn unicode, nhưng để lại các trích dẫn thẳng như các trích dẫn mở đầu, khiến chúng mất cân bằng về mặt thị giác và trông không chuyên nghiệp.

Các ký tự unicode nên thay thế 'nếu có thể, nhiều nên thay thế ". Điều này rất hữu ích vì máy tính không nhận ra dấu chấm câu là đặc biệt. (Mặc dù tôi rất vui khi thấy Stack Overflow / Chrome coi ' don’t' là một lỗi chính tả, trong khi nó hài lòng với ' don't'.)

Nó không giúp chúng ta có những ký tự '"nhân vật rất hấp dẫn ngay trên bàn phím.


1

Vì vậy, hãy xem liệu StackExchange có mã hóa dấu nháy đơn bằng cách sử dụng thực thể HTML không.

Dưới đây là một số ví dụ từ mã nguồn của trang này.

(1) Tiêu đề câu hỏi: Được mã hóa.

Should I escape the Apostrophe ( &#39; ) character with its HTML entity (&amp;#39;)?

(2) đã trả lời: Không được mã hóa.

But I don't believe it is, in general, necessary.

(3) Nhận xét của Tom về câu trả lời của nitro2k01: Được mã hóa.

I&#39;ve got two contradicting answers now. One recommends escaping &#39; and the other does not. What should I believe?

Vì vậy, nó đi cả hai cách.

Tuy nhiên, mã nguồn của trang này không bao giờ sử dụng &apos;. Tất cả các mã hóa có dạng &#39;. Điều này phù hợp với nitro2k01 và đã đưa ra lời khuyên không nên sử dụng &apos;.


1
Mặc dù trong cả 3 trường hợp, nó không cần phải được mã hóa HTML.
MrWhite

1

Chuỗi đó đi đâu?

Câu trả lời của bạn phụ thuộc vào ngữ cảnh:

  1. Nếu bạn đang viết một đoạn bằng HTML với dữ liệu này, nó có thể đủ để thoát <,> và &:

    <p>{string}</p>

  2. Tuy nhiên, nếu bạn đang viết vào một thuộc tính HTML, như,

    <a href='/some/path/{string}'>...</a>

Sau đó, bạn nên hoàn toàn thoát khỏi dấu nháy đơn. Đây có thể là một vectơ tấn công nếu kẻ tấn công đưa nó vào string:

string = "' onmouseover='alert(\"nasty script here!\")' data-ignore='"
  1. Điều tương tự đi cho dấu ngoặc kép. Tôi thậm chí đã đọc rằng backtick `dễ bị tổn thương, vì nó cũng có thể được sử dụng cho các thuộc tính HTML. Nếu bạn không có tập lệnh kiểm tra cú pháp HTML tự động như một phần của thói quen triển khai, hãy giả sử rằng bất kỳ trong số ba trong số này có thể được sử dụng và phải được thoát cho các thuộc tính HTML.

  2. Ở các thuộc tính cực đoan, thậm chí không được trích dẫn là hợp lệ, do đó, ký tự khoảng trắng cũng sẽ cần thoát. Và !, @, $, %, (, ), =, +, {, }, [, và ], tất cả đều có thể thoát ra khỏi một thuộc tính và cho phép chèn một hình mới.

Những gì tôi làm

Để thực hiện thoát trong JavaScript, tôi sử dụng JQuery $(element).text(string)hoặc $(element).attr(attrname, string)để thực hiện thoát cho tôi. Hãy cẩn thận $(element).html(unsafe), không thoát khỏi HTML của bạn!

Về mã phía máy chủ, tôi phải đánh giá cẩn thận rủi ro cho từng trường hợp và đọc kỹ tài liệu. Điều này sẽ phụ thuộc vào ngôn ngữ và thư viện cụ thể mà bạn đang sử dụng, như Rails, Django, PHP thô, Drupal, v.v.

Cơ sở dữ liệu

Nếu bạn đang cân nhắc việc ngăn chặn vấn đề càng sớm càng tốt, trước khi nó vào cơ sở dữ liệu của bạn, hãy giữ ngựa của bạn. HTML thoát khỏi văn bản được lưu trữ trong DB của bạn có thể đưa bạn vào một chuyến đi địa ngục. Điều gì sẽ xảy ra nếu sau này bạn muốn cho phép các thẻ HTML nhất định, nhưng không phải các thẻ khác, như chữ nghiêng, đậm, màu sắc và bảng? Điều gì nếu bạn bỏ lỡ một cái gì đó trong đầu tiên vượt qua bạn, nhưng escaper của bạn đã trốn thoát &như &amp;"như &quot;? Nó sẽ biến những người thành &amp;amp;&amp;quot;?

Cách tiếp cận của tôi là chỉ thực hiện thoát SQL cho cơ sở dữ liệu, nhưng để lại tất cả các ký tự đặc biệt HTML để xử lý sau. Bằng cách này, tôi có thể gỡ lỗi và tinh chỉnh HTML thoát ra dễ dàng. Xin lưu ý, điều đó cũng có nghĩa là tôi không thể tin tưởng vào các bảng SQL của riêng mình nếu chúng có các chuỗi do người dùng cung cấp.

Đạo đức

Không bao giờ tin tưởng đầu vào do người dùng kiểm soát và luôn trích dẫn các thuộc tính HTML của bạn!

Dựa trên: Có nhiều thứ để HTML thoát hơn &, <,> và " của Ryan Grove


-1

Nếu dấu nháy đơn của bạn thuộc về nội dung, hãy thoát khỏi nó. Bất kỳ ký tự nội dung nào khác có thể bị nhầm lẫn với mã, hãy thoát nó.


"Nếu dấu nháy đơn của bạn thuộc về nội dung, hãy thoát khỏi nó." - Điều này dường như không chính xác (như thể thiếu từ "không"). Nếu dấu nháy đơn là một phần của nội dung thì đừng thoát khỏi nó - không cần thiết phải có.
MrWhite

-4

Cách dễ nhất để thực hiện công việc mà không sử dụng thực thể thực tế là sử dụng các hàm htmlentities()hoặc htmlspecialchars()hàm của PHP :

$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>";

4
Đây co phải la một tro đua?
Su '

@Su 'Tôi sợ đó không phải là ...
William Edwards
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.