Có phải là một cách thực hành tốt để sử dụng URL trống cho thuộc tính hành động của biểu mẫu HTML không? (hành động = Quảng chí)


279

Tôi tự hỏi liệu có ai có thể đưa ra phản hồi "thực tiễn tốt nhất" cho việc sử dụng các hành động biểu mẫu HTML trống để đăng lại trang hiện tại không.

một bài viết hỏi hành động dạng HTML trống ở đây là gì và một số trang như thế này cho thấy nó ổn nhưng tôi muốn biết mọi người nghĩ gì.


7
Đề xuất thẻ "thực hành tốt nhất" được áp dụng cho điều này.
Will Morgan

Để đôi khi xác nhận, hãy để trống hành động hoặc đơn giản là không đề cập đến một hành động nào cả (như <form name="xyz" >). Nó sẽ tự gửi hành động.
lwpro2

11
Không bao gồm thuộc tính hành động sẽ mở trang lên tới các cuộc tấn công nhấp chuột iframe , chẳng hạn như một trong đó kẻ tấn công bao bọc trang của bạn trong iframe và URL iframe bao gồm một tham số truy vấn có cùng tên với trường biểu mẫu. Khi biểu mẫu được gửi, giá trị truy vấn được chèn vào cơ sở dữ liệu, do đó thông tin nhận dạng người dùng (email, địa chỉ, v.v.) đã bị xâm phạm.
Paul Sweatte

Vì vậy, cách hợp lệ, an toàn để gửi biểu mẫu đến trang hiện tại là gì?
Costa

Câu trả lời:


268

Điều tốt nhất bạn có thể làm là bỏ hoàn toàn thuộc tính hành động. Nếu bạn để nó ra, biểu mẫu sẽ được gửi đến địa chỉ của tài liệu, tức là cùng một trang.

Cũng có thể để trống và bất kỳ trình duyệt nào thực hiện thuật toán gửi biểu mẫu HTML sẽ coi nó tương đương với địa chỉ của tài liệu, điều này chủ yếu là vì đó là cách trình duyệt hiện hoạt động:

8.Hãy hành động là yếu tố nộp của hành động .

9.Nếu hành động là chuỗi trống, hãy để hành động là địa chỉ của tài liệu .

Lưu ý: Bước này là vi phạm cố ý RFC 3986, sẽ yêu cầu xử lý URL cơ sở tại đây. Vi phạm này được thúc đẩy bởi mong muốn tương thích với nội dung cũ. [RFC3986]

Điều này chắc chắn hoạt động trong tất cả các trình duyệt hiện tại, nhưng có thể không hoạt động như mong đợi trong một số trình duyệt cũ hơn ( " trình duyệt làm những điều kỳ lạ với một hành động trống =" "thuộc tính " ), đó là lý do tại sao thông số này không khuyến khích các tác giả bỏ trống :

Các thuộc tính actionformactionnội dung, nếu được chỉ định, phải có một giá trị là một URL không trống hợp lệ có khả năng được bao quanh bởi các khoảng trắng .


12
Có thể điều này đã thay đổi kể từ câu trả lời của bạn (đã gần ba năm), nhưng cho đến ngày hôm nay, HTML5 không cho phép action=""câu trả lời của tôi ...
derobert

2
@derobert Cảm ơn. Điều này có lẽ đã không thay đổi. Tôi đã thay đổi câu trả lời của mình để phản ánh tốt hơn những gì thông số kỹ thuật nói.
Mercator

73

Trên thực tế, phần phụ nộp Mẫu của dự thảo HTML5 hiện tại không cho phép action="". Nó chống lại thông số kỹ thuật.

Các thuộc tính actionformactionnội dung, nếu được chỉ định, phải có một giá trị là một URL không trống hợp lệ có khả năng được bao quanh bởi các khoảng trắng. (nhấn mạnh thêm)

Phần trích dẫn trong câu trả lời của Mercator là một yêu cầu về việc triển khai , không phải tác giả . Tác giả phải tuân theo các yêu cầu của tác giả. Để trích dẫn Cách đọc thông số kỹ thuật này :

Cụ thể, có các yêu cầu tuân thủ áp dụng cho nhà sản xuất, ví dụ như tác giả và tài liệu họ tạo và có yêu cầu tuân thủ áp dụng cho người tiêu dùng, ví dụ như trình duyệt Web. Chúng có thể được phân biệt bởi những gì chúng yêu cầu: một yêu cầu đối với nhà sản xuất nêu rõ những gì được phép, trong khi yêu cầu đối với người tiêu dùng nói rằng phần mềm hoạt động như thế nào.

Sự thay đổi từ HTML4 đã cho phép một URL trống được thực hiện bởi vì các trình duyệt của Wikipedia làm những điều kỳ lạ với một action=""thuộc tính trống . Xem xét lý do cho sự thay đổi, có lẽ tốt nhất không nên làm điều đó trong HTML4.


