ส่งแบบฟอร์ม GET พร้อมด้วยพารามิเตอร์สตริงการสืบค้นและพารามิเตอร์ที่ซ่อนอยู่หายไป


231

พิจารณาแบบฟอร์มนี้:

<form action="http://www.blabla.com?a=1&b=2" method="GET">
    <input type="hidden" name="c" value="3" /> 
</form>

เมื่อส่งแบบฟอร์มนี้ (แบบฟอร์ม GET) พารามิเตอร์ a และ b จะหายไป มีเหตุผลสำหรับสิ่งนั้นหรือไม่? มีวิธีหลีกเลี่ยงพฤติกรรมนี้หรือไม่?


3
องค์ประกอบการกระทำของคุณมีรูปแบบไม่ถูกต้อง
Adrian Godong

พวกเขาไม่ควรหายไปดังนั้นฉันคิดว่าเราจะต้องเห็นแบบฟอร์มของคุณ
UnkwnTech

2
สวัสดีนี่คือแบบเต็มคุณสามารถสร้าง HTML ด้วยแบบฟอร์มนี้และดูว่าพารามิเตอร์ที่ฉันส่งไปในการดำเนินการไม่ทำงาน: <form action = " example.com?e=4&f=5 " method = "GET"> <input type = "hidden" name = "a" value = "1" /> <input type = "hidden" name = "b" value = "2" /> <input type = "hidden" name = "c" value = "3" /> <input type = "submit" /> </form>

1
โดยวิธีการที่คุณรู้ว่าคุณไม่มีคำพูดที่สิ้นสุดในมูลค่าการกระทำนั้น? นอกเหนือจากประเด็นหลักทั้งหมดแล้ว แต่ ...
Jay

ฉันโพสต์วิธีแก้ปัญหาที่เป็นไปได้โดยใช้ JavaScript ที่นี่: stackoverflow.com/questions/3548795/…
Jenny O'Reilly

คำตอบ:


263

นั่นไม่ใช่พารามิเตอร์ที่ซ่อนไว้สำหรับการเริ่มต้นด้วย ...

<form action="http://www.example.com" method="GET">
  <input type="hidden" name="a" value="1" /> 
  <input type="hidden" name="b" value="2" /> 
  <input type="hidden" name="c" value="3" /> 
  <input type="submit" /> 
</form>

ฉันจะไม่พึ่งพาเบราว์เซอร์ใด ๆ ที่รักษาสตริงข้อความค้นหาที่มีอยู่ใน URL การดำเนินการ

ตามข้อกำหนด ( RFC1866 , หน้า 46; HTML 4.xส่วน 17.13.3) สถานะ:

หากวิธีการคือ "รับ" และการดำเนินการเป็น HTTP URI ตัวแทนผู้ใช้จะใช้มูลค่าของการดำเนินการผนวก `? ' ไปที่มันจากนั้นผนวกชุดข้อมูลแบบฟอร์มที่เข้ารหัสโดยใช้ชนิดเนื้อหา "application / x-www-form-urlencoded"

บางทีอาจเข้ารหัสการกระทำของ URL เพื่อฝังเครื่องหมายคำถามและพารามิเตอร์จากนั้นใช้นิ้วมือเพื่อหวังว่าเบราว์เซอร์ทั้งหมดจะออกจาก URL นั้นในขณะนั้น (และตรวจสอบว่าเซิร์ฟเวอร์เข้าใจเช่นกัน) แต่ฉันไม่เคยเชื่อเรื่องนั้น

โดยวิธีการ: มันไม่แตกต่างกันสำหรับเขตข้อมูลแบบฟอร์มที่ไม่ซ่อน สำหรับ POST URL การดำเนินการสามารถเก็บสตริงข้อความค้นหาได้


71

ใน HTML5 นี่เป็นพฤติกรรมแบบจำเพาะ

ดูhttp://www.w3.org/TR/2011/WD-html5-20110525/association-of-controls-and-forms.html#form-submission-algorithm

ดูที่ "4.10.22.3 อัลกอริทึมการส่งแบบฟอร์ม" ขั้นตอนที่ 17 ในกรณีของแบบฟอร์ม GET ไปยัง http / s URI ด้วยสตริงการสืบค้น:

ให้ปลายทางเป็น URL ใหม่ที่เท่ากับการกระทำยกเว้นว่า<query>องค์ประกอบนั้นจะถูกแทนที่ด้วยข้อความค้นหา (เพิ่มอักขระเครื่องหมายคำถาม U + 003F QUESTION MARK (?) หากเหมาะสม)

ดังนั้นเบราว์เซอร์ของคุณจะลบส่วน "? ... " ที่มีอยู่ใน URI ของคุณและแทนที่ด้วยส่วนใหม่โดยยึดตามแบบฟอร์มของคุณ

ใน HTML 4.01 ข้อมูลจำเพาะสร้าง URIs ที่ไม่ถูกต้อง - เบราว์เซอร์ส่วนใหญ่ไม่ได้ทำสิ่งนี้จริงๆ ..

ดูhttp://www.w3.org/TR/html401/interact/forms.html#h-17.13.3ขั้นตอนที่สี่ - URI จะมีเครื่องหมาย ผนวกแม้ว่ามันจะมีหนึ่ง


หมายความว่า: ทุกสิ่งที่อยู่เบื้องหลัง?URL การดำเนินการถูกลบออกหรือไม่ ดังนั้นถ้าพารามิเตอร์ GET ใน URL การกระทำมีเป้าหมายที่ควรประมวลผลแบบฟอร์ม? action="index.php?site=search"ที่ชอบ: ฉันไม่แน่ใจว่าถ้าใส่พารามิเตอร์ GET ในช่องใส่ที่ซ่อนอยู่เป็นความคิดของพระเจ้า
Bndr

คุณหมายถึงอะไรโดย per-spec @xyphoid
AmiNadimi

@AmiNadimi: มันหมายถึง "ตามข้อกำหนด"
เรียกซ้ำ

14

สิ่งที่คุณสามารถทำได้คือการใช้ foreach แบบง่าย ๆ บนตารางที่มีข้อมูล GET ตัวอย่างเช่นใน php:

foreach ($_GET as $key => $value) {
    echo("<input type='hidden' name='$key' value='$value'/>");
}

23
หมายเหตุ: อย่าใช้รหัสตัวอย่างนี้อย่างที่เขียน มันจะเป็นอันตรายมาก ค่าจาก GET มาจากผู้ใช้ดังนั้นจึงไม่ควรเขียนลงในหน้าโดยไม่ต้องหลบหนีก่อน
drewm

16
Downvoting จนกว่าข้อผิดพลาด XSS ในรหัสนี้จะได้รับการแก้ไข
spookylukey

1
คำตอบนี้ให้โซลูชันที่คล้ายกัน แต่ไม่สามารถ XSS ได้
vvzh

สิ่งนี้ไม่สามารถจัดการกับพารามิเตอร์ของอาร์เรย์ได้
Andrew

5

คุณควรรวมสองรายการ (a และ b) เป็นองค์ประกอบอินพุตที่ซ่อนอยู่เช่นเดียวกับ C


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

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

อีกทางเลือกหนึ่งคือใช้ข้อมูลจากไอเท็มฟอร์มที่ซ่อนอยู่และเพิ่มลงใน URL และพารามิเตอร์เคียวรีเพิ่มเติมจากนั้นแทนที่ปุ่มส่งฟอร์มด้วยลิงค์สมอง่ายหรือเซิร์ฟเวอร์Location:เปลี่ยนเส้นทางหากคุณไม่ต้องการให้ผู้ใช้ปลายทางมีปฏิสัมพันธ์ .
เจสัน

1

ฉันมีปัญหาที่คล้ายกันมากสำหรับการดำเนินการของแบบฟอร์มฉันมีสิ่งที่ชอบ:

<form action="http://www.example.com/?q=content/something" method="GET">
   <input type="submit" value="Go away..." />&nbsp;
</form>

ปุ่มจะนำผู้ใช้ไปยังเว็บไซต์ แต่ข้อมูลแบบสอบถามหายไปดังนั้นผู้ใช้จึงลงจอดบนหน้าแรกแทนที่จะเป็นหน้าเนื้อหาที่ต้องการ ทางออกในกรณีของฉันคือการหาวิธีการรหัส URL โดยไม่ต้องสอบถามที่จะนำผู้ใช้ไปยังหน้าที่ต้องการ ในกรณีนี้เป้าหมายของฉันคือเว็บไซต์ Drupal ดังนั้นเมื่อเปิดใช้/content/somethingงานได้ ฉันยังสามารถใช้หมายเลขโหนด (เช่น/node/123)


0

หากคุณต้องการวิธีแก้ปัญหาเนื่องจากสามารถวางฟอร์มนี้ในระบบของบุคคลที่สามคุณสามารถใช้ Apache mod_rewrite ดังนี้:

RewriteRule ^dummy.link$ index.php?a=1&b=2 [QSA,L]

จากนั้นแบบฟอร์มใหม่ของคุณจะมีลักษณะดังนี้:

<form ... action="http:/www.blabla.com/dummy.link" method="GET">
<input type="hidden" name="c" value="3" /> 
</form>

และ Apache จะผนวกพารามิเตอร์ที่ 3 ลงในแบบสอบถาม


-3

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

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


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

ฉันขอโทษไม่ชัดเจนใช่ไหม "คุณไม่สามารถรวมพารามิเตอร์ในค่าการกระทำของแบบฟอร์ม" หากต้องการแก้ไขให้ลบพารามิเตอร์ออกจากค่าการดำเนินการของแบบฟอร์ม
Jay

@Jay ปัญหาชัดเจนว่าผู้ใช้ต้องการให้พารามิเตอร์ URL อยู่ดังนั้นการพูดว่า "ลบพวกเขา" จะไม่ช่วย
Chuck Le Butt

@ChuckLeButt พูดว่า "แต่ฉันต้องทำสิ่งที่ไม่ได้ผล" ไม่ใช่คำพูดที่มีประโยชน์ ถ้ามีคนบอกฉันว่า "ฉันหมุนลูกบิดวิทยุ แต่รถของฉันจะไม่เคลื่อนที่" คำตอบเดียวที่ฉันคิดได้ก็คือจะพูดว่า "การหมุนลูกบิดวิทยุไม่ทำให้รถเคลื่อนที่คุณต้องหมุน ปุ่มกุญแจและกดคันเร่ง " ในการตอบกลับ "แต่ฉันต้องทำให้รถเคลื่อนที่โดยหมุนลูกบิดวิทยุ" เป็นการตอบสนองที่ไม่เกิดผล มันไม่ทำงาน มันจะไม่ทำงาน
Jay

-3

นี่คือการตอบสนองต่อการโพสต์ข้างต้นโดย Efx:

หาก URL มี var ที่คุณต้องการเปลี่ยนแปลงอยู่แล้ว URL นั้นจะถูกเพิ่มอีกครั้งเป็นฟิลด์ที่ซ่อนอยู่

นี่คือการแก้ไขโค้ดนั้นเพื่อป้องกันการทำซ้ำ vars ใน URL:

foreach ($_GET as $key => $value) {
    if ($key != "my_key") {
        echo("<input type='hidden' name='$key' value='$value'/>");
    }
}

-4
<form ... action="http:/www.blabla.com?a=1&b=2" method ="POST">
<input type="hidden" name="c" value="3" /> 
</form>

เปลี่ยนวิธีการร้องขอเป็น 'POST' แทน 'GET'


-4

ฉันมักจะเขียนสิ่งนี้:

foreach($_GET as $key=>$content){
        echo "<input type='hidden' name='$key' value='$content'/>";
}

นี่ใช้งานได้ แต่อย่าลืมฆ่าเชื้ออินพุตของคุณจากการโจมตี XSS!

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