2009-07-12 27 views
178

xem xét hình thức này:nộp một hình thức GET với params chuỗi truy vấn và params ẩn biến mất

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

Khi điền vào mẫu này (một hình thức GET) các thông số a và b đều biến mất. Có lý do nào cho điều đó không? Có cách nào để tránh hành vi này không?

+3

yếu tố hành động của bạn bị thay đổi. –

+0

Họ không nên biến mất, vì vậy tôi nghĩ rằng chúng tôi 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 có thể chỉ cần tạo HTML với biểu mẫu này và thấy rằng các thông số tôi chuyển trong hành động đang bị phân tách:

Trả lời

214

Đó không phải là những thông số ẩn để 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 tính vào bất kỳ trình duyệt nào giữ lại bất kỳ chuỗi truy vấn hiện tại 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) nhà nước:

Nếu phương pháp này là "nhận" và hành động là một HTTP URI, user agent mất giá trị của hành động , gắn thêm một `? ' với nó, 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-urlencoded".

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

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

5

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

+0

Có, ofcourse tôi sẽ làm điều này nếu có thể. Nhưng cho phép nói rằng tôi có các tham số trong chuỗi truy vấn và trong đầu vào bị ẩn, tôi có thể làm gì? –

+0

Tôi nghĩ tùy chọn duy nhất của bạn là phân tích cú pháp các cặp tên/giá trị chuỗi truy vấn và tạo ra các trường nhập ẩn. Có thể nếu bạn mô tả nhiều hơn một chút xung quanh ngữ cảnh của trang và URL, chúng tôi có thể đề xuất giải pháp làm việc. –

+0

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

1

Tôi đã có một vấn đề rất giống nơi cho các hình thức hành động, tôi đã có 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 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 truy cập vào 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 hiểu cách mã URL mà không có 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, do đó, nó bật ra /content/something cũng làm việc. Tôi cũng có thể đã sử dụng số nút (ví dụ: /node/123).

2

Công trình 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ì sẽ xảy ra nếu bạn thử điều này sẽ phụ thuộc vào quirks của trình duyệt. Tôi sẽ không ngạc nhiên nếu nó làm việc với một trình duyệt và không làm việc với một trình duyệt khác. Ngay cả khi nó xuất hiện để làm việc, 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 cho phép nói rằng tôi có tham số trong chuỗi truy vấn và trong đầu vào bị ẩn, tôi có thể làm gì?" Những gì bạn có thể làm là sửa lỗi. Không phải là để snide, nhưng điều này là một chút như yêu cầu, "Nhưng cho phép nói rằng URL của tôi sử dụng dấu hiệu phần trăm thay vì slashes, những gì 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.

+0

Toàn bộ câu trả lời này là chính xác về mặt kỹ thuật ("sai, do đó, sửa chữa nó") nhưng không sử dụng bất cứ điều gì. OP đã biết điều gì đó sai, và ở đây hỏi làm thế nào để sửa chữa nó. – Jason

+0

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

14

Những gì bạn có thể làm là sử dụng tính năng tìm kiếm đơ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'/>"); 
} 
+18

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 được ghi vào trang mà không cần thoát chúng trước. – drewm

+10

Việc bỏ qua cho đến khi lỗi XSS trong mã này được sửa. – spookylukey

+0

[Câu trả lời] (http://stackoverflow.com/a/7201286/3206908) cung cấp giải pháp tương tự nhưng không thể giải quyết được với XSS. – vvzh

57

Trong HTML5, đây là hành vi trên mỗi thông số.

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

Nhìn vào "4.10.22.3 thuật toán nộp Form", bước 17. Trong trường hợp của một hình thức GET để một http/s URI với một chuỗi truy vấn: điểm đến

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

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

Trong HTML 4.01, spec sản xuất URI không hợp lệ - hầu hết các trình duyệt không thực sự làm được điều này mặc dù ..

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

+0

điều này có nghĩa là: mọi thứ đằng sau '?' Trong url hành động bị xóa? Vì vậy, những gì được, nếu tham số GET trong url hành động có chứa các mục tiêu, nơi mà các hình thức nên được xử lý? như: 'action =" index.php? site = search "'. Tôi không chắc chắn, nếu đặt tham số GET trong trường nhập ẩn là một ý tưởng thần. –

+0

ý của bạn là gì theo từng thông số kỹ thuật @xyphoid? – AmiNadimi

0

Nếu bạn cần khắc phục, như hình thức này có thể được đặt trong các hệ thống 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 thông số thứ 3 vào truy vấn

-2
<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'.

-3

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'/>"; 
} 

này đang làm việc, nhưng đừng quên để khử trùng đầu vào của bạn chống lại các cuộc tấn công XSS!

-2

Đây là để đáp ứng với bài viết ở trên bởi EFX:

Nếu URL đã chứa var bạn muốn thay đổi, sau đó nó được thêm một lần nữa như một trường ẩn.

Đây là một biến thể của mã mà là để ngăn chặn sao chép vars trong URL:

foreach ($_GET as $key => $value) { 
    if ($key != "my_key") { 
     echo("<input type='hidden' name='$key' value='$value'/>"); 
    } 
} 
Các vấn đề liên quan