วัตถุประสงค์ดั้งเดิมของ <input type =“ hidden”>? [ปิด]


101

ฉันอยากรู้เกี่ยวกับจุดประสงค์ดั้งเดิมของ<input type="hidden">แท็ก

ปัจจุบันมักใช้ร่วมกับ JavaScript เพื่อจัดเก็บตัวแปรที่ส่งไปยังเซิร์ฟเวอร์และสิ่งต่างๆเช่นนั้น

ดังนั้นจึง<input type="hidden">มีอยู่ก่อน JavaScript ดังนั้นจุดประสงค์ดั้งเดิมคืออะไร? ฉันนึกได้แค่การส่งค่าจากเซิร์ฟเวอร์ไปยังไคลเอนต์ซึ่ง (ไม่เปลี่ยนแปลง) ถูกส่งกลับไปเพื่อรักษาสถานะไว้ หรือฉันทำอะไรผิดพลาดในประวัติของมันและ<input type="hidden">ควรจะใช้ร่วมกับ JavaScript เสมอ?

หากเป็นไปได้โปรดให้ข้อมูลอ้างอิงในคำตอบของคุณด้วย


3
ปิดหัวข้อสำหรับ SO แม้ว่าการรักษาสถานะก็เป็นสิ่งที่ฉันเลือก
Phil

ตกลงที่จะอนุญาตให้ติดตามสถานะที่สร้างไว้ล่วงหน้า (เช่น Surrogate PK ระหว่างการแก้ไข) ซึ่งจะรวมอยู่ในแบบฟอร์มที่ส่งโดยอัตโนมัติ POST / GET
StuartLC

1
ที่มีอยู่ก่อนที่ JavaScript จะสนับสนุนเหตุผลที่ต้องมีมากกว่านี้ (นั่นคือไม่ได้เบี่ยงเบนจากเหตุผลใด ๆ เนื่องจากคำถามนี้ดูเหมือนจะบอกเป็นนัยว่า) - ไม่มี JavaScript สำหรับ "จัดเก็บตัวแปร" หรือเรียก AJAX หรือต้นขั้วในอินพุต "ไม่ซ่อน" ช่องก่อนส่งแบบฟอร์ม .. นอกจากนี้ยังไม่มี CSS สำหรับการแฮ็กที่ผิดปกติอื่น ๆ เช่นการซ่อนการป้อนข้อความปกติ
user2246674

คำตอบ:


108

ฉันนึกได้แค่การส่งค่าจากเซิร์ฟเวอร์ไปยังไคลเอนต์ซึ่ง (ไม่เปลี่ยนแปลง) ถูกส่งกลับไปเพื่อรักษาสถานะไว้

แม่นยำ. ในความเป็นจริงมันยังคงถูกใช้เพื่อจุดประสงค์นี้ในปัจจุบันเนื่องจาก HTTP ที่เรารู้จักในปัจจุบันนั้นยังคงเป็นโปรโตคอลไร้สัญชาติ

กรณีการใช้งานนี้อธิบายไว้เป็นครั้งแรกในHTML 3.2 (ฉันแปลกใจที่ HTML 2.0 ไม่มีคำอธิบายดังกล่าว):

type=hidden
ไม่ควรแสดงฟิลด์เหล่านี้และให้วิธีการสำหรับเซิร์ฟเวอร์ในการจัดเก็บข้อมูลสถานะด้วยแบบฟอร์ม สิ่งนี้จะถูกส่งกลับไปยังเซิร์ฟเวอร์เมื่อส่งแบบฟอร์มโดยใช้คู่ชื่อ / ค่าที่กำหนดโดยแอตทริบิวต์ที่เกี่ยวข้อง นี่เป็นการแก้ไขปัญหาสำหรับการไร้สัญชาติของ HTTP อีกวิธีหนึ่งคือการใช้ "คุกกี้" ของ HTTP

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

