Apakah ini praktik yang baik untuk menggunakan URL kosong untuk atribut tindakan formulir HTML? (aksi = "")

279

Saya bertanya-tanya apakah ada yang bisa memberikan respons "praktik terbaik" untuk menggunakan tindakan formulir HTML kosong untuk mengirim kembali ke halaman saat ini.

Ada posting yang menanyakan apa yang dilakukan tindakan formulir HTML kosong di sini dan beberapa halaman seperti ini menyarankan itu baik-baik saja tetapi saya ingin tahu apa yang dipikirkan orang.

Matt Mitchell
sumber
7
Tag "praktik terbaik" yang disarankan diterapkan untuk ini.
Will Morgan
Untuk mengonfirmasi dua kali lipat, biarkan tindakan kosong, atau tidak menyebutkan tindakan sama sekali (seperti <form name="xyz" >). Ini akan mengirimkan tindakan sendiri.
lwpro2
11
Tidak termasuk atribut tindakan membuka halaman hingga serangan clickjacking iframe , seperti yang mana penyerang membungkus halaman Anda dalam iframe dan URL iframe menyertakan param kueri dengan nama yang sama dengan bidang formulir. Ketika formulir dikirimkan, nilai kueri dimasukkan ke dalam basis data, sehingga informasi pengidentifikasi pengguna (email, alamat, dll) telah dikompromikan.
Paul Sweatte
Jadi, apa cara yang valid dan aman untuk mengirimkan formulir ke halaman saat ini?
Costa

Jawaban:

268

Hal terbaik yang dapat Anda lakukan adalah meninggalkan atribut tindakan sama sekali. Jika Anda meninggalkannya, formulir akan dikirimkan ke alamat dokumen, yaitu halaman yang sama.

Dimungkinkan juga untuk membiarkannya kosong, dan browser apa pun yang menerapkan algoritma pengajuan formulir HTML akan memperlakukannya sebagai setara dengan alamat dokumen, yang ia lakukan terutama karena itulah cara browser saat ini bekerja:

8.Biarkan tindakan menjadi unsur submitter ini tindakan .

9.Jika aksi adalah string kosong, biarkan aksi menjadi alamat dokumen .

Catatan: Langkah ini adalah a pelanggaran yang disengaja terhadap RFC 3986, yang akan membutuhkan pemrosesan URL dasar di sini. Pelanggaran ini dimotivasi oleh keinginan untuk kompatibilitas dengan konten lawas. [RFC3986]

Ini pasti bekerja di semua browser saat ini, tetapi mungkin tidak berfungsi seperti yang diharapkan di beberapa browser lama ( " browser melakukan hal-hal aneh dengan atribut action =" "kosong " ), itulah sebabnya mengapa spec sangat mencegah penulis untuk membiarkannya kosong :

The actiondan formactionkonten atribut, bila ditentukan, harus memiliki nilai yang merupakan URL non-kosong valid berpotensi dikelilingi oleh spasi .

mercator
sumber
12
Mungkin ini telah berubah sejak jawaban Anda (sudah hampir tiga tahun), tetapi pada hari ini, HTML5 tidak mengizinkan action=""— lihat jawaban saya ...
derobert
2
@derobert Terima kasih. Ini mungkin tidak berubah. Saya telah mengubah jawaban saya untuk lebih mencerminkan apa yang dikatakan oleh spec.
Mercator
73

Sebenarnya, subbagian Formulir dari draft HTML5 saat ini tidak memungkinkan action="". Itu bertentangan dengan spec.

The actiondan formactionkonten atribut, bila ditentukan, harus memiliki nilai yang valid non-kosong URL berpotensi dikelilingi oleh spasi. (penekanan ditambahkan)

Bagian yang dikutip dalam jawaban mercator adalah persyaratan implementasi , bukan penulis . Penulis harus mengikuti persyaratan penulis. Mengutip Cara membaca spesifikasi ini :

Secara khusus, ada persyaratan kesesuaian yang berlaku untuk produsen, misalnya penulis dan dokumen yang mereka buat, dan ada persyaratan kesesuaian yang berlaku untuk konsumen, misalnya browser Web. Mereka dapat dibedakan oleh apa yang mereka butuhkan: persyaratan pada negara produsen menyatakan apa yang diizinkan, sementara persyaratan pada konsumen menyatakan bagaimana perangkat lunak harus bertindak.

Perubahan dari HTML4 — yang memang memungkinkan URL kosong — dibuat karena “ browser melakukan hal-hal aneh dengan action=""atribut kosong ”. Mengingat alasan untuk perubahan, mungkin yang terbaik untuk tidak melakukan itu di HTML4 juga.

derobert
sumber
Apakah ini memungkinkan absen total actionatribut secara bersamaan untuk menunjukkan formulir yang harus diserahkan ke alamat dokumen? Tampaknya, karena dikatakan, "jika ditentukan."
Kerrick
2
@Kerrick Ya, saya percaya HTML5 memungkinkan menghilangkan atribut action seluruhnya, dan default-nya adalah string kosong. HTML4 tidak, itu menentukan tindakan yang diperlukan.
derobert
Saya setuju dengan @Kerrick, diizinkan untuk menghilangkan atribut action. Membaca di HTML5 draf saat ini, tampaknya string kosong tidak diizinkan tetapi tidak adanya atribut yang diizinkan. Tetapi bagaimanapun juga, untuk alasan kompatibilitas, saya sarankan Anda untuk selalu menyertakan atribut "aksi" dan mengisinya dengan URL yang tidak kosong yang valid (praktik yang baik selalu merupakan cara terbaik).
serfer2
Satu potensi gotcha: AngularJS akan mencegah pengiriman formulir tanpa atribut tindakan. Mungkin bukan masalah umum, tapi butuh beberapa saat untuk mencari tahu mengapa bagian situs warisan kami mulai rusak.
Asmor
18

Tidak termasuk atribut tindakan membuka halaman hingga iframe serangan clickjacking , yang melibatkan beberapa langkah sederhana:

  • Seorang penyerang membungkus halaman Anda dalam iframe
  • URL iframe menyertakan param kueri dengan nama yang sama dengan bidang formulir
  • Saat formulir dikirimkan, nilai kueri dimasukkan ke dalam basis data
  • Informasi identitas pengguna (email, alamat, dll) telah dikompromikan

Referensi

Paul Sweatte
sumber
2
Bukankah URL iframe berisi parameter GET, sementara formulir biasanya dikirimkan menggunakan POST? Jadi jika situs hanya berurusan dengan parameter POST maka itu seharusnya tidak menjadi masalah bukan? Setidaknya saya biasanya menggunakan array $ _POST dalam PHP hanya saat memproses formulir.
Calmarius
2
@Calmarius Ya, gunakan $_POSTbukannya $_REQUESTuntuk menghindari ini. Jika menggunakan kode kerangka kerja $_REQUEST, gunakan buster iframe .
Paul Sweatte
17

Ini akan divalidasi dengan HTML5.

<form action="#">

sumber
4
Saya belum mencobanya, tetapi secara konsep apakah itu tidak akan gulir ke bagian atas halaman setelah pengiriman?
Matt Mitchell
2
Tidak bisa Anda gunakan action="."?
s427
3
action = "?" berfungsi dengan baik juga. Ini memvalidasi dan menunjuk ke halaman saat ini tanpa dan permintaan data string.
Chris Broski
5
action="."adalah ide yang buruk untuk kasus umum. URL suka example.com/logindipetakan menjadi semata example.com/.
Torsten Bronger
1
Jawaban ini hanya valid jika pengguna ingin menggulir ke bagian atas halaman.
Buts
9

DALAM HTML 5 action="" TIDAK DIDUKUNG, JANGAN MELAKUKAN INI. PRAKTEK BURUK.

Jika alih-alih Anda sepenuhnya meniadakan tindakan, semua itu akan dikirimkan ke laman yang sama secara default, saya yakin ini adalah praktik terbaik:

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

Jika Anda membuang formulir menggunakan php, Anda mungkin ingin mempertimbangkan yang berikut ini. baca lebih lanjut di sini.

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

Atau Anda dapat menggunakan #diingat bahwa ini akan bertindak seperti jangkar dan gulir ke bagian atas halaman.

<form action="#">
Tapi s
sumber
Ingin mengerti mengapa seseorang tidak memilih jawaban ini?
Buts
Anda keluar dari atribut tindakan, apakah formulir yang masih terbuka untuk eksploitasi dirinci pada halaman pertama pada tautan?
Richard Young
@RichardYoung Maaf saya tidak mengerti pertanyaan Anda. Harap ulangi.
Buts
1
Variabel $ _SERVER ["PHP_SELF"] dapat digunakan oleh peretas. Jika PHP_SELF digunakan di halaman Anda maka pengguna dapat memasukkan slash (/) dan kemudian beberapa perintah Cross Site Scripting (XSS) untuk dieksekusi. Jika Anda menghilangkan atribut tindakan, apakah Anda masih rentan terhadap ini?
Richard Young
Ya, kamu. Atribut tindakan dapat ditambahkan kembali di sisi klien dan diberi nilai pilihan apa pun. Namun menggunakan htmlspecialchars()fungsi ini menghentikan orang dari orang lain yang menggunakan skrip php Anda untuk menentang Anda.
Buts
4

Saya biasanya menggunakan action = "", yang XHTML valid dan menyimpan data GET di URL.

Menilai
sumber
4
Jarang, tetapi misalnya, di forum saya, saya akan memiliki URL: thread.php? Id = 12 & halaman = 6 dan ada formulir POST di bagian bawah halaman untuk menambahkan komentar, dan saya memerlukan data GET sehingga PHP tahu utas mana yang akan ditambahkan komentar.
Juddling
20
GET adalah metode standar untuk bentuk - itu hampir tidak hal yang buruk ;-) w3.org/TR/html401/interact/forms.html#adef-method
NickFitz
5
Menggunakan GET dalam bentuk adalah hal yang buruk. Jika pengguna memuat ulang halaman setelah mengirim, mungkin ada konsekuensi yang tidak diinginkan. Namun jika POST digunakan, browser akan memperingatkan tentang pengiriman ulang data yang sama.
Will Sheppard
22
@ WillSheppard, saya tidak setuju. Anda tidak dapat membuat pernyataan selimut seperti itu. Itu semua tergantung pada apa yang dilakukan formulir. Anda harus menggunakan POST untuk apa pun yang melakukan tindakan (misalnya memasukkan posting baru di forum), tetapi DAPATKAN untuk yang lain (misalnya kotak pencarian atau menggunakan formulir untuk navigasi). Setelah POST berhasil, skrip harus mengarahkan ulang browser untuk mencegah pengguna mengirimkan kembali data.
Mike
3
PS tidak semua browser memperingatkan pengguna tentang pengiriman ulang data POST (mis. Opera)
Mike
4

Saya pikir yang terbaik adalah secara eksplisit menyatakan di mana formulir dikirim. Jika Anda ingin benar-benar aman, masukkan URL yang sama dengan formulir aktif pada atribut tindakan jika Anda ingin mengirimkannya kembali ke URL itu sendiri. Meskipun browser mainstream mengevaluasi ""ke halaman yang sama, Anda tidak dapat menjamin bahwa browser non-mainstream akan melakukannya.

Dan tentu saja, seluruh URL termasuk GET data seperti Juddling tunjukkan.

Will Morgan
sumber
2

Gunakan saja

?

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

Itu tidak melanggar standar HTML5.

M_R_K
sumber
Saya tidak mengundurkan diri tetapi metode Anda akan membatalkan semua getparams. Formulir pada url berikut akan rusak example.com/update_user?user_id=1karena formulir akan dikirimkan keexample.com/update_user?
vikki
1

Saya sering melakukan ini ketika saya bekerja dengan ASP Klasik. Biasanya saya menggunakannya ketika validasi sisi server diperlukan semacam input (sebelum hari-hari AJAX). Kelemahan utama yang saya lihat adalah tidak memisahkan logika pemrograman dari presentasi, pada tingkat file.

busse
sumber
1
kenapa tidak? Saya pikir itu tidak terhubung. Saya dapat meminta formulir mengirim data ke halaman yang sama dan membangun halaman ini dengan pemisahan controller dan tampilan yang tepat.
markus
1

Saya menggunakan untuk tidak menentukan atribut tindakan sama sekali. Sebenarnya bagaimana kerangka saya dirancang semua halaman bisa dikirim kembali tepat ke alamat yang sama. Tetapi hari ini saya menemukan masalah. Terkadang saya meminjam nilai atribut tindakan untuk melakukan panggilan latar belakang (saya kira beberapa orang menamainya AJAX). Jadi saya menemukan bahwa IE menyimpan nilai atribut tindakan sebagai kosong jika atribut tindakan tidak ditentukan. Agak aneh dalam pemahaman saya, karena jika tidak ada atribut tindakan yang ditentukan, mitra JavaScript harus setidaknya tidak terdefinisi. Pokoknya, maksud saya adalah sebelum Anda memilih praktik terbaik, Anda perlu memahami lebih banyak konteks, seperti apakah Anda akan menggunakan atribut dalam JavaScript atau tidak.

Singagirl
sumber