Làm cách nào để thoát dấu ngoặc kép bên trong các thuộc tính HTML?


267

Tôi có một trang thả xuống trên một trang web bị phá vỡ khi chuỗi giá trị chứa một trích dẫn.

Giá trị là "asd, nhưng trong DOM nó luôn xuất hiện dưới dạng một chuỗi rỗng.

Tôi đã thử mọi cách tôi biết để thoát chuỗi đúng, nhưng không có kết quả.

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

Làm cách nào để hiển thị thông tin này trên trang để thông báo gửi lại chứa giá trị chính xác?


Làm thế nào bạn tạo ra trang?
SLaks

1
Điều gì nếu bạn sử dụng dấu ngoặc đơn? <tùy chọn giá trị = '"asd'> thử nghiệm </ tùy chọn>
Wim ten Brink

5
Tôi phải chỉ ra không có câu trả lời nào trong số những câu trả lời này nói cách thoát chuỗi đúng để sử dụng bên trong các thuộc tính html
recbot 6/213

4
@reconbot Điều đó phụ thuộc vào cách HTML được tạo. Câu hỏi là về trích dẫn, vì vậy về mặt kỹ thuật, câu trả lời được chấp nhận trả lời câu hỏi. Về cách thoát chuỗi đúng, tôi không có một liên kết tiện dụng cho trường hợp chung, nhưng trong PHP bạn sẽ sử dụng htmlentities.
Matt Browne

Câu trả lời:


343

&quot; là cách chính xác, thứ ba trong các bài kiểm tra của bạn:

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

Bạn có thể thấy điều này hoạt động dưới đây, hoặc trên 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>

Ngoài ra, bạn có thể phân định giá trị thuộc tính bằng dấu ngoặc đơn:

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

17
Tùy chọn thứ tư của OP, & # 34;, cũng là một cách hợp lệ để thoát dấu ngoặc kép. Có một lợi ích khi sử dụng các thực thể html số trên các thực thể được đặt tên, trong đó các thực thể được đặt tên đó không bao gồm tất cả các ký tự, trong khi các thực thể số thì có. Danh sách HTML4 đầy đủ có tại w3.org/TR/html4/sgml/entities.html .
ATK

38
@atk: có, &quot;ánh xạ tới cùng một ký tự &#34;, nhưng không có lợi ích gì khi sử dụng tùy chọn số ở đây vì &quot;là một thực thể có tên được xác định. &quot;cũng dễ nhớ hơn
Andy E

6
Tôi đồng ý. Trong trường hợp cụ thể này, việc sử dụng & quot;. Tôi dự định chỉ để chỉ ra trường hợp chung.
ATK

4
@SIDU: đổi nó thành &amp;quot;a(thay thế &bằng &amp;)
Andy E

4
^ vòng lặp vô hạn
Omar Meky

16

Nếu bạn đang sử dụng PHP, hãy thử gọi htmlentitieshoặc htmlspecialcharschức năng.


2
chỉ sử dụng chúng không thể là đủ, cố gắng <option value='<?php echo htmlentities("' onmouseover='alert(123);' foo='"); ?>' />- Hãy chắc chắn rằng bạn sử dụng nó với ENT_QUOTES, đây là an toàn: <option value='<?php echo htmlentities("' onmouseover='alert(123);' foo='", ENT_QUOTES); ?>' /> , nhưng ngoài ENT_QUOTES bạn cũng nên thêm ENT_SUBSTITUTE và ENT_DISALLOWED, cá nhân tôi đã sử dụng wrapper này trong nhiều năm:function hhb_tohtml(string $str):string { return htmlentities($str, ENT_QUOTES | ENT_HTML401 | ENT_SUBSTITUTE | ENT_DISALLOWED, 'UTF-8', true); }
hanshenrik

12

Theo cú pháp HTML và thậm chí HTML5 , sau đây là tất cả các tùy chọn hợp lệ:

<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>

Lưu ý rằng nếu bạn đang sử dụng cú pháp XML, các trích dẫn (một hoặc hai) là bắt buộc.

Đây là một jsfiddle hiển thị tất cả các hoạt động ở trên .


7

