GET veya POST yöntemini ne zaman kullanmalıyım? Aralarındaki fark nedir?


249

GETVeya POSTyöntemi kullanırken fark nedir ? Hangisi daha güvenli? Her birinin (dis) avantajları nelerdir?

( benzer soru )


2
Get'in bir gövdesi yoktur, bu nedenle pratikte, daha karmaşık yapı için herhangi bir sorgu dizesi kodlama biçiminin olmaması nedeniyle veri yapısı olarak ad -> değer çiftleriyle sınırlı olduğunuz anlamına gelir. İsteklerinizde daha karmaşık veri yapılarını (örneğin bir dizi, nesne vb.) İşlemeniz gerekiyorsa POST ve belki de daha gelişmiş biçimler (json / xml) kullanmanız gerekir. Kısaca şöyle dedi: gerçekten gerekmedikçe GET'i kullanmayın (yani URL / kaynak bulunabilir olmalıdır).
themihai

Yanıtlar:


263

Bu bir güvenlik meselesi değil. HTTP protokolü GET türü istekleri idempotent olarak tanımlar , ancak POST'lerin yan etkileri olabilir. Düz İngilizce'de bu, GET'in bir şeyi değiştirmeden görüntülemek için kullanıldığı, POST ise bir şeyi değiştirmek için kullanıldığı anlamına gelir. Örneğin, bir arama sayfasında GET, parolanızı değiştiren bir formda POST kullanılmalıdır.

Ayrıca, PHP'nin kavramları biraz karıştırdığını unutmayın. Bir POST isteği, sorgu dizesinden ve istek gövdesinden girdi alır. Bir GET isteği yalnızca sorgu dizesinden girdi alır. Dolayısıyla, bir POST isteği bir GET isteğinin bir üst kümesidir; Kullanabileceğiniz $_GETPOST isteğinde ve hatta aynı adla parametrelere sahip mantıklı olabilir $_POSTve $_GETbu ortalama farklı şeyler.

Örneğin, bir makaleyi düzenlemek için bir formunuz olduğunu varsayalım. Makale kimliği sorgu dizesinde olabilir (ve bu yolla kullanılabilir $_GET['id']), ancak diyelim ki makale kimliğini değiştirmek istiyorsunuz. Yeni kimlik daha sonra istek gövdesinde ( $_POST['id']) bulunabilir. Tamam, belki de bu en iyi örnek değil, ama umarım ikisi arasındaki farkı gösterir.


13
GET ve POST'lar arasındaki farkın kesinlikle bir güvenlik yönü vardır. Kötü amaçlı bir site, örneğin bir resim etiketine isteğe bağlı bir GET isteği yapıştırarak kullanıcıların başka bir sunucuya GET yapmasına neden olabilir. Bu GET diğer sunucu / deletemyaccount gibi ise, o zaman kötü şeyler olur.
Frank Schwieterman

2
Demek istediğim $ _POST içeriğinin kötü niyetli kullanıcılardan sihirli bir şekilde gizlenmemiş olmasıydı. Her şeyin programlanmasının güvenlik yönleri olduğu açıktır.
troelskn

1
Bu yazı soruyu tamamen cevaplamıyor çünkü güvenlik etkilerinden bahsetmiyor. Yazım hatası "acı İngilizce" "düz İngilizce" olarak değiştirildiği sürece üst kısım iyidir. Alt kısmı takip etmek çok zor. Genel olarak, benim yazı tho çok daha iyi. :-)
Akrikos

1
"Bir POST isteği sorgu dizesinden ve istek gövdesinden girdi alır." IMHO bu yanlış. Her iki girişi de kullanmak için $ _REQUEST kullanmanız gerekir. $ _POST url girişlerini almıyor.
Gunnar Bernstein

1
@Frank Schwieterman Bu yazının eski olduğunu biliyorum, ancak hesabımı silmek idempotent değil ve get kullanmamalıdır.
ayaz

77

Kullanıcı bir forma bilgi girip Gönder'i tıklattığında, bilgilerin tarayıcıdan sunucuya gönderilmesinin iki yolu vardır: URL'de veya HTTP isteğinin gövdesi içinde.