แม้ว่าจะเป็นเรื่องที่ควรค่าแก่การกล่าวถึงว่า HTML 3.2 กลายเป็นคำแนะนำ W3C หลังจากการเปิดตัวครั้งแรกของ JavaScript แต่ก็ปลอดภัยที่จะสมมติว่าช่องที่ซ่อนอยู่นั้นมีจุดประสงค์เดียวกันเสมอ


สิ่งหนึ่งที่ฉันไม่ชอบเกี่ยวกับการใช้อินพุต 'ซ่อน' ในการจัดเก็บข้อมูลก็คือผู้ใช้สามารถจัดการข้อมูลได้ซึ่งอาจเป็นเพียงคนที่เข้าใจ HTML และวิธีแก้ไขผ่านเครื่องมือ dev แต่อาจมีผลกระทบที่ไม่ดีต่อ ฐานข้อมูลหากการแก้ไขค่าเหล่านั้นทำให้ข้อมูลอื่นเสียหาย (ตัวอย่างเช่นหากคุณจัดเก็บข้อมูลอ้างอิงคีย์หลักและผู้ใช้เปลี่ยนด้วยตนเอง)
Brett84c

3
@ Brett84c: นั่นเป็นเหตุผลที่คุณควรตรวจสอบความถูกต้องของข้อมูลของคุณและอย่าไว้ใจลูกค้า;)
BoltClock

แน่นอนว่าฉันแค่โยนสิ่งนั้นออกไปเพื่อให้นักพัฒนารายใหม่ตระหนักถึงอันตรายที่อาจเกิดขึ้นได้
Brett84c

2
ไม่มีสิ่งใดเกี่ยวกับอันตรายเหล่านั้นเฉพาะสำหรับอินพุตที่ 'ซ่อนอยู่' - สิ่งที่ส่งไปยังไคลเอนต์สามารถจัดการได้ก่อนที่มันจะกลับมา คุกกี้หรือทางเลือกที่ใช้ JS ก็เหมือนกัน
FLHerne

10

ฉันจะให้ตัวอย่างโลกแห่งความจริงฝั่งเซิร์ฟเวอร์อย่างง่ายที่นี่บอกว่าระเบียนถูกวนซ้ำหรือไม่และแต่ละระเบียนมีรูปแบบที่มีปุ่มลบและคุณต้องลบบันทึกเฉพาะดังนั้นที่นี่จึงมีhiddenการดำเนินการในฟิลด์มิฉะนั้นคุณจะชนะ ' ไม่ได้รับการอ้างอิงของบันทึกที่จะลบในกรณีนี้มันจะเป็นid

ตัวอย่างเช่น

<?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
ตัวอย่างที่ดียกเว้นโค้ดจริงควรใช้คำสั่งที่เตรียมไว้หรือวิธีอื่นในการจัดการอินพุต SQL อย่างปลอดภัย
Matthew Flaschen

8

ในระยะสั้นจุดประสงค์เดิมคือการสร้างฟิลด์ซึ่งจะถูกส่งพร้อมกับการส่งแบบฟอร์ม บางครั้งจำเป็นต้องจัดเก็บข้อมูลบางอย่างในช่องที่ซ่อนอยู่ (เช่นรหัสผู้ใช้) และส่งพร้อมกับส่งแบบฟอร์ม

จากข้อกำหนด HTML 22 กันยายน 1995

องค์ประกอบ INPUT ที่มี `` TYPE = HIDDEN '' แสดงถึงฟิลด์ที่ซ่อนอยู่ผู้ใช้ไม่ได้โต้ตอบกับฟิลด์นี้ แทนแอตทริบิวต์ VALUE ระบุค่าของฟิลด์ ต้องระบุแอตทริบิวต์ NAME และ VALUE


1
คุณช่วยอธิบายรายละเอียดเกี่ยวกับคำตอบนั้นและ / หรือให้ข้อมูลอ้างอิงถึงพฤติกรรมการส่งฟิลด์ที่ซ่อนอยู่หลังจากส่งแบบฟอร์มได้หรือไม่
GitaarLAB

@GitaarLAB ผมยกตัวอย่าง (user Id) ... อย่างไรก็ตามมีตัวอย่างมากมายในเว็บ ตัวอย่างเช่นechoecho.com/htmlforms07.htm
Chuck Norris

1
ฉันขอโทษสำหรับฉันบรรทัด: original purpose was to make a field which will be submitted *after* form's submitไม่ชัดเจน สามารถตีความได้ว่า: 'หลังจากโพสต์ข้อมูลเสร็จแล้วฟิลด์ที่ซ่อนจะถูกส่ง (ไปยังสถานที่ลึกลับ)' ดังนั้นความคิดเห็นของฉันด้านบน
GitaarLAB

1
ฉันเข้าใจแล้ว :) ขอบคุณสำหรับความคิดเห็นฉันได้แก้ไขคำตอบแล้ว มันเป็นเพียงการสะกดผิด (ยังไม่ถึงระดับกูรูในภาษาอังกฤษ: D)
Chuck Norris

6

ค่าขององค์ประกอบฟอร์มรวมถึง type = 'hidden' จะถูกส่งไปยังเซิร์ฟเวอร์เมื่อโพสต์แบบฟอร์ม ประเภทอินพุต = ค่า "ซ่อน" จะไม่ปรากฏในหน้านี้ ตัวอย่างเช่นการดูแล User ID ในช่องที่ซ่อนอยู่ถือเป็นหนึ่งในหลาย ๆ

SO ใช้ฟิลด์ที่ซ่อนอยู่สำหรับการคลิกเพิ่มคะแนน

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

การใช้ค่านี้สคริปต์ฝั่งเซิร์ฟเวอร์สามารถจัดเก็บการโหวตได้


ฮ่า ๆ จับดี! และเมื่อฉันต่อท้าย "x" ที่ท้ายค่าข้อผิดพลาดจะเกิดขึ้นเมื่อ
โหวต

@Uooo และคุณสามารถยกเลิกการซ่อนหรือเปลี่ยนค่าได้โดยตรง คุณสามารถเปลี่ยนค่าเป็นคำตอบอื่นได้ จากนั้นคุณสามารถคลิกที่ปุ่มเพิ่มคะแนนและเข้าสู่ระบบเป็นการเพิ่มคะแนนสำหรับคำตอบอื่น ;)
Geoffrey Hale

5

ฟิลด์ที่ซ่อนอยู่โดยทั่วไปจะมีประโยชน์มากกว่าและมีข้อดีในการใช้กับแบบฟอร์มหลายขั้นตอน เราสามารถใช้ฟิลด์ที่ซ่อนเพื่อส่งต่อข้อมูลขั้นตอนเดียวไปยังขั้นตอนถัดไปโดยใช้การซ่อนและส่งต่อไปจนจบขั้นตอน

  1. โทเค็น CSRF

การปลอมแปลงคำขอข้ามไซต์เป็นช่องโหว่ของเว็บไซต์ที่พบบ่อยมาก การกำหนดโทเค็นเฉพาะผู้ใช้ที่เป็นความลับในการส่งแบบฟอร์มทั้งหมดจะป้องกันการโจมตี CSRF เนื่องจากไซต์โจมตีไม่สามารถคาดเดาได้ว่าโทเค็นที่เหมาะสมคืออะไรและการส่งแบบฟอร์มใด ๆ ที่ดำเนินการในนามของผู้ใช้จะล้มเหลวเสมอ

  1. บันทึกสถานะในรูปแบบหลายหน้า

หากคุณต้องการจัดเก็บขั้นตอนใดในรูปแบบหลายเพจที่ผู้ใช้กำลังใช้งานอยู่ให้ใช้ฟิลด์อินพุตที่ซ่อนอยู่ ผู้ใช้ไม่จำเป็นต้องเห็นข้อมูลนี้ดังนั้นให้ซ่อนไว้ในช่องป้อนข้อมูลที่ซ่อนอยู่

กฎทั่วไป: ใช้ฟิลด์เพื่อจัดเก็บสิ่งที่ผู้ใช้ไม่จำเป็นต้องเห็น แต่คุณต้องการส่งไปยังเซิร์ฟเวอร์เมื่อส่งแบบฟอร์ม

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.