2010-01-13 9 views
5

Vấn đề của tôi là như sau. Tôi có một trang XHTML 1.1 có một trường biểu mẫu và trường nhập. Một trong các trường nhập chứa giá trị là một URI. URI này chứa các cặp khóa-giá trị có dấu và (&) làm dấu phân cách đối số, sẽ được chuyển qua dưới dạng yêu cầu GET bởi ứng dụng web khác trong trình duyệt.Làm thế nào để XHTML 1.1 xác nhận một dấu và không thoát nó?

Thông thường tôi sẽ sử dụng pháp nhân & để tạo ký hiệu và để xác thực mã là XHTML 1.1. Vấn đề của tôi ở đây là ứng dụng không nhận được yêu cầu GET, vì (như mong đợi) trình duyệt không hiểu cách xử lý & trong URI. Vì vậy, câu hỏi của tôi thực sự là cách viết một ký hiệu và không sử dụng thực thể HTML, do đó trình duyệt vẫn nhận ra nó là dấu phân tách đối số và yêu cầu GET được truyền vào đúng ứng dụng web.

Tôi đã thử Hex (% 26) mã hóa dấu và nhưng trình duyệt vẫn không "dịch" nó trở lại thành một ký tự thích hợp &.

Một câu hỏi liên quan, nhưng nó không cung cấp câu trả lời chính xác cho câu hỏi Tôi hỏi:

XHTML and & (Ampersand) encoding

+2

"(như dự kiến) trình duyệt không hiểu làm thế nào để xử lý '&' trong URI" - đó là ** không ** như mong đợi, bạn không nên thấy '&' trong thanh địa chỉ trừ khi bạn đã mã hóa kép nó. –

+0

Vui lòng đọc lại câu hỏi. Các ký hiệu và là một phần của một URI chứa bên trong trường giá trị của đầu vào. Sau khi biểu mẫu được gửi, người dùng sẽ được trả về cùng một vị trí, chính xác như được viết. Điều này có nghĩa là tôi để lại các ký tự không được mã hóa nhưng không xác nhận được, hoặc tôi mã hóa chúng với vấn đề trình duyệt sẽ nhận thực thể HTML trong thanh địa chỉ và không chuyển chuỗi truy vấn đến ứng dụng tiếp theo trong tiến trình. –

+1

Trình duyệt sẽ giải mã '&' thành '&' khi chuyển đổi HTML thành DOM. Sau đó nó sẽ mã hóa '&' thành '% 26' khi xây dựng dữ liệu URL hoặc dữ liệu được mã hóa dạng x-url. Nếu nó không hoạt động, thì tôi nghi ngờ bạn đang xử lý dữ liệu không chính xác trên máy chủ. – Quentin

Trả lời

0

Tôi không thể dành nhiều thời gian hơn cho việc này.Tôi chỉ đơn giản là thay đổi các dấu phân cách lập luận cũng bao gồm dấu chấm phẩy (;) để tôi có thể sử dụng nó thay vì dấu và:

#cat .htaccess 
php_value arg_separator.input "&;" 
1

Không có cách nào để bao gồm một nhân vật dấu trong một giá trị thuộc tính mà không sử dụng một thực thể.

Không có cách nào để bao gồm ký tự và ký tự dưới dạng mã văn bản mà không sử dụng dấu thực thể hoặc CDATA (nhưng tôi đặt cược bạn đang phân phát dưới dạng văn bản/html để bạn không thể sử dụng).

Điều đó nói rằng - mọi trình duyệt không giải mã được thực thể đều bị hỏng. Không có trình duyệt chính thống nào bị lỗi. Bạn đang sử dụng trình duyệt bị che khuất và bị hỏng hoặc đang chẩn đoán sai sự cố.

+0

Bất kỳ trình duyệt chính nào (IE hoặc FF sẽ thực hiện). Trình duyệt xử lý giải mã đúng cách bên trong HTML. Tôi đang đề cập đến thực sự sử dụng thực thể HTML trong thanh địa chỉ. Hãy thử nó ... –

+2

Cũng đừng làm thế! Bạn nhập URL đơn giản vào thanh địa chỉ, không phải URL được mã hóa HTML. Điều đó giống như việc mở một tài liệu Microsoft Word trong Notepad. – Quentin

+0

Trình duyệt được chuyển hướng đến URI đó khi được nhập trực tiếp vào thanh địa chỉ, bao gồm các thực thể HTML. Đó là vấn đề của tôi. –

0

Không có mã khó biết nơi bạn đang cố giữ thông tin này, nếu bạn có thể đăng mã, chúng tôi có thể giúp bạn hiểu rõ hơn về sự cố.

Một có thể (nếu điều này là trong thực tế những gì bạn đang phải đối mặt) là để di chuyển các mục trong chuỗi truy vấn vào các yếu tố hình thức khác, chẳng hạn như:

<form action="example.com/?foo=1&bar=2> 
    <!-- ... --> 
</form> 

tới:

<form action="example.com"> 
    <input type="hidden" name="foo" value="1" /> 
    <input type="hidden" name="bar" value="2" /> 
    <!-- ... --> 
</form> 
+0

Chuỗi truy vấn không có trong hành động biểu mẫu thực tế, nhưng bên trong trường giá trị của trường nhập.Nó là một giá trị được chuyển đến một ứng dụng web, sau này trả về trình duyệt của người dùng cho cùng một URI đó (với chuỗi truy vấn trong đó). Đây là nơi nó không thành công vì trình duyệt không thể hiểu được thực thể HTML trong thanh địa chỉ. –

+0

Gotcha, xấu của tôi. Nếu đó là trường hợp bạn không thể chỉ cần thoát khỏi nó khi bạn dính nó vào trường đầu vào (có lẽ tốt nhất để làm anyway để tránh bất kỳ cuộc tấn công XSS) và sau đó un-thoát nó trước khi bạn làm phía máy chủ chuyển hướng? – mynameiscoffey

+0

Rất tiếc, chuyển hướng đến từ bên thứ 3. Vì vậy, tôi cần phải gửi URI chính xác như tôi cần nó để trở lại ... bên thứ 3 chỉ đơn giản là nhận được nó và trả về trình duyệt của người dùng với nó sau khi nó đã thực hiện công việc khác. –

1

Như được đề cập trong câu hỏi khác mà bạn đã tham chiếu, trình duyệt chuyển đổi &amp; thành & khi trang được xử lý, do đó, "&" (không phải &amp;) phải được gửi đến máy chủ trong yêu cầu GET. Có lẽ bạn đang sử dụng Ajax để thực hiện yêu cầu GET, trong trường hợp đó, bạn có thể cần phải giải mã HTML. Thực thể được yêu cầu cho XHTML - không có mã hóa thay thế, chỉ cần đảm bảo rằng nó được giải mã đúng cách.

Tham chiếu: The & changes to &amp; in a hyperlink

+0

Vấn đề là trình duyệt sẽ nhận được thực thể HTML trực tiếp vào thanh địa chỉ (như thể nó đã được nhập trực tiếp). Tôi không đề cập đến giải mã xảy ra tự động, ví dụ: nếu bạn sử dụng thực thể tương đương và ký tự bên trong một neo. –

+0

URI được đưa vào trường nhập như thế nào? Nếu giá trị là một phần của HTML, thì giá trị đó phải là tên thực thể, nếu được đặt bằng JavaScript thì không được. –

1

Các thoát & nên được chuyển đổi bởi client (trình duyệt) ở khắp mọi nơi trong tài liệu XHTML.

Vì vậy, bạn nên thoát mỗi & với &amp;