Một tùy chọn khác là thay thế dấu ngoặc kép bằng dấu ngoặc đơn nếu bạn không quan tâm nó là gì. Nhưng tôi không đề cập đến điều này:

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

Tôi đề cập đến điều này:

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

Trong trường hợp của tôi, tôi đã sử dụng giải pháp này.


9
Nhưng nếu giá trị chứa dấu ngoặc đơn & kép, điều này sẽ thất bại
Raptor

@Raptor Tôi đã nói nếu giá trị chứa dấu ngoặc kép, hãy chuyển đổi chúng thành dấu ngoặc đơn. Nếu giá trị chứa dấu ngoặc đơn, thì nó sẽ không có vấn đề gì.
csonuryilmaz


0

Bạn thực sự chỉ nên cho phép dữ liệu không đáng tin cậy vào danh sách trắng các thuộc tính tốt như: align, alink, alt, bgcolor, Border, cellpadding, cellspaces, class, color, cols, colspan, coords, dir, face, height, hspace, ismap, lang , marginheight, lề băng thông, nhiều, nohref, noresize, noshade, nowrap, ref, rel, rev, rows, rowspan, scrolling, hình dạng, span, tóm tắt, tabindex, title, usemap, valign, value, vlink, vspace, width

Bạn thực sự muốn giữ dữ liệu không đáng tin cậy khỏi các trình xử lý javascript cũng như các thuộc tính id hoặc tên (chúng có thể ghi đè các phần tử khác trong DOM).

Ngoài ra, nếu bạn đang đặt dữ liệu không đáng tin cậy vào thuộc tính SRC hoặc HREF, thì đó thực sự là một URL không đáng tin cậy để bạn xác thực URL, đảm bảo KHÔNG phải là javascript: URL và sau đó mã hóa thực thể HTML.

Thông tin chi tiết về tất cả những thứ ở đây: https://www.owasp.org/index.php/Aopedged_XSS_Prevent_Cheat_Sheet


3
Tôi biết điều này là muộn, nhưng hầu hết tất cả các thuộc tính đó đều không được chấp nhận trong HTML4.01 và bị xóa trong 5. Dù sao thì nó cũng không quan trọng, vì có nhiều cách tốt hơn để bảo vệ chính bạn, chỉ cần chỉ ra nó.
phân tích

1
Câu hỏi là hỏi về dữ liệu với các ký tự trích dẫn trong đó, không phải về dữ liệu không đáng tin cậy.
Quentin

-3

Không có cách nào để thoát dấu ngoặc kép trong giá trị của văn bản đầu vào ... nhưng bạn có thể sử dụng javascript (hoặc jquery):

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

1
Câu nói của bạn "Không có cách nào để thoát dấu ngoặc kép trong giá trị của văn bản đầu vào" là hoàn toàn sai. Xem câu trả lời được chấp nhận từ năm 2010 đã nhận được 276 phiếu bầu.
Quentin

Thoát khỏi tôi Quentin, nhưng R ANNG TRẢ LỜI nói rằng đó không phải là cách để làm điều đó. Nó nói rằng bạn có thể chèn một trích dẫn kép được mã hóa html hoặc bạn có thể sử dụng trích dẫn đơn giản để phân tách trích dẫn kép, nhưng không có cách nào để chèn một trích dẫn kép vào giá trị được xác định bằng trích dẫn kép. Nó đang đề xuất một giải pháp thay thế cho những điều không thể, giống như những gì tôi làm
Miguel

Cách để chèn một trích dẫn kép vào một giá trị được phân định bằng một trích dẫn kép là sử dụng mã hóa html như bạn vừa nói.
Quentin

(Xin chào Quentin ... chúng tôi đang trực tuyến) Tôi chỉ nói rằng giá trị của chuỗi đó không phải là một trích dẫn kép, là một & quot;, điều đó không giống nhau.
Miguel

2
Nếu bạn chèn một & quot; trong một giá trị và bạn gửi nó, trong máy chủ, bạn nhận được 6 ký tự, từ & đến;. Bạn không nhận được một trích dẫn kép. Nó không giống nhau và nó không hoạt động đối với tôi
Miguel
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.