Bir HTML formunun eylem özelliği için boş bir URL kullanmak iyi bir uygulama mudur? (Aksiyon = “”)


279

Herkes geçerli sayfaya geri göndermek için boş HTML formu eylemleri kullanarak "en iyi yöntemler" yanıt verebilir olup olmadığını merak ediyorum.

Orada boş bir HTML form eylemi burada ne yaptığını soran bir mesaj ve benzeri bazı sayfalar bu bir o gayet önermek ama insanların ne düşündüğünü bilmek istiyorum.


7
Buna "en iyi uygulamalar" etiketi öneriliyor.
Will Morgan

İki kez onaylamak için işlemi boş bırakın veya bir işlemden hiç bahsetmeyin (beğen <form name="xyz" >). Eylemi kendi başına sunacaktır.
lwpro2

11
Action özniteliğini dahil etmemek , sayfayı bir saldırganın sayfanızı bir iframe içine sardığı ve iframe URL'sinin bir form alanı ile aynı ada sahip bir sorgu parametresi içerdiği gibi iframe clickjacking saldırılarına kadar sayfayı açar . Form gönderildiğinde, sorgu değeri veritabanına eklenir, böylece kullanıcının kimlik bilgileri (e-posta, adres vb.) Tehlikeye atılır.
Paul Sweatte

Peki, geçerli sayfaya form göndermenin geçerli ve güvenli yolu nedir?
Costa

Yanıtlar:


268

Yapabileceğiniz en iyi şey, aksiyon özelliğini tamamen dışarıda bırakmaktır. Dışarıda bırakırsanız, form belgenin adresine, yani aynı sayfaya gönderilir.

Boş bırakmak da mümkündür ve HTML'nin form gönderme algoritmasını uygulayan herhangi bir tarayıcı , dokümanın adresine eşdeğer olarak davranacaktır, çünkü bu tarayıcılar şu anda şu şekilde çalışır:

8.Eylem, gönderen öğenin eylemi olsun .

9.İşlem boş dize ise, eylemin belgenin adresi olmasına izin verin .

Not: Bu adım, burada temel URL işlemeyi gerektiren RFC 3986'nın kasıtlı bir ihlalidir . Bu ihlal, eski içerikle uyumluluk arzusundan kaynaklanmaktadır. [RFC3986]

Bu kesinlikle mevcut tüm tarayıcılarda çalışır, ancak bazı eski tarayıcılarda beklendiği gibi çalışmayabilir ( " tarayıcılar boş bir eylemle garip şeyler yapar =" "öznitelik " ), bu yüzden spec yazarların boş bırakmasını kesinlikle önler :

actionVe formactioniçerik nitelikleri, belirtilmişse, bir bir değere sahip olmalıdır potansiyel boşluklarla çevrili geçerli boş olmayan bir URL .


12
Muhtemelen bu cevabınızdan bu yana değişti (neredeyse üç yıl oldu), ancak bugün itibariyle HTML5 izin vermiyoraction=""
derobert

2
@derobert Teşekkürler. Bu muhtemelen değişmemişti. Cevabın söylediklerini daha iyi yansıtmak için cevabımı değiştirdim.
mercator 13:12

73

Aslında, geçerli HTML5 taslağının Form Gönderme alt bölümüne izin verilmez action="". Bu spec karşı.

actionVe formactioniçerik nitelikleri, belirtilmişse geçerli olan bir değere sahip olmalıdır boş olmayan potansiyel boşluklarla çevrili URL. (vurgu eklenmiştir)

Mercator'ın cevabındaki alıntılanan bölüm yazarlar değil uygulamalar için bir gerekliliktir . Yazarlar yazarın gereksinimlerini karşılamalıdır. Alıntı bu şartname nasıl okunmalı :

Özellikle üreticiler için, örneğin yazarlar ve oluşturdukları belgeler için geçerli olan uyumluluk gereksinimleri vardır ve tüketiciler için, örneğin Web tarayıcıları için geçerli olan uyumluluk gereksinimleri vardır. İhtiyaç duydukları şey ile ayırt edilebilirler: bir üretici için bir gereklilik neye izin verildiğini belirtirken, bir tüketici için bir gereksinim yazılımın nasıl hareket edeceğini belirtir.

Boş bir URL'ye izin veren HTML4'teki değişiklik, “ tarayıcılar boş bir action=""özniteliğe sahip tuhaf şeyler yapıyor ” nedeniyle yapıldı. Değişikliğin nedeni göz önüne alındığında, muhtemelen HTML4'te bunu yapmamak en iyisidir.


actionÖzniteliğin tamamen yokluğunun , formun belge adresine göndermesi gerektiğini belirtmesine izin veriyor mu ? Öyle görünüyor ki, "belirtildiyse" diyor.
Kerrick

2
@Kerrick Evet, HTML5'in action özniteliğini tamamen atlamaya izin verdiğine ve boş dizeye varsayılan olarak geldiğine inanıyorum. HTML4 yapmadı, gerekli eylemi belirtir.
derobert

@Kerrick ile hemfikirim, eylem niteliğini atlamasına izin verilir. Geçerli HTML5 taslağında okuma yaparken, boş dizeye izin verilmiyor, ancak özelliğin yokluğuna izin verildiği anlaşılıyor. Ancak her durumda, uyumluluk nedeniyle, her zaman "action" özelliğini eklemenizi ve geçerli olmayan bir URL ile doldurmanızı öneririm (iyi uygulamalar her zaman en iyi yoldur).
serfer2

Potansiyel bir sorun: AngularJS, eylem özelliği olmadan formların gönderilmesini engelleyecektir. Muhtemelen yaygın bir sorun değil, ancak eski sitemizin bölümlerinin neden kırılmaya başladığını anlamak biraz zaman aldı.
Asmor

18

Action özniteliğini dahil etmemek , sayfayı birkaç basit adım içeren iframe clickjacking saldırılarına kadar açar :

  • Saldırgan, sayfanızı iframe içine sarar
  • İframe URL'si, form alanıyla aynı ada sahip bir sorgu parametresi içerir
  • Form gönderildiğinde, sorgu değeri veritabanına eklenir
  • Kullanıcının kimlik bilgileri (e-posta, adres vb.) Ele geçirildi

Referanslar


2
İframe URL'si GET parametreleri içermezken formlar genellikle POST kullanılarak gönderilir mi? Yani site sadece POST parametreleriyle ilgileniyorsa sorun olmamalı değil mi? En azından ben genellikle sadece formları işlerken $ _POST dizi PHP kullanın.
Mart'ta Calmarius

2
@Calmarius Evet, kullanım $_POSTyerine $_REQUESTbu önlemek için. Çerçeve kodu kullanılıyorsa $_REQUEST, bir iframe tanımlama kullanın .
Paul Sweatte

17

Bu HTML5 ile doğrulanacaktır.

<form action="#">

4
Ben denemedim, ama kavramsal olarak o gönderildikten sonra sayfanın üstüne kaydırmak olmaz?
Matt Mitchell

2
Kullanamaz mısın action="."?
s427

3
action = "?" çok iyi çalışıyor. Dize verisi olmadan geçerli sayfayı doğrular ve işaret eder.
Chris Broski

5
action="."genel durum için kötü bir fikirdir. Gibi bir URL example.com/loginyalnızca ile eşlenir example.com/.
Torsten Bronger

1
Bu yanıt yalnızca kullanıcı sayfanın üstüne gitmek isterse geçerlidir.
Buts

9

HTML action=""5'DE DESTEKLENMEDİĞİ BU BUNU YAPMAYIN. KÖTÜ UYGULAMA.

Bunun yerine, eylemi tamamen reddederseniz, varsayılan olarak aynı sayfaya gönderilir, bunun en iyi uygulama olduğuna inanıyorum:

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

Eğer php kullanarak formu yuvarlanıyorsa, aşağıdakileri dikkate almak isteyebilirsiniz. buradan daha fazla bilgi edinebilirsiniz.

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

Alternatif olarak #, bunun bir çapa gibi davranacağını ve sayfanın üst kısmına kaydırılacağını unutmayın.

<form action="#">

Birisi neden bu cevaba oy verdiğini anlamak ister misiniz?
Buts

Action niteliğini ommit edersiniz, istismarlara açık olan form bağlantıdaki ilk sayfada ayrıntılı olarak açıklanıyor mu?
Richard Young

@RichardYoung Üzgünüm Sorunuzu anlamıyorum. Lütfen yeniden ifade edin.
Buts

1
$ _SERVER ["PHP_SELF"] değişkeni bilgisayar korsanları tarafından kullanılabilir. Sayfanızda PHP_SELF kullanılıyorsa, kullanıcı bir eğik çizgi (/) ve ardından yürütmek için bazı Siteler Arası Komut Dosyası (XSS) komutları girebilir. Action özelliğini atlarsanız, buna karşı hala savunmasız mısınız?
Richard Young

Evet öylesin. Action niteliği istemci tarafına geri eklenebilir ve herhangi bir seçim değeri verilebilir. Ancak bu htmlspecialchars()işlevi kullanmak insanların size karşı php komut dosyası kullanmasını durur.
Buts

4

Normalde XHTML geçerli olan ve URL'deki GET verilerini tutan action = "" kullanıyorum.


4
Nadiren, ancak örneğin, benim forumda, URL olurdu: thread.php? İd = 12 & page = 6 ve yorum eklemek için sayfanın alt kısmında bir POST formu ve PHP böylece GET verileri gerekir yorumu hangi konuya ekleyeceğini bilir.
Juddling

20
GET, formlar için varsayılan yöntemdir - bu kötü bir şey değildir ;-) w3.org/TR/html401/interact/forms.html#adef-method
NickFitz

5
Formlarda GET kullanma olduğu kötü bir şey. Kullanıcı gönderdikten sonra sayfayı yeniden yüklerse, istenmeyen sonuçlar olabilir. Ancak bir POST kullanılırsa, tarayıcı aynı verileri yeniden göndermesi konusunda uyarır.
Sheppard

22
@WillSheppard Katılıyorum. Böyle battaniye bir açıklama yapamazsınız. Her şey formun ne yaptığına bağlıdır. Bir eylem gerçekleştiren herhangi bir şey için POST kullanmalısınız (örneğin, bir foruma yeni bir yazı ekleme), ancak diğer her şey için GET (örneğin, bir arama kutusu veya gezinme formları kullanma). Başarılı bir POST sonrasında, kullanıcının verileri yeniden göndermesini önlemek için komut dosyasının tarayıcıyı yeniden yönlendirmesi gerekir.
Mike

3
PS, tüm tarayıcılar kullanıcıyı POST verilerini yeniden gönderme konusunda uyarmaz (ör. Opera)
Mike

4

Formun nerede yayınlandığını açıkça belirtmek en iyisi olduğunu düşünüyorum . Tamamen güvende olmak istiyorsanız, formun kendisine geri gönderilmesini istiyorsanız eylem özelliğine aynı URL'yi girin. Ana tarayıcılar ""aynı sayfayı değerlendirse de, ana akım olmayan tarayıcıların olacağını garanti edemezsiniz.

Ve elbette, Juddling gibi GET verilerini içeren URL'nin tamamı dikkat çekiyor.


2

Sadece kullan

?

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

HTML5 standartlarını ihlal etmez.


Ben aldatmadım ama yöntem tüm getparams düşecek . Aşağıdaki URL'deki bir form kırılacaktır example.com/update_user?user_id=1çünkü formexample.com/update_user?
vikki'ye gönderilecek

1

Klasik ASP ile çalışırken bunu çok yapardım. Genellikle giriş için bir çeşit sunucu tarafı doğrulaması gerektiğinde (AJAX günlerinden önce) kullandım. Gördüğüm en temel dezavantajı, programlama mantığını dosya düzeyinde sunumdan ayırmamasıdır.


1
neden olmasın? Sanırım bağlı değil. Ben aynı sayfaya veri göndermek bir form olabilir ve denetleyici ve görünüm doğru ayırma ile bu sayfa oluşturmak.
markus

1

Ben hiç eylem niteliği belirtmek için kullanın. Aslında benim çerçevem ​​bu şekilde tasarlanır ve tüm sayfalar tam olarak aynı adrese geri gönderilir. Ama bugün problemi keşfettim. Bazen bazı arka plan çağrısı yapmak için eylem öznitelik değeri ödünç alıyorum (sanırım bazı insanlar onları AJAX olarak adlandırıyor). Bu yüzden eylem niteliği belirtilmemişse IE'nin eylem niteliği değerini boş tuttuğunu gördüm. Anladığım kadarıyla biraz garip, çünkü herhangi bir eylem özelliği belirtilmemişse, JavaScript karşılığı en azından tanımsız olmalıdır. Her neyse, benim açımdan, daha fazla bağlam anlamanız gereken en iyi uygulamayı seçmeden önce, örneğin JavaScript'te kullanacaksınız veya kullanamayacaksınız.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.