POST İyi Uygulamalar vs GET

10 Cevap php

Benim web uygulaması (PHP / MySQL) için, öğelerin bir listesini ve öğeyi silmek için her satırda bir bağlantı gösteriyor. Şu anda, bağlantı

<a href='item.php?id=3&action=delete'>Delete Item</a>

Bunun yerine POST kullanmak istedim eğer ... Ben (bu bir dinamik olarak oluşturulan liste) ne yapardınız? Ben bir form kullanmadan POST veri gönderebilir miyim?

Ya da, her madde için, ben yapmak zorunda olurdu:

<form action='item.php?id={$item_id}' method='POST'>
    <input type='hidden' name='action' value='delete'>
    <input type='submit' value='delete item'>
</form>

ve orijinal bağlantı gibi bakmak için gönder düğmesine stil?

Php CURL veya REST ile aşina değilim, onlar bu sorunu çözümüne yardımcı olacak?

10 Cevap

Genel olarak bir öğeyi silme gibi, bir şekilde sistem durumunu değiştiren bir GET isteği olması iyi bir fikir değil.

Form bu gibi bakmak olabilir:

<form action='item.php' method='POST' id='form'>
    <input type='hidden' name='action' value='delete' />
    <input type='hidden' name='id' value='{item_id}' />
    <a href="" onclick="document.getElementById('form').submit(); return false;">Delete item</a>
</form>

Please use POST for anything that modifies persistent state in the database. You don't want crawlers visiting your delete links!
Have a read at Architecture of the World Wide Web, Volume One and URIs, Addressability, and the use of HTTP GET and POST by W3C.

Edit: GET kullanmak gerekir Bazen de. E-postalarda gönderilen örnek üyelik aktivasyon URL'ler için GET ve her nasılsa veritabanını değiştirmek gerekir.

Sen bir GET isteği (bilgi veya diğer geçici veri günlüğü dışında) veritabanındaki herhangi bir değişiklik asla. Sorun buldukları her URL üzerinde bir GET isteğini gerçekleştirecek çeşitli web spidering yazılım, web hızlandırıcılar, anti-virüs programları, ve gibi, orada olduğunu; Eğer onlar bunu yaparken onları öğeleri otomatik olarak silmek istemem. GET ayrıca çapraz site istek sahtecilik açıktır; Bir saldırganın kullanıcıları bir (bir silme URL'ye yönlendirir bir TinyURL oluşturmak, örneğin) bir kötü eylem gerçekleştiren bir linke tıklayın yaparsa, o zaman onlar farkında olmadan bir şey silmek için kendi izinlerini kullanarak içine kullanıcıyı kandırmak.

Evet, bir POST isteği oluşturmak için göndermeniz bir form gerekir. Diğer seçenek JavaScript ve XMLHttpRequest kullanımı olduğunu, ancak kullanıcılar için bu işe yaramayacak kim JavaScript devre.

Ayrıca POST isteğinden veri kabul etmiş bir kere, yerine bu talebe yanıt olarak yeni bir sayfa dönen, bir GET isteği ile erişilen bir sayfaya kullanıcıyı yönlendirmek gerekir sağlamalıdır. Bu şekilde, onlar yeniden vurmak eğer yanlışlıkla POST isteğini yeniden göndermek, ya da tarama oturumunda sonra kendi geri düğmesine girmeyecektir.

İşte sunucunun durumunu değiştirmek için GET kullanmak için neden iyi bir örnek:

http://www.infoworld.com/article/08/06/16/25FE-stupid-users-part-3-admins_5.html

Anahtar kısmıdır:

"It logged into the administrative area and followed the 'delete' link for every entry," the admin says.

Bu silme olmuş asla POST olarak kodlanmış olsaydı. (OTOH biz komik bir sysadmin hikaye soydular olurdu.)

Sen çünkü sistemin durumunu değiştirmek için izin alır değil REST ilkesinin Get kullanmak istemiyorum. Tüm içeriği silmek için arama motorları gibi sürece.

Her öğe için bir form gerekmez; Gönderdiğiniz = bir delete_ {id} giriş tipi ile liste etrafında bir yöntemdir = mesaja formu kullanabilirsiniz. Ya da, daha akıllıca, . İsimler gönderme düğmeleri üzerine girebilir.

Sorunuza açıklamalarda, başına lokalize siteler için kötü çalışacak bazı konulardan muzdarip olsa da, daha iyi çalışabilir. Her zaman sunu üzerinde biraz daha fazla kontrol için bir HTML Button dönebilirsiniz. Varsayılan olarak gönder düğmesi gibi davranır.

Eğer teslim ekstra, istenmeyen bilgi almak olabilir aslında sadece listesini görüntülerken zaman teklif formu başına öğe çözüm, gerekli olandan çok daha büyük bir sayfa geri gönderme ortalama dava ile yönetilmektedir. Her zaman javascript yetenekli istemciler için bir akıllı sürümü ile düz-eski-html form davranışını yerine javascript kullanabilirsiniz.

Bağlanmak için gidiyoruz eğer bir silme işlemi için "Get", o aslında onayı üzerine bir yazı yaptığı alın bir onay sayfası dönmelidir.

POST bazı insanlar ima var gibi tüm kötü niyetli davranış bir koruma değildir. Kötü niyetli kullanıcılar hala bağlantıları oluşturmak (POST yapmak için javascript içeren) ve GET ile aynı cross-site scripting sorunlara neden olabilir. ()

Bu aşkın POST kullanarak tüm diğer nedenler (tarayıcılarının ve benzeri) uygulamak GET dedi.

Diğerleri söylediler, özellikle web tarayıcılarının yanlışlıkla tüm verileri silmek olabilir (bir Google Mini cihaz ile ya da şirketler) İnternet dönük web sitelerinde, silme gibi yıkıcı işlemleri için GET kullanmak için gerçekten kötü bir fikir.

Eğer bir form kullanmak istemiyorsanız, sunucuya POST göndermek için bir XMLHttpRequest kullanın. Sunucu desteklemektedir varsa bile DELETE yöntemini ayarlayabilirsiniz.

JavaScript ve xhr (kullanıcıların 1999 canlı) kullanamazsınız, ve listenizdeki bir form kullanmak istemiyorsanız, size form göstermek ayrı bir sayfaya linki kullanınız ve muhtemelen 'mısınız Emin misin? ' mesajı.

Yapılacak en iyi şey, muhtemelen yukarıda iki seçenek bir arada: bir form ile ayrı bir sayfaya bir bağlantı Render, ama bir XHR çağrısı olarak bağlantıyı yeniden yazmak için JavaScript kullanabilirsiniz. 1999 veya 2009 yılından bu şekilde kullanıcıların hem de optimal bir deneyim olabilir.

Bir öğeyi silmek için bir href kullanmamalısınız.

Ben bu eski moda şekilde yapıyor ve her satır / öğe için bir form sonrası uygulamaya öneririm.

Örneğin:

<tr><td>Item 1</td><td><form action=/delete method=post><input type=hidden name=id value=1><input type=submit value=Delete></form></tr>
<tr><td>Item 2</td><td><form action=/delete method=post><input type=hidden name=id value=2><input type=submit value=Delete></form></tr>
<tr><td>Item 5</td><td><form action=/delete method=post><input type=hidden name=id value=5><input type=submit value=Delete></form></tr>

Two other options: 1) using one with for each item 2) Ajax (but you will need to be proficient in Ajax)

Ayrıca get kullanabilirsiniz ama bunu silmek girişiminde bulunuyor yazının sahibi olduğundan emin olmak için oturum değerlerini kontrol etmek gerekir. olsun "evrensel güvensiz" değildir. tamamen onu nasıl kullandığınıza bağlıdır.

Bu GET ile bunu yapmak için hala daha iyi.

Senin sorunun size link çirkin URL'sini sevmiyorum ise, (Apache web sunucusu kullanıyorsanız) mod_rewrite ile düzeltmek gerekir.

Edit: There is no reason whatsoever to use POST here. No. Reason.

Yöntemi seçilmesi herhangi bir şekilde güvenliğini etkileyebilecek sanki buralarda insanlar güvenli ve güvensiz hakkında yazmak. Tabii ki seçtiğiniz olursa olsun hangi yöntem kullanıcının kimliğini doğrulamak gerekir. Bunu yapmazsanız, o zaman yazılım already broken. Eğer don’t bir form var bir formu gönderme taklit etmek, ve sonra yazılım zaten bozuldu, hiç bir javascript gerekmez, ihtiyacım yok javascript kullanın.

Insanlar ne yaptıklarını hakkında hiçbir fikrim yok çünkü Aslında, web yazılım yaklaşık% 90, bozuldu.

Bu comments 'ağır bazı garip insanlar tarafından minused ediliyor görmezden. Javascript (gerek yok) kaçının, (hiçbir sebep) POST önlemek, sizin kullanıcı (güvenlik) kimlik doğrulaması, mod_rewrite'ı veya başka bir şekilde (güzel olan) ile href güzel yapmak.