2013-04-30 25 views
89

Tôi tò mò về mục đích ban đầu của thẻ <input type="hidden">.Mục đích ban đầu của <input type = "hidden">?

Ngày nay nó thường được sử dụng cùng với JavaScript để lưu trữ các biến trong đó được gửi đến máy chủ và những thứ tương tự.

Do đó, <input type="hidden"> tồn trước Javascript, vì vậy mục đích ban đầu của nó là gì? Tôi chỉ có thể tưởng tượng việc gửi một giá trị từ máy chủ đến máy khách (không thay đổi) được gửi trở lại để duy trì một loại trạng thái. Hoặc tôi có nhận được một cái gì đó sai trong lịch sử của nó và <input type="hidden"> luôn luôn được cho là được sử dụng cùng với JavaScript?

Nếu có thể, vui lòng cung cấp các tham chiếu trong câu trả lời của bạn.

+3

Tắt chủ đề cho SO mặc dù trạng thái duy trì cũng là lựa chọn của tôi – Phil

+0

Đồng ý, để cho phép theo dõi trạng thái được điền trước (ví dụ: PK thay thế trong khi chỉnh sửa) sẽ được tự động đưa vào biểu mẫu đã gửi POST/GET – StuartLC

+1

Hiện tại * trước * JavaScript * hỗ trợ * lý do để có chúng nhiều hơn (tức là, nó không làm giảm bất kỳ lý do nào vì câu hỏi này dường như ngụ ý) - không có JavaScript để "lưu biến" hoặc gọi AJAX hoặc khai trong "non ẩn "các lĩnh vực đầu vào trước khi gửi biểu mẫu .. cũng không có CSS ​​cho các hack hacks khác như làm cho một đầu vào văn bản bình thường ẩn. – user2246674

Trả lời

95

Tôi chỉ có thể tưởng tượng gửi giá trị từ máy chủ đến máy khách (không đổi) được gửi lại để duy trì trạng thái.

Chính xác. Trong thực tế, nó vẫn đang được sử dụng cho mục đích này ngày hôm nay bởi vì HTTP như chúng ta biết ngày nay vẫn còn, ít nhất về cơ bản, một giao thức không quốc tịch.

trường hợp sử dụng này đã thực sự đầu tiên được mô tả trong HTML 3.2 (Tôi ngạc nhiên HTML 2.0 không bao gồm như mô tả):

type=hidden
Những trường này không nên được trả lại và cung cấp một phương tiện cho các máy chủ để lưu trữ thông tin trạng thái với một biểu mẫu. Điều này sẽ được chuyển trở lại máy chủ khi biểu mẫu được gửi, sử dụng cặp tên/giá trị được xác định bởi các thuộc tính tương ứng. Đây là một công việc xung quanh cho các statelessness của HTTP. Một cách tiếp cận khác là sử dụng HTTP "Cookies".

<input type=hidden name=customerid value="c2415-345-8563"> 

Trong khi đó là đáng nói đến là HTML 3.2 đã trở thành một khuyến cáo của W3C chỉ sau phát hành ban đầu của JavaScript, nó an toàn để giả định rằng các lĩnh vực tiềm ẩn có khá nhiều luôn phục vụ cùng một mục đích.

+0

Điều tôi không thích về việc sử dụng dữ liệu đầu vào 'ẩn' để lưu trữ dữ liệu là dữ liệu có thể được người dùng thao tác, cấp, có thể chỉ có người hiểu HTML và cách sửa đổi thông qua công cụ dev, nhưng có thể có tác động xấu trên cơ sở dữ liệu nếu sửa đổi các giá trị đó làm hỏng dữ liệu khác (ví dụ: nếu bạn đang lưu trữ tham chiếu khóa chính và nó được người dùng thay đổi theo cách thủ công). – Brett84c

+2

@ Brett84c: Đó là lý do tại sao bạn nên luôn luôn xác thực đầu vào của bạn và không bao giờ tin tưởng khách hàng;) – BoltClock

+0

Chính xác, tôi đã ném nó ra để các nhà phát triển mới nhận thức được những nguy hiểm có thể có liên quan. – Brett84c

7

Tóm lại, mục đích ban đầu là tạo một trường sẽ được gửi cùng với biểu mẫu gửi. Đôi khi, cần lưu trữ một số thông tin trong trường ẩn (ví dụ: id của người dùng) và gửi thông tin đó bằng biểu mẫu gửi.

Từ HTML 22 tháng 9 năm 1995 đặc điểm kỹ thuật