Liệu nó có cho phép sự vắng mặt actionhoàn toàn của thuộc tính để chỉ ra biểu mẫu nên gửi đến địa chỉ tài liệu không? Dường như, vì nó nói, "nếu được chỉ định."
Kerrick

2
@Kerrick Có, tôi tin rằng HTML5 cho phép bỏ hoàn toàn thuộc tính hành động và mặc định nó là chuỗi rỗng. HTML4 thì không, nó chỉ định hành động theo yêu cầu.
derobert

Tôi đồng ý với @Kerrick, nó được phép bỏ qua thuộc tính hành động. Đọc tại draf HTML5 hiện tại, có vẻ như chuỗi trống không được phép nhưng sự vắng mặt của thuộc tính được cho phép. Nhưng trong mọi trường hợp, vì lý do tương thích, tôi khuyên bạn nên luôn bao gồm thuộc tính "hành động" và điền vào đó bằng một URL không trống hợp lệ (thực tiễn tốt luôn là cách tốt nhất).
serfer2

Một gotcha tiềm năng: AngularJS sẽ ngăn việc gửi biểu mẫu mà không có thuộc tính hành động. Có lẽ không phải là một vấn đề phổ biến, nhưng tôi phải mất một thời gian để tìm hiểu tại sao các phần của trang web di sản của chúng tôi bắt đầu bị phá vỡ.
Asmor

18

Không bao gồm thuộc tính hành động sẽ mở trang lên tới các cuộc tấn công nhấp chuột iframe , bao gồm một vài bước đơn giản:

  • Kẻ tấn công bao bọc trang của bạn trong iframe
  • URL iframe bao gồm một tham số truy vấn có cùng tên với trường biểu mẫu
  • Khi biểu mẫu được gửi, giá trị truy vấn được chèn vào cơ sở dữ liệu
  • Thông tin nhận dạng của người dùng (email, địa chỉ, v.v.) đã bị xâm phạm

Người giới thiệu


2
Không phải URL iframe chứa tham số GET, trong khi các biểu mẫu thường được gửi bằng POST? Vì vậy, nếu trang web chỉ xử lý các tham số POST thì đó không phải là vấn đề phải không? Ít nhất tôi thường chỉ sử dụng mảng $ _POST trong PHP khi xử lý các biểu mẫu.
Calmarius 20/03/2015

2
@Calmarius Có, sử dụng $_POSTthay vì $_REQUESTđể tránh điều này. Nếu mã khung sử dụng $_REQUEST, sử dụng buster iframe .
Paul Sweatte 22/03/2015

17

Điều này sẽ xác thực với HTML5.

<form action="#">

4
Tôi đã không thử nó, nhưng về mặt khái niệm sẽ không cuộn lên đầu trang sau khi gửi?
Matt Mitchell

2
Bạn không thể sử dụng action="."?
s427

3
hành động = "?" hoạt động tốt quá Nó xác nhận và trỏ đến trang hiện tại mà không có và truy vấn dữ liệu chuỗi.
Chris Broski

5
action="."là một ý tưởng tồi cho trường hợp chung. Một URL như example.com/loginđược ánh xạ tới chỉ example.com/.
Torsten Bronger

1
Câu trả lời này chỉ hợp lệ nếu người dùng muốn cuộn lên đầu trang.
Buts

9

TRONG HTML 5 action=""KHÔNG ĐƯỢC HPORT TRỢ NÀO ĐỪNG LÀM ĐIỀU NÀY. THỰC HÀNH BAD.

Nếu thay vào đó, bạn hoàn toàn phủ nhận hành động hoàn toàn, nó sẽ gửi đến cùng một trang theo mặc định, tôi tin rằng đây là cách thực hành tốt nhất:

<form>This will submit to the current page</form>

Nếu bạn đang sử dụng biểu mẫu bằng cách sử dụng php, bạn có thể muốn xem xét các điều sau đây. đọc thêm về nó ở đây

<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">

Ngoài ra, bạn có thể sử dụng #chú ý mặc dù điều này sẽ hoạt động như một mỏ neo và cuộn lên đầu trang.

<form action="#">

Có muốn hiểu tại sao ai đó đã bỏ phiếu trả lời này không?
Buts

Bạn có thuộc tính hành động, biểu mẫu vẫn mở để khai thác được chi tiết trên trang đầu tiên trên liên kết?
Richard Young

@RichardYoung Xin lỗi tôi không hiểu câu hỏi của bạn. Vui lòng viết lại.
Buts

1
Biến $ _SERVER ["PHP_SELF"] có thể được sử dụng bởi tin tặc. Nếu PHP_SELF được sử dụng trong trang của bạn thì người dùng có thể nhập dấu gạch chéo (/) và sau đó một số lệnh Cross Site Scripting (XSS) để thực thi. Nếu bạn bỏ qua thuộc tính hành động, bạn vẫn dễ bị tổn thương này?
Richard Young

Vâng, bạn có. Thuộc tính hành động có thể được thêm lại ở phía máy khách và đưa ra bất kỳ giá trị lựa chọn nào. Tuy nhiên, việc sử dụng htmlspecialchars()chức năng ngăn mọi người khỏi mọi người sử dụng tập lệnh php của bạn chống lại bạn.
Buts

4

Tôi thường sử dụng action = "", đó là XHTML hợp lệ và giữ lại dữ liệu GET trong URL.


4
Hiếm khi, nhưng ví dụ, trong diễn đàn của tôi, tôi sẽ có URL: thread.php? Id = 12 & page = 6 và có một biểu mẫu POST ở cuối trang để thêm nhận xét và tôi cần dữ liệu GET để PHP biết chủ đề nào để thêm nhận xét.
Đánh bóng

20
GET là phương thức mặc định cho các biểu mẫu - hầu như không phải là điều xấu ;-) w3.org/TR/html401/interact/forms.html#adef-method
NickFitz

5
Sử dụng GET trong các hình thức một điều xấu. Nếu người dùng tải lại trang sau khi gửi, có thể có những hậu quả không lường trước được. Tuy nhiên, nếu POST được sử dụng, trình duyệt sẽ cảnh báo về việc gửi lại cùng một dữ liệu.
Will Sheppard

22
@WillSheppard Tôi không đồng ý. Bạn không thể đưa ra một tuyên bố chăn như thế. Tất cả phụ thuộc vào những gì hình thức làm. Bạn nên sử dụng POST cho bất cứ điều gì thực hiện một hành động (ví dụ: chèn một bài đăng mới trong diễn đàn), nhưng NHẬN cho mọi thứ khác (ví dụ: hộp tìm kiếm hoặc sử dụng biểu mẫu để điều hướng). Sau khi POST thành công, tập lệnh sẽ chuyển hướng trình duyệt để ngăn người dùng gửi lại dữ liệu.
Mike

3
PS không phải tất cả các trình duyệt đều cảnh báo người dùng về việc gửi lại dữ liệu POST (ví dụ Opera)
Mike

4

Tôi nghĩ rằng tốt nhất là nêu rõ nơi gửi biểu mẫu. Nếu bạn muốn hoàn toàn an toàn, hãy nhập cùng một URL mà biểu mẫu được bật trong thuộc tính hành động nếu bạn muốn nó gửi lại chính nó. Mặc dù các trình duyệt chính đánh giá ""cùng một trang, bạn không thể đảm bảo rằng các trình duyệt không chính thống sẽ.

Và tất nhiên, toàn bộ URL bao gồm dữ liệu GET như Juddling chỉ ra.


2

Chỉ dùng

?

<form action="?" method="post" enctype="multipart/form-data" name="myForm" id="myForm">

Nó không vi phạm các tiêu chuẩn HTML5.


Tôi đã không downvote nhưng phương pháp của bạn sẽ bỏ tất cả các thông số get. Một biểu mẫu trên url sau sẽ bị example.com/update_user?user_id=1example.com/update_user?
hỏng

1

Tôi đã từng làm điều này rất nhiều khi tôi làm việc với Classic ASP. Thông thường tôi đã sử dụng nó khi cần xác thực phía máy chủ một số loại cho đầu vào (trước ngày AJAX). Điểm thu hút chính mà tôi thấy là nó không tách rời logic lập trình khỏi phần trình bày, ở cấp độ tệp.


1
tại sao không? Tôi nghĩ rằng nó không được kết nối. Tôi có thể có một biểu mẫu đăng dữ liệu lên cùng một trang và xây dựng trang này với sự phân tách thích hợp giữa bộ điều khiển và chế độ xem.
markus

1

Tôi sử dụng để không chỉ định thuộc tính hành động nào cả. Đó thực sự là cách khung của tôi được thiết kế tất cả các trang được gửi lại chính xác đến cùng một địa chỉ. Nhưng hôm nay tôi phát hiện ra vấn đề. Đôi khi tôi mượn giá trị thuộc tính hành động để thực hiện một số cuộc gọi nền (tôi đoán một số người đặt tên cho chúng là AJAX). Vì vậy, tôi thấy rằng IE giữ giá trị thuộc tính hành động là trống nếu thuộc tính hành động không được chỉ định. Theo tôi hiểu thì hơi lạ một chút, vì nếu không có thuộc tính hành động nào được chỉ định, thì đối tác JavaScript ít nhất phải không được xác định. Dù sao, quan điểm của tôi là trước khi bạn chọn thực hành tốt nhất, bạn cần hiểu thêm ngữ cảnh, giống như bạn sẽ sử dụng thuộc tính trong JavaScript hay không.

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.