2009-03-20 32 views
9

Tôi cần đăng dữ liệu nhiều dòng thông qua trường ẩn. Dữ liệu sẽ được xem trong một vùng văn bản sau khi đăng bài. Làm thế nào tôi có thể gửi một dòng mới/vận chuyển trở lại dưới dạng html?Đăng trả lại dòng mới/vận chuyển dưới dạng giá trị trường ẩn

Tôi đã thử \ r \ n nhưng điều đó chỉ đăng tải thực tế "\ r \ n" dữ liệu

<input type="hidden" name="multiline_data" value="line one\r\nline two" /> 

Có cách nào để làm điều này?

Trả lời

5

Phụ thuộc vào bộ ký tự thực sự nhưng & # 10; phải là linefeed và & # 13; nên được vận chuyển trở lại. Bạn sẽ có thể sử dụng chúng trong thuộc tính value.

+0

Nếu một trình duyệt hỗ trợ trình hình thức, nó sẽ rất có thể cũng nhận ra rằng ' ' và ' 'là dòng mới, và nếu nó không đúng cách loại bỏ dòng mới, nó cũng sẽ loại bỏ tất cả các lần xuất hiện của' 'và' '. – 0b10011

2

Bạn không nói điều này là gì hoặc công nghệ bạn đang sử dụng, nhưng bạn cần lưu ý rằng bạn không thể tin cậy trường ẩn để duy trì giá trị = "line one line two", bởi vì một người dùng thù địch có thể giả mạo nó trước khi nó được gửi trở lại trong POST. Vì bạn đang đặt giá trị trong một văn bản <textarea> sau này, bạn chắc chắn sẽ phải chịu, ví dụ, tấn công tập lệnh chéo trang trừ khi bạn xác minh và/hoặc khử trùng nội dung trường "multiline_data" trước khi viết lại.

Khi viết giá trị vào trường bị ẩn và đọc lại, tốt hơn là chỉ giữ nó trên máy chủ, làm thuộc tính của phiên hoặc luồng trang hoặc bất kỳ môi trường nào của bạn cung cấp để làm điều này.

11

Thay vì sử dụng

<input type="hidden">

Hãy thử sử dụng

<textarea style="visibility:hidden;position:absolute;">

+0

'style =" display: none; "' có thể là succint hơn – megaflop

+0

@daiscog Các phần tử biểu mẫu được đặt thành 'display: none' [không phải lúc nào cũng được gửi] (http://stackoverflow.com/a/8318442/526741). Tôi không chắc chắn trình duyệt nào làm và không gửi các trường 'display: none', nhưng theo các chú thích trong câu trả lời đó, IE8 không * không *. – 0b10011

9

Trong khi dòng mới (carriage return & Dòng Feed) được về mặt kỹ thuật cho phép trong < input> 's ẩn nhà nước , chúng phải được thoát để tương thích với các trình duyệt cũ hơn. Bạn có thể thực hiện việc này bằng cách thay thế tất cả các Chuyển hàng (\u000D hoặc \r) và tất cả Nguồn cấp dữ liệu (\u000A hoặc \n) bằng các chuỗi độc quyền được ứng dụng của bạn nhận dạng là Chuyển hàng hoặc Đường mới (và cũng thoát, nếu có trong bản gốc) chuỗi).

Đơn giản chỉ cần các tổ chức nhân vật không làm việc ở đây, do không phù hợp trình duyệt có thể biết &#10;&#13; là dòng mới và tách chúng khỏi các giá trị.

Ví dụ

Ví dụ, trong PHP, nếu bạn đã echo giá trị truyền cho một textarea, bạn sẽ bao gồm các dòng mới (và chuỗi không thoát).

< textarea> Một số văn bản với một \ bao gồm
và một dòng mới với \ r \ n là giá trị nộp </textarea>

Tuy nhiên, trong PHP, nếu bạn đã echo sự giá trị cho thuộc tính giá trị của thẻ < đầu vào, bạn sẽ thoát khỏi các dòng mới bằng các chuỗi độc quyền của mình (ví dụ: \r\n) và thoát khỏi bất kỳ trường hợp nào của chuỗi độc quyền của bạn trong giá trị đã gửi.

< input type = giá trị "ẩn" = "Một số văn bản với một \\ bao gồm \ r \ nand một dòng mới \\ r \\ n là giá trị nộp">

Sau đó, trước khi bằng cách sử dụng giá trị ở nơi khác (chèn vào cơ sở dữ liệu, gửi email, v.v.), hãy đảm bảo không xem trước giá trị đã gửi, nếu cần.

tái bảo đảm

Như yên tâm hơn nữa, tôi hỏi những WHATWG, và Ian Hickson, biên tập viên của hiện spec HTML, trả lời:

bfrohs Câu hỏi loại về < input = ẩn> - Nguồn cấp dữ liệu đường truyền và Trả về vận chuyển có được phép trong giá trị không? Chúng đặc biệt không được phép trong trạng thái Văn bản và trạng thái Tìm kiếm, nhưng không có đề cập nào được thực hiện cho trạng thái Ẩn. Và, nếu không, có một giải pháp HTML có thể chấp nhận được để lưu trữ dữ liệu biểu mẫu từ một vùng văn bản không?

Hixie vâng, họ được phép // iirc // vì lý do di sản bạn có thể muốn thoát khỏi chúng mặc dù như một số trình duyệt bình thường hóa chúng đi // i quên nếu chúng ta cố định đó hay không // trong spec

Source

Các vấn đề liên quan