Một yếu tố đầu vào với `TYPE = HIDDEN' đại diện cho một người sử dụng field.The ẩn không tương tác với lĩnh vực này; thay vào đó, thuộc tính VALUE chỉ định giá trị của trường. Thuộc tính NAME và VALUE là yêu cầu .

+1

Bạn có thể vui lòng xây dựng trên câu trả lời đó và/hoặc đưa ra một số tham chiếu đến hành vi này khi gửi các trường ẩn sau khi gửi biểu mẫu? – GitaarLAB

+0

@GitaarLAB, tôi đã đưa ra một ví dụ (id người dùng) ... Dù sao, có rất nhiều ví dụ trong web. Ví dụ: http://www.echoecho.com/htmlforms07.htm –

+1

Tôi xin lỗi, với tôi dòng: 'mục đích ban đầu là tạo một trường sẽ được gửi * sau khi gửi biểu mẫu * là mơ hồ. Nó có thể được hiểu là: 'sau khi biểu mẫu được thực hiện đăng dữ liệu của nó, * sau đó * trường ẩn sẽ được gửi (đến một nơi bí ẩn)'. Do đó, bình luận của tôi ở trên. – GitaarLAB

9

Tôi sẽ cung cấp một ví dụ bên thực tế đơn giản ở đây, nếu các bản ghi được lặp lại và mỗi bản ghi có biểu mẫu có nút xóa và bạn cần xóa một bản ghi cụ thể, do đó, ở đây có trường hidden đang hoạt động , nếu không bạn sẽ không nhận được tài liệu tham khảo của các bản ghi bị xóa trong trường hợp này, nó sẽ được id

Ví dụ

<?php 
    if(isset($_POST['delete_action'])) { 
     mysqli_query($connection, "DELETE FROM table_name 
            WHERE record_id = ".$_POST['row_to_be_deleted']); 
            //Here is where hidden field value is used 
    } 

    while(condition) { 
?> 
    <span><?php echo 'Looped Record Name'; ?> 
    <form method="post"> 
     <input type="hidden" name="row_to_be_deleted" value="<?php echo $record_id; ?>" /> 
     <input type="submit" name="delete_action" /> 
    </form> 
<?php 
    } 
?> 
+2

Ví dụ cơ bản tốt. – BoltClock

+1

Ví dụ tốt, ngoại trừ mã thực phải sử dụng các câu lệnh đã được chuẩn bị hoặc một cách khác để xử lý một cách an toàn đầu vào SQL. –

4

lĩnh vực cơ bản ẩn sẽ hữu ích hơn và lợi thế để sử dụng với bước đa hình thức. chúng tôi có thể sử dụng các trường ẩn để chuyển thông tin một bước sang bước tiếp theo bằng cách sử dụng ẩn và tiếp tục chuyển tiếp đến bước cuối cùng.

  1. Mã thông báo CSRF.

Giả mạo yêu cầu chéo trang web (http://en.wikipedia.org/wiki/Cro...) là lỗ hổng trang web rất phổ biến. Yêu cầu mã bí mật, người dùng cụ thể trong tất cả các hình thức gửi sẽ ngăn chặn các cuộc tấn công CSRF vì các trang web tấn công không thể đoán mã thông báo chính xác là gì và mọi hình thức gửi họ thực hiện thay mặt cho người dùng sẽ luôn thất bại.

  1. Lưu trạng thái ở dạng nhiều trang.

Nếu bạn cần lưu trữ bước nào ở dạng nhiều trang người dùng hiện đang sử dụng, hãy sử dụng các trường nhập ẩn. Người dùng không cần xem thông tin này, vì vậy hãy ẩn thông tin đó trong trường nhập ẩn.

Quy tắc chung: Sử dụng trường để lưu trữ bất kỳ thứ gì mà người dùng không cần xem nhưng bạn muốn gửi đến máy chủ khi gửi biểu mẫu.

4

Giá trị của các phần tử biểu mẫu bao gồm loại = 'ẩn' được gửi tới máy chủ khi biểu mẫu được đăng. giá trị loại đầu vào = "ẩn" không hiển thị trong trang. Ví dụ, việc duy trì User ID trong các trường ẩn là một trong nhiều cách sử dụng.

SO sử dụng trường ẩn cho nhấp chuột upvote.

<input value="16293741" name="postId" type="hidden"> 

Sử dụng giá trị này, tập lệnh phía máy chủ có thể lưu trữ upvote.

+0

Haha, bắt tốt! Và khi tôi thêm "x" vào cuối giá trị, lỗi xảy ra khi upvoting: D – Uooo

+0

@Uooo Và bạn có thể bỏ ẩn hoặc thay đổi trực tiếp giá trị. Bạn có thể thay đổi giá trị thành một câu trả lời khác. Sau đó bạn có thể nhấp vào nút upvote và nó đăng nhập như là một upvote cho một câu trả lời khác nhau. ;) –

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