gửi biểu mẫu GET với tham số chuỗi truy vấn và tham số ẩn


231

Xem xét hình thức này:

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

Khi gửi biểu mẫu này (biểu mẫu GET), các tham số a và b sẽ biến mất. Có một lý do cho điều đó? Có cách nào để tránh hành vi này?


3
Yếu tố hành động của bạn là không đúng.
Adrian Godong

Chúng không nên biến mất, vì vậy tôi nghĩ rằng chúng ta sẽ cần phải xem biểu mẫu của bạn.
UnkwnTech

2
Xin chào, Đây là biểu mẫu đầy đủ, bạn chỉ cần tạo HTML bằng biểu mẫu này và xem các tham số tôi chuyển trong hành động đang bị từ chối: <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
Nhân tiện, bạn có biết bạn đang thiếu một trích dẫn kết thúc về giá trị hành động đó không? Hoàn toàn ngoài vấn đề chính, nhưng ...
Jay

Tôi đã đăng một cách giải quyết có thể sử dụng JavaScript tại đây: stackoverflow.com/questions35348795/ triệt
Jenny O'Reilly

Câu trả lời:


263

Không phải đó là những thông số ẩn nào để bắt đầu với ...?

<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>

Tôi sẽ không dựa vào bất kỳ trình duyệt nào giữ lại bất kỳ chuỗi truy vấn hiện có nào trong URL hành động.

Như thông số kỹ thuật ( RFC1866 , trang 46; HTML 4.x phần 17.13.3) trạng thái:

Nếu phương thức là "get" và hành động là URI HTTP, tác nhân người dùng sẽ nhận giá trị của hành động, nối thêm một `? ' vào đó, sau đó nối thêm tập dữ liệu biểu mẫu, được mã hóa bằng loại nội dung "application / x-www-form-urlencoding".

Có lẽ ai đó có thể mã hóa phần trăm URL hành động để nhúng dấu hỏi và tham số, sau đó bắt chéo ngón tay của một người để hy vọng tất cả các trình duyệt sẽ rời URL đó (và xác thực rằng máy chủ cũng hiểu nó). Nhưng tôi không bao giờ dựa vào điều đó.

Nhân tiện: nó không khác nhau đối với các trường mẫu không ẩn. Đối với POST, URL hành động có thể chứa một chuỗi truy vấn.


71

Trong HTML5, đây là hành vi theo từng thông số.

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

Xem "Thuật toán gửi biểu mẫu 4.10.22.3", bước 17. Trong trường hợp biểu mẫu GET thành URI http / s với chuỗi truy vấn:

Đặt đích là một URL mới bằng với hành động ngoại trừ <query>thành phần của nó được thay thế bằng truy vấn (thêm ký tự U + 003F CÂU HỎI CÂU HỎI (?) Nếu thích hợp).

Vì vậy, trình duyệt của bạn sẽ loại bỏ phần "? ..." hiện có trong URI của bạn và thay thế nó bằng một phần mới dựa trên biểu mẫu của bạn.

Trong HTML 4.01, thông số kỹ thuật tạo ra các URI không hợp lệ - hầu hết các trình duyệt không thực sự làm điều này mặc dù ..

Xem http://www.w3.org/TR/html401/interact/forms.html#h-17.13.3 , bước bốn - URI sẽ có? nối thêm, ngay cả khi nó đã chứa một.


điều này có nghĩa là: mọi thứ đằng sau ?url hành động được loại bỏ? Vậy, nếu tham số GET trong url hành động chứa mục tiêu, thì biểu mẫu sẽ được xử lý ở đâu? như : action="index.php?site=search". Tôi không chắc chắn, nếu đặt tham số GET trong các trường đầu vào ẩn là một ý tưởng tuyệt vời.
Bndr

ý nghĩa của per-spec @xyphoid là gì?
AmiNadimi

@AmiNadimi: Có nghĩa là "phù hợp với đặc điểm kỹ thuật".
đệ quy

14

Những gì bạn có thể làm là sử dụng một foreach đơn giản trên bảng chứa thông tin GET. Ví dụ trong php:

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

23
Lưu ý: không bao giờ sử dụng mã ví dụ này chính xác như được viết. Nó sẽ rất nguy hiểm. Các giá trị từ GET đến từ người dùng, vì vậy không nên ghi vào trang mà không thoát chúng trước.
vẽ

16
Tải xuống cho đến khi lỗi XSS trong mã này được sửa.
spookylukey

1
Câu trả lời này cung cấp một giải pháp tương tự nhưng không phù hợp với XSS.
vvzh

điều này không xử lý các tham số mảng
Andrew

5

Bạn nên bao gồm hai mục (a và b) làm các yếu tố đầu vào ẩn cũng như C.


Vâng, tất nhiên tôi sẽ làm điều này nếu có thể. Nhưng giả sử tôi có các tham số trong chuỗi truy vấn và trong các đầu vào ẩn, tôi có thể làm gì?

Tôi nghĩ rằng tùy chọn duy nhất của bạn là phân tích các cặp tên / giá trị của chuỗi truy vấn và tạo ra các trường đầu vào ẩn. Có thể nếu bạn mô tả thêm một chút về bối cảnh của trang và URL, chúng tôi có thể đề xuất một giải pháp hoạt động.
Bernhard Hofmann

Hoặc, lấy dữ liệu từ các mục biểu mẫu ẩn và thêm chúng vào URL và các tham số truy vấn bổ sung, sau đó thay thế nút gửi biểu mẫu bằng liên kết neo đơn giản hoặc Location:chuyển hướng máy chủ nếu bạn không muốn có bất kỳ tương tác nào với người dùng cuối .
Jason

1

Tôi đã có một vấn đề rất giống với hành động biểu mẫu, tôi có một cái gì đó như:

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

Nút này sẽ đưa người dùng đến trang web, nhưng thông tin truy vấn biến mất để người dùng hạ cánh trên trang chủ thay vì trang nội dung mong muốn. Giải pháp trong trường hợp của tôi là tìm ra cách mã URL mà không cần truy vấn sẽ đưa người dùng đến trang mong muốn. Trong trường hợp này, mục tiêu của tôi là một trang web Drupal, vì vậy hóa ra nó /content/somethingcũng hoạt động. Tôi cũng có thể đã sử dụng một số nút (tức là /node/123).


0

Nếu bạn cần giải pháp thay thế, vì hình thức này có thể được đặt trong các hệ thống của bên thứ 3, bạn có thể sử dụng Apache mod_rewrite như thế này:

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

sau đó hình thức mới của bạn sẽ trông như thế này:

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

và Apache sẽ nối tham số thứ 3 vào truy vấn


-3

Xây dựng của bạn là bất hợp pháp. Bạn không thể bao gồm các tham số trong giá trị hành động của biểu mẫu. Điều gì xảy ra nếu bạn thử điều này sẽ phụ thuộc vào các yêu cầu của trình duyệt. Tôi sẽ không ngạc nhiên nếu nó hoạt động với một trình duyệt chứ không phải trình duyệt khác. Ngay cả khi nó có vẻ hoạt động, tôi sẽ không dựa vào nó, bởi vì phiên bản tiếp theo của trình duyệt có thể thay đổi hành vi.

"Nhưng giả sử tôi có các tham số trong chuỗi truy vấn và trong các đầu vào ẩn, tôi có thể làm gì?" Những gì bạn có thể làm là sửa lỗi. Không được ngáy, nhưng điều này giống như hỏi, "Nhưng giả sử URL của tôi sử dụng dấu phần trăm thay vì dấu gạch chéo, tôi có thể làm gì?" Câu trả lời duy nhất có thể là, bạn có thể sửa URL.


Toàn bộ câu trả lời này là đúng về mặt kỹ thuật ("nó sai, vì vậy hãy sửa nó") nhưng không sử dụng được gì. OP đã biết có gì đó không ổn và đang ở đây để hỏi cách khắc phục.
Jason

Tôi xin lỗi, không rõ ràng? "Bạn không thể bao gồm các tham số trong giá trị hành động của biểu mẫu." Để sửa nó, loại bỏ các tham số khỏi giá trị hành động của biểu mẫu.
Jay

@Jay Vấn đề rõ ràng là người dùng cần duy trì các tham số URL, do đó, nói "xóa chúng" sẽ không giúp ích gì
Chuck Le Mông

@ChuckLeButt Nói "nhưng tôi cần làm điều này không hiệu quả" không phải là một điều hữu ích để nói. Nếu ai đó nói với tôi, "Tôi cứ xoay núm điều khiển vô tuyến nhưng xe của tôi sẽ không di chuyển", câu trả lời duy nhất tôi có thể nghĩ là: "Xoay núm điều khiển radio không làm cho xe chuyển động. Bạn phải quay phím đánh lửa và nhấn bàn đạp ga. " Để trả lời, "nhưng tôi cần làm cho chiếc xe di chuyển bằng cách xoay núm radio" là một phản ứng không hiệu quả. Nó không hoạt động. Nó sẽ không hoạt động.
Jay

-3

Điều này là để đáp lại bài viết trên của Efx:

Nếu URL đã chứa var bạn muốn thay đổi, thì nó lại được thêm vào dưới dạng một trường ẩn.

Dưới đây là sửa đổi mã đó để ngăn việc sao chép các vars trong 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>

thay đổi phương thức yêu cầu thành 'POST' thay vì 'GET'.


-4

Tôi thường viết một cái gì đó như thế này:

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

Điều này đang hoạt động, nhưng đừng quên vệ sinh đầu vào của bạn chống lại các cuộc tấn công XSS!

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.