Daha önceki örnekte kullanılan GET yöntemi, URL'ye ad / değer çiftlerini ekler. Ne yazık ki, bir URL'nin uzunluğu sınırlıdır, bu nedenle bu yöntem yalnızca birkaç parametre varsa çalışır. Form çok sayıda parametre kullanıyorsa veya parametreler çok miktarda veri içeriyorsa URL kesilebilir. Ayrıca, URL'ye iletilen parametreler, bir şifrenin görüntülenmesi için en iyi yer değil, tarayıcının adres alanında görünür.

GET yönteminin alternatifi POST yöntemidir. Bu yöntem, HTTP isteğinin gövdesi içindeki ad / değer çiftlerini paketleyerek daha temiz bir URL oluşturur ve form çıktısına boyut sınırlaması getirmez. Ayrıca daha güvenlidir.


1
Nasıl daha "güvenli"?
Julian Reschke

4
çünkü değiştirmek zor mu? GET'i adres çubuğundan değiştirebilirsiniz, ancak POST ile o kadar kolay değildir.
IAdapter

8
Sunucu istemciye güvenemiyor. Uygulamanızı yanlış varsayımlar etrafında tasarlamak güvenli olmaktan uzaktır.
troelskn

openid de kurtarılamaz, çünkü kırılabilir mi?
IAdapter

1
Bunun en açık açıklama olduğuna inanıyorum - gönderilen verilerin yerleştirilmesiyle ilgili fark. Teşekkür ederim.
greenoldman

37

İlk cevap en iyisiydi.

Kullanıyorsun:

  • GET Verileri (DATA GET) almak istediğinizde.
  • POST Eğer (POST DATA) veri göndermek istediğinizde.

2
İstek / yanıt hizmet modeli nedir ve her ikisini de yapmak ister misiniz? ;) Çoğu durumda geri yanıt vermem gerektiğinde POST kullanmayı tercih ederim.
Dmitry Pavlov

8
Genellikle bu doğrudur. GETmükemmel bir şekilde 'veri' gönderebilir, bu yüzden çok doğru bir cevap değildir.
Patrick Hofman

23

Kullanmanın iki yaygın "güvenlik" etkisi vardır GET. Veriler URL dizesinde göründüğünden, Adres Çubuğu / URL'de omzunuzun üzerinden bakan olası biri, oturumunuzu ele geçirmek için potansiyel olarak kullanılabilecek bir oturum çerezi gibi özel olmaması gereken bir şeyi görüntüleyebilir. Herkesin kameralı cep telefonu olduğunu unutmayın .

Diğer güvenlik ima GETile ilgisi var GETdeğişkenler talep eden URL'nin bir parçası olarak çoğu web sunucuları erişim günlüğüne oturum kapatılıyor. Duruma, düzenleyici iklime ve verilerin genel hassasiyetine bağlı olarak, bu potansiyel olarak endişeleri artırabilir.

Bazı istemciler / güvenlik duvarları / IDS sistemleri, GETaşırı miktarda veri içeren isteklerde kaşlarını çatabilir ve bu nedenle güvenilir olmayan sonuçlar sağlayabilir.

POST web sunucularına dosya yüklemek için kullanılan çok parçalı ikili giriş desteği gibi gelişmiş işlevleri destekler.

POSTbir istemcinin isteğinin yalnızca tek geçişli artımlı modda oluşturulmasını engellediği için, gönderilen verilerin boyutunun önceden bilinmesi gerektiğinden, uygulamaya özel bir istemci uygulamasının karmaşıklığını artırabilecek bir içerik uzunluğu üstbilgisi gerektirir. Belki de bir HTTPRPC (Uzaktan Yordam Çağrısı) aktarımı olarak kullanmayı kötüye kullanmayı seçenler için küçük bir sorun .

Diğerleri semantik farklılıkları ve bu sorunun "ne zaman" bölümünü ele almakta zaten iyi bir iş çıkarmışlardır.


17

Ben bilgileri alınırken olduğumda GET kullanmak gelen Bilgiyi yolluyorum bir URL ve POST için bir URL.


1
ancak göndermek için GET'i de kullanabilirsiniz. Fark biçimdir (url'de (GET) veya istekte (POST)).
eric

Bitiş noktası bir dosyayı kabul ederse ve dosyadan bir satır döndürürse (veri oluşturma veya değiştirme veya veritabanı dahil değildir), bitiş noktası GET veya POST olmalı mı?
değişken

17

Çok fazla veri veya bir çeşit hassas bilgi varsa POST kullanmalısınız (gerçekten hassas şeyler de güvenli bir bağlantıya ihtiyaç duyar).

Kullanıcıların sayfanıza yer işareti koyabilmesini istiyorsanız GET'i kullanın, çünkü tüm veriler yer işaretiyle birlikte verilir.

GET yöntemi ile REFRESH'e isabet eden kişilere dikkat edin, çünkü veriler kullanıcıyı her uyarmadan tekrar gönderilecektir (POST bazen kullanıcıyı yeniden gönderme konusunda uyarır).


Bitiş noktası bir dosyayı kabul ederse ve dosyadan bir satır döndürürse (veri oluşturma veya değiştirme veya veritabanı dahil değildir), bitiş noktası GET veya POST olmalı mı?
değişken

@değişken POST. Bu durumda, çoğunlukla POST dosya yüklemelerini işlemek için oluşturulduğundan ve standart GET olmadığından. Dosyayı sayfa her yüklendiğinde göndermeniz gerekir, bu nedenle GET + dosyası yerine standart POST kullanmak GET'in bir URL'nin her seferinde aşağı yukarı aynı sonuçları vermesi beklentisini ortadan kaldırır.
Grant

14

Bu W3C belgesi HTTP GET ve POST kullanımını açıklamaktadır.

Bence bu yetkili bir kaynak.

Özet (belgenin 1.3 bölümü):

  • Etkileşim daha çok bir soruya benziyorsa GET kullanın (örneğin, sorgu, okuma işlemi veya arama gibi güvenli bir işlemdir).
  • Kullanım POST ise:
    • Etkileşim daha çok bir emir gibidir veya
    • Etkileşim, kaynağın durumunu kullanıcının algılayacağı şekilde değiştirir (örneğin, bir hizmete abonelik) veya
    • Kullanıcı, etkileşimin sonuçlarından sorumlu tutulur.

9
Bu daha da özetlenebilir düşünüyorum: Sunucunun durumu değişmediğinde GET, ne zaman POST.
Yamcha

10

Get ve Post yöntemlerinin kullandığınız sunucu teknolojisi ile ilgisi yoktur, php, asp.net veya ruby ​​ile aynı şekilde çalışır. GET ve POST, HTTP protokolünün bir parçasıdır. Belirtildiği gibi, POST daha güvenlidir. POST formları da tarayıcı tarafından önbelleğe alınmaz. POST ayrıca büyük miktarlarda veri aktarmak için de kullanılır.


8

Verilerde değişiklik yaparken POST kullanmanın nedeni:

  • Google Web Accelerator gibi bir web hızlandırıcı, bir sayfadaki tüm (GET) bağlantıları tıklayıp önbelleğe alır. Bağlantılar bir şeylerde değişiklik yaparsa bu çok kötü.
  • Bir tarayıcı GET isteklerini önbelleğe alır, böylece kullanıcı bağlantıyı tıklasa bile değişikliği gerçekleştirmek için sunucuya bir istek göndermeyebilir.
  • Sitenizi / uygulamanızı CSRF'ye karşı korumak için POST kullanmanız gerekir. Uygulamanızı tamamen güvenli hale getirmek için sunucuda benzersiz bir tanımlayıcı oluşturmanız ve bunu istekte göndermeniz gerekir.

Ayrıca, adres çubuğunda, yer imlerinde ve sunucu günlüklerinde göründüğü için, sorgu bilgilerini dizeye hassas bilgiler (yalnızca GET seçeneğiyle) koymayın.

Umarım bu, insanların POST'un neden 'güvenli' olduğunu söylediğini açıklar. Hassas veriler aktarıyorsanız SSL kullanmanız gerekir.


8

GETve POSTHTTP yöntemlerini hangi edebilirsiniz benzer hedeflere ulaşmak

GETtemelde sadece veri almak (almak) içindir, A'nın GETbir gövdesi olmamalıdır, bu yüzden çerezlerin yanı sıra, bilgi iletmek için tek yer URL'de ve URL'ler uzunluk sınırlıdır, gönderilen verilerin bir parçası olduğundan GETdaha az güvenlidir POSTURL

GETParola, kredi kartı veya diğer hassas bilgileri gönderirken asla kullanmayın !, Veriler URL'deki herkes tarafından görülebilir, Önbelleklenebilir veriler. GETdüğmesini yeniden yüklerken veya geri çağırırken zararsızdır, kitap işaretlenir, parametreler tarayıcı geçmişinde kalır, yalnızca ASCII karakterlerine izin verilir.

POSTveri depolama veya güncelleme, ürün sipariş etme veya e-posta gönderme gibi herhangi bir şeyi içerebilir. POSTyöntem bir gövdeye sahiptir.

POSTyöntemi, hassas ve gizli bilgileri sunucuya aktarmak için güvence altına alınır, URL'deki sorgu parametrelerinde görünmez ve parametreler tarayıcı geçmişine kaydedilmez. Veri uzunluğu konusunda herhangi bir kısıtlama yoktur. Yeniden yüklerken, tarayıcı, verilerin yeniden gönderilmek üzere olduğu konusunda kullanıcıyı uyarmalıdır. POSTyöntem yer işareti eklenemez


3
  1. GET yöntemi daha az hassas verileri göndermek için kullanılırken, POST yöntemi hassas verileri göndermek için kullanılır.
  2. POST yöntemini kullanarak GET yöntemine kıyasla büyük miktarda veri gönderebilirsiniz.
  3. GET yöntemiyle gönderilen veriler tarayıcı başlık çubuğunda görünürken POST yöntemiyle gönderilen veriler görünmezdir.

0

Kaynakları URL'den almak istiyorsanız GET yöntemini kullanın. Tarayıcınızın geri düğmesine basarsanız her zaman son sayfayı görebilirsiniz ve yer imi eklenebilir, bu nedenle POST yöntemi kadar güvenli değildir.

URL'ye bir şey 'göndermek' istiyorsanız POST yöntemini kullanın. Örneğin, bir google hesabı oluşturmak istiyorsunuz ve tüm ayrıntılı bilgileri doldurmanız gerekebilir, ardından başarılı bir şekilde gönderdikten sonra 'gönder' düğmesine (POST yöntemi burada denir) basarsınız ve tarayıcınızın düğmesine basmaya çalışırsınız. , doldurulmuş form içeren son sayfa yerine hata veya yeni bir boş form alırsınız.


-10

GETyöntem:

  • Yalnızca 256 karakterlik tarih göndermek için kullanılır

  • Bu yöntemi kullanırken, bilgiler tarayıcıda görülebilir

  • Formlar tarafından kullanılan varsayılan yöntemdir

  • O kadar güvenli değil.


POSTyöntem:

  • Sınırsız veri göndermek için kullanılır.

  • Bu yöntemle bilgiler tarayıcıda görülemez

  • POSTYöntemden açıkça bahsedebilirsiniz

  • Birden fazla sabitlenir GETyöntemle

  • Daha gelişmiş özellikler sunar


"Yalnızca 256 karakterlik tarih göndermek için kullanılır" - doğru değil. "Bu yöntemi kullanırken, bilgiler tarayıcıda görülebilir" - gönderi verileri tarayıcılarda da görülebilir, bu çok açık değildir. "Daha gelişmiş özellikler sağlar" - gibi?
Quentin

Bu çok kullanışlı bir cevap değil. 'O kadar güvenli değil' ve 'daha gelişmiş özellikler sağlıyor' gibi yanlış bilgiler ve Quentin tarafından bahsedilen diğer şeyler.
Andrew Barber
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.