Mục đích ban đầu của <input type = “hidden”>? [đóng cửa]


101

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

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

Nếu có thể, vui lòng cung cấp tài liệu tham khảo trong câu trả lời của bạn.


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

Đồng ý, cho phép theo dõi của nhà nước trước dân cư (ví dụ của một Surrogate PK trong một cuộc chỉnh sửa) mà sẽ được tự động đưa vào một hình thức trình POST / GET
StuartLC

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

Câu trả lời:


108

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

Đúng. Trên thực tế, nó vẫn được sử dụng cho mục đích này ngày nay vì HTTP như chúng ta biết ngày nay, ít nhất là về cơ bản, là một giao thức không trạng thái.

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

type=hidden
Các trường này không nên được kết xuất và cung cấp 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 giải pháp khắc phục tình trạng không trạng thái của HTTP. Một cách tiếp cận khác là sử dụng "Cookie" HTTP.

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

Mặc dù điều đáng nói là HTML 3.2 chỉ trở thành Khuyến nghị của W3C sau bản phát hành đầu tiên của JavaScript, nhưng thật an toàn khi giả định rằng các trường ẩn luôn phục vụ cùng một mục đích.


Một điều tôi không thích về việc sử dụng đầu vào 'ẩn' để lưu trữ dữ liệu là dữ liệu đó có thể bị thao túng bởi người dùng, được cấp phép, có thể chỉ ai đó hiểu HTML và cách sửa đổi nó thông qua các công cụ của nhà phát triển, nhưng có thể có những tác động xấu đối với cơ sở dữ liệu nếu việc 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:

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

Chính xác, tôi chỉ đang ném nó ra ngoài đó để các nhà phát triển mới nhận thức được những nguy hiểm có thể xảy ra.
Brett84c:

2
Không có gì về những mối nguy hiểm đó là cụ thể đối với đầu vào 'ẩn' - bất kỳ thứ gì được gửi đến máy khách đều có thể bị thao túng trước khi nó quay trở lại. Cookie hoặc các lựa chọn thay thế dựa trên JS đều giống nhau.
FLHerne

10

Tôi sẽ cung cấp một ví dụ đơn giản về Thế giới thực phía máy chủ ở đây, giả sử nếu các bản ghi được lặp lại và mỗi bản ghi có một biểu mẫu có nút xóa và bạn cần xóa một bản ghi cụ thể, vì vậy hiddentrường này sẽ hoạt động, nếu không bạn đã thắng ' t lấy tham chiếu của bản ghi sẽ bị xóa trong trường hợp này, nó sẽ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
    }
?>

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

8

Tóm lại, mục đích ban đầu là tạo một trường sẽ được gửi cùng với gửi biểu mẫu. Đôi khi, cần phải 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 nó cùng với gửi biểu mẫu.

Từ đặc tả HTML ngày 22 tháng 9 năm 1995

Phần tử INPUT với `TYPE = HIDDEN 'đại diện cho một trường ẩn Người dùng không tương tác với trường 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à bắt buộc.


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

@GitaarLAB, tôi đã đưa ra một ví dụ (ID người dùng) ... Dù sao, có rất nhiều ví dụ trên web. Ví dụ echoecho.com/htmlforms07.htm
Chuck Norris

1
Tôi xin lỗi, đối với tôi dòng: original purpose was to make a field which will be submitted *after* form's submitmơ hồ. Nó có thể được hiểu là: 'sau khi biểu mẫu được hoàn thành đăng dữ liệu của nó, thì trường ẩn sẽ được gửi (đến một nơi bí ẩn)'. Do đó, nhận xét của tôi ở trên.
GitaarLAB

1
Tôi hiểu rồi :) Cảm ơn bình luận của bạn, tôi đã chỉnh sửa câu trả lời của mình. Nó chỉ là lỗi chính tả (chưa đạt đến trình độ guru trong tiếng Anh: D).
Chuck Norris

6

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

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

<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ữ phiếu ủng hộ.


Haha, bắt tốt! Và khi tôi thêm một "x" ở cuối của giá trị một lỗi xảy ra khi upvoting: D
Uooo

@Uooo Và bạn có thể hiện 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 ủng hộ và nó được ghi lại dưới dạng ủng hộ cho một câu trả lời khác. ;)
Geoffrey Hale

5

về cơ bản các trường ẩn sẽ hữu ích hơn và có lợi thế hơn khi sử dụng với dạng nhiều bước. chúng ta 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à giữ nó chuyển tiếp cho đến bước cuối cùng.

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

Giả mạo yêu cầu trên nhiều trang web là một lỗ hổng trang web rất phổ biến. Yêu cầu mã thông báo bí mật, dành riêng cho người dùng trong tất cả các lần gửi biểu mẫu 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 thích hợp là gì và bất kỳ lần gửi biểu mẫu nào mà 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 trong các biểu mẫu nhiều trang.

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

Quy tắc chung: Sử dụng trường để lưu trữ bất cứ 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.

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.