GET veya POST, diğerinden daha güvenli mi?


282

Bir HTTP GET'i bir HTTP POST ile karşılaştırırken, güvenlik açısından farklılıklar nelerdir? Seçeneklerden biri doğası gereği diğerinden daha mı güvenli? Öyleyse neden?

POST'un URL hakkında bilgi göstermediğini, ancak bunun gerçek bir değeri olduğunu veya belirsizliğin sadece güvenlik olduğunu mu fark ediyorum? Güvenlik bir endişe olduğunda POST'u tercih etmem için bir neden var mı?

Düzenleme:
HTTPS üzerinden POST verileri kodlanır, ancak URL'ler bir üçüncü taraf tarafından koklanabilir mi? Ayrıca, JSP ile ilgileniyorum; JSP veya benzer bir çerçeve kullanırken, hassas verileri POST veya GET'e tamamen yerleştirmekten kaçınmak ve bunun yerine hassas bilgileri işlemek için sunucu tarafı kodunu kullanmaktan en iyi yöntem olduğunu söylemek uygun olur mu?


1
Bu konuda Jeff'in blogunda güzel bir blog girişi var Kodlama Korku: Siteler Arası İstek Sahtekarlıkları ve Siz .
fhe

Çoğu şey için POST kullanmaz mısın. Örneğin, bir API için veriyi bir DB'den almanız gerektiğini, ancak sunucu verileri döndürmeden önce ilk önce kimliğinizin doğrulanması gerektiğini düşünüyor musunuz? Posta kullanarak oturum kimliğinizi + istek için ihtiyacınız olan tüm parametreleri iletmeniz yeterlidir. Bunun için bir GET gereksinimi kullandıysanız, oturum kimliğiniz tarayıcı geçmişinizde veya ortada bir yerde kolayca bulunabilir.
James111

Bu tartışmayı https yaygın olmadığı zamanlarda savaştan (99 'veya '00 ya da öylesine) hatırlıyorum.
David Tonhofer

@DavidTonhofer, hangi savaşa atıfta bulunuyorsunuz? Tarayıcı savaşı mı?
DeltaFlyer

@ DeltaFlyer Hayır, Sonsuza Kadar Savaş, aka GWOT. Ne yaptık.
David Tonhofer

Yanıtlar:


206

Güvenlik açısından, doğası gereği aynıdırlar. POST'un URL yoluyla bilgi göstermediği doğru olsa da, istemci ve sunucu arasındaki gerçek ağ iletişiminde bir GET kadar bilgi ortaya koyar. Hassas bilgileri iletmeniz gerekiyorsa, ilk savunma hattınız Güvenli HTTP kullanarak iletmektir.

GET veya sorgu dizesi yayınları, belirli bir öğeye yer işareti koymak veya arama motoru optimizasyonu ve dizin oluşturma öğelerine yardımcı olmak için gereken bilgiler için gerçekten iyidir.

POST, bir kez veri göndermek için kullanılan standart formlar için iyidir. Belki de kullanıcının sorguyu bir yer işaretine veya bu satırlar boyunca bir şey kaydetmesine izin vermek istediğiniz bir arama formunda olmadıkça, gerçek formları göndermek için GET'i kullanmayacağım.


5
Bir GET için konum çubuğunda gösterilen URL'nin bir POST'ta gizlenecek verileri gösterebileceği uyarısı ile.
tvanfosson

93
Sadece en saf anlamda gizli
davetron5000

7
doğru, ancak klavyenin güvensiz olduğunu da söyleyebilirsiniz, çünkü şifrenizi yazarken birisi omzunuzun üzerinden geçebilir. Belirsizlik yoluyla güvenlik arasında çok az fark vardır ve hiç güvenlik yoktur.
stephenbayer

65
URL'deki sorgu dizelerinin ve dolayısıyla adres kutusunun görünürlüğü (ve önbelleğe alınması) açıkça daha az güvenlidir. Mutlak güvenlik diye bir şey yoktur, bu nedenle güvenlik dereceleri önemlidir.
pbreitenbach

6
bir yazı kullanırsanız bile ortaya çıkar. sizin durumunuzda, yazı biraz daha güvenli olacaktır. Ama cidden .. Değişkenleri almak kadar kolay, tüm gün sonrası değişkenleri değiştirebilirim. Çerezler bile görüntülenebilir ve değiştirilebilir .. sitenize herhangi bir şekilde veya şekilde gönderdiğiniz bilgiye asla güvenmeyin. Ne kadar fazla güvenliğe ihtiyacınız olursa, o kadar fazla doğrulama yöntemine sahip olmalısınız.
stephenbayer

428

GET isteği POST talebinden daha az güvenlidir. Her ikisi de tek başına gerçek "güvenlik" sunmaz; POST isteklerini kullanarak olmayacak sihirli web sitenizin farkedilir miktarda zararlı saldırılara karşı güvenli olun. Ancak, GET istekleri kullanarak yapabilirsiniz bir başka güvenli bir uygulama güvensiz olun.

"Değişiklik yapmak için GET isteklerini kullanmamalısınız" mantrası hala çok geçerlidir, ancak bunun kötü niyetli davranışlarla ilgisi yoktur . Giriş formları, yanlış istek türü kullanılarak gönderilmeye en duyarlı formlardır.

Arama örümcekleri ve web hızlandırıcıları

Bu, verileri değiştirmek için POST isteklerini kullanmanızın gerçek nedenidir. Arama örümcekleri web sitenizdeki her bağlantıyı takip eder, ancak buldukları rastgele formları göndermez.

Web hızlandırıcıları, istemcinin makinesinde çalıştıkları ve oturum açmış kullanıcının bağlamındaki tüm bağlantıları "tıklattıkları" için arama örümceklerinden daha kötüdür . Bu nedenle, bir yönetici gerektirse bile bir şeyleri silmek için GET isteğini kullanan bir uygulama, (kötü amaçlı olmayan!) Web hızlandırıcının siparişlerine mutlu bir şekilde itaat eder ve gördüğü her şeyi siler .

Karışık vekil saldırısı

Bir GET veya POST isteği kullansanız da, şaşkın bir yardımcı saldırısı (vekilin tarayıcı olduğu yerde) mümkündür .

Saldırgan tarafından kontrol edilen web sitelerinde GET ve POST, kullanıcı etkileşimi olmadan göndermek de aynı derecede kolaydır .

POST'un biraz daha az duyarlı olduğu tek senaryo, saldırganın kontrolü altında olmayan birçok web sitesinin (örneğin, bir üçüncü taraf forumu) keyfi görüntülerin gömülmesine izin vermesidir (saldırganın keyfi bir GET isteği enjekte etmesine izin verir), ancak tümünü engeller otomatik veya manuel olsun, arbiter bir POST isteği enjekte etmenin yolları.

Web hızlandırıcılarının şaşkın vekil saldırı örneği olduğu söylenebilir, ancak bu sadece bir tanım meselesidir. Bir şey olsa bile, kötü niyetli bir saldırgan bu yüzden pek bir var, bu kontrole sahip saldırı yardımcısı bile edilir karıştı.

Proxy günlükleri

Proxy sunucuları, sorgu dizesini çıkarmadan GET URL'lerini bütünüyle günlüğe kaydedebilir. POST istek parametreleri normalde günlüğe kaydedilmez. Her iki durumda da çerezlerin kaydedilmesi olası değildir. (misal)

Bu POST lehine çok zayıf bir argüman. İlk olarak, şifrelenmemiş trafik bütünüyle kaydedilebilir; Kötü amaçlı bir proxy'de zaten gereken her şey var. İkincisi, istek parametreleri bir saldırgan için sınırlı kullanımlıdır: gerçekten ihtiyaç duydukları çerezlerdir, bu yüzden sahip oldukları tek şey proxy günlükleri ise, bir GET veya POST URL'sine saldırma olasılığı düşüktür.

Giriş istekleri için bir istisna vardır: bunlar kullanıcının şifresini içerir. Bunu proxy günlüğüne kaydetmek POST durumunda olmayan bir saldırı vektörü açar. Ancak, düz HTTP üzerinden giriş yapmak zaten doğal olarak güvensizdir.

Proxy önbelleği

Önbellek proxy'leri GET yanıtlarını koruyabilir, ancak POST yanıtlarını koruyamaz. Bunu söyledikten sonra, GET yanıtları, URL'yi bir POST işleyicisine dönüştürmekten daha az çabayla önbelleğe alınamaz hale getirilebilir.

HTTP "Yönlendiren"

Kullanıcı bir GET isteğine yanıt olarak sunulan sayfadan bir üçüncü taraf web sitesine gidecekse, bu üçüncü taraf web sitesi tüm GET istek parametrelerini görebilir.

Şiddeti bu parametrelerde neyin mevcut olduğuna bağlı olan "üçüncü bir tarafa istek parametrelerini ortaya koyar" kategorisine aittir. POST istekleri bundan doğal olarak etkilenmez, ancak GET isteğinden yararlanmak için bir bilgisayar korsanının sunucunun yanıtına kendi web sitesine bir bağlantı eklemesi gerekir.

Tarayıcı geçmişi

Bu, "proxy günlükleri" bağımsız değişkenine çok benzer: GET istekleri, parametreleriyle birlikte tarayıcı geçmişinde saklanır. Saldırgan, makineye fiziksel erişimi varsa bunları kolayca elde edebilir.

Tarayıcı yenileme işlemi

Kullanıcı "yenile" düğmesine bastığında tarayıcı bir GET isteğini yeniden deneyecek. Kapatma işleminden sonra sekmeleri geri yüklerken bunu yapabilir. Herhangi bir işlem (örneğin bir ödeme) uyarı yapılmadan tekrarlanacaktır.

Tarayıcı bir POST isteğini uyarı yapmadan yeniden denemez.

Bu, verileri değiştirmek için yalnızca POST isteklerini kullanmak için iyi bir nedendir, ancak kötü niyetli davranış ve dolayısıyla güvenlikle ilgisi yoktur.

Peki ne yapmalıyım?

  • Verileri değiştirmek için yalnızca güvenlikle ilgili olmayan nedenlerle yalnızca POST isteklerini kullanın.
  • Giriş formları için yalnızca POST isteklerini kullanın; aksi takdirde saldırı vektörleri ortaya çıkar.
  • Siteniz hassas işlemler yapıyorsa, gerçekten ne yaptıklarını bilen birine ihtiyacınız vardır, çünkü bu tek bir cevapta ele alınamaz. HTTPS, HSTS, CSP, SQL enjeksiyonunu, komut dosyası enjeksiyonunu (XSS) , CSRF'yi ve platformunuza özgü olabilecek bir dizi başka şeyi (çeşitli çerçevelerdeki toplu atama güvenlik açığı gibi) kullanmanız gerekir: ASP.NET MVC , Ruby on Rails , vb.). "Güvenli" (sömürülebilir değil) ve "güvenli değil" arasındaki farkı yaratacak tek bir şey yoktur.

HTTPS üzerinden POST verileri kodlanır, ancak URL'ler bir üçüncü taraf tarafından koklanabilir mi?

Hayır, koklayamazlar. Ancak URL'ler tarayıcı geçmişinde saklanır.

En iyi uygulamanın, hassas verileri POST veya GET'e olası bir şekilde yerleştirmekten kaçınmak ve bunun yerine hassas bilgileri işlemek için sunucu tarafı kodunu kullanmak olduğunu söylemek doğru olur mu?

Ne kadar hassas veya daha spesifik olarak ne şekilde olduğuna bağlıdır. Açıkçası müşteri görecektir. İstemcinin bilgisayarına fiziksel erişimi olan herkes bunu görecektir. İstemci size geri gönderirken kimlik sahtekarlığı yapabilir. Bunlar önemliyse evet, hassas verileri sunucuda saklayın ve ayrılmasına izin vermeyin.


29
ahem, CSRF POST ile mümkün olduğunca mümkün.
AviD

5
@ Notlar Notlar, biraz daha zor, ancak herhangi bir XSS'ye ihtiyacınız yok. POST istekleri her zaman her yerde gönderiliyor ve CSRF'nin herhangi bir web sitesinden kaynaklanabileceğini unutmayın , XSS dahil değildir.
AviD

18
hayır, tarayıcı tarafından sessizce getirilecek bir GET'in aksine, yazmak için ayrıcalıklara sahip bir başkasını yapmanız gerekir. her POST formunun doğrulanabilir kaynak karmasıyla korunması gerektiğini ve bir GET bağlantısı için böyle bir araç bulunmadığını göz önünde bulundurursanız, puanınız saçmadır.
kibitzer

7
Peki, tüm GET isteklerinize POST formlarına eklediğiniz gibi bir karma ekleyebilirsiniz ... Ancak yine de verileri değiştiren hiçbir şey için GET'i kullanmamalısınız.
Eli

13
GET üzerinden POST kullanılması herhangi bir CSRF'yi engellemez. İnsanların url'lerden gelen görüntülere izin veren rastgele bir web sitesine gitmelerini sağlamak, kontrol ettiğiniz bir web sitesine (javascript'e sahip olmak için) gitmekten daha kolay olduğundan, onları biraz daha kolay hale getirir. Bunu yapmak <body onload="document.getElementById('a').submit()"><form id="a" action="http://example.com/delete.php" action="post"><input type="hidden" name="id" value="12"></form>, bir bağlantıyı (bu html'yi içeren) tıklayarak otomatik olarak bir yere göndermek için o kadar zor değil
FryGuy

175

Değişkenler HTTP POST üzerinden gönderildiği için değişkenlerin HTTP GET üzerinden gönderilen değişkenlerden daha fazla güvenlik sağladığından daha fazla güvenliğiniz yoktur.

HTTP / 1.1 bize bir istek göndermek için birçok yöntem sunar :

  • SEÇENEKLER
  • ALMAK
  • BAŞ
  • İLETİ
  • KOYMAK
  • SİL
  • İZ
  • BAĞLAN

GET kullanarak aşağıdaki HTML belgesine sahip olduğunuzu varsayalım:

<html>
<body>
<form action="http://example.com" method="get">
    User: <input type="text" name="username" /><br/>
    Password: <input type="password" name="password" /><br/>
    <input type="hidden" name="extra" value="lolcatz" />
    <input type="submit"/>
</form>
</body>
</html>

Tarayıcınız ne soruyor? Bunu sorar:

 GET /?username=swordfish&password=hunter2&extra=lolcatz HTTP/1.1
 Host: example.com
 Connection: keep-alive
 Accept: application/xml,application/xhtml+xml,text/html;q=0.9,text/ [...truncated]
 User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) [...truncated]
 Accept-Encoding: gzip,deflate,sdch
 Accept-Language: en-US,en;q=0.8
 Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3

Şimdi bu istek yöntemini bir POST olarak değiştirdiğimizi varsayalım:

 POST / HTTP/1.1
 Host: example.com
 Connection: keep-alive
 Content-Length: 49
 Cache-Control: max-age=0
 Origin: null
 Content-Type: application/x-www-form-urlencoded
 Accept: application/xml,application/xhtml+xml,text/ [...truncated]
 User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.0; [...truncated]
 Accept-Encoding: gzip,deflate,sdch
 Accept-Language: en-US,en;q=0.8
 Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3

 username=swordfish&password=hunter2&extra=lolcatz

Bu HTTP isteklerinin her ikisi de:

  • Şifrelenmemiş
  • Her iki örneğe dahil
  • Evrilebilir ve MITM saldırılarına maruz kalabilir.
  • Üçüncü taraf ve komut dosyası botları tarafından kolayca çoğaltılır.

Birçok tarayıcı POST / GET dışında HTTP yöntemlerini desteklemez.

Çoğu tarayıcı davranışı sayfa adresini depolar, ancak bu, bu diğer sorunlardan hiçbirini göz ardı edebileceğiniz anlamına gelmez.

Yani spesifik olmak gerekirse:

Biri doğası gereği diğerinden daha mı güvenli? POST'un URL ile ilgili bilgileri açığa vurmadığını, ancak bunun gerçek bir değeri olduğunu veya belirsizliğin sadece güvenlik olduğunu mu anlıyorum? Buradaki en iyi uygulama nedir?

Bu doğrudur, çünkü HTTP konuşmak için kullandığınız yazılım istek değişkenlerini bir yöntemle saklama eğilimindedir, ancak bir başkası sadece birisinin tarayıcı geçmişinize veya h4x0r1ng'yi anladığını düşünen 10 yaşındaki bir başka naif saldırıya bakmasını engellemez. veya geçmiş mağazanızı kontrol eden komut dosyaları. Geçmiş deponuzu kontrol edebilecek bir betiğiniz varsa, ağ trafiğinizi kontrol eden bir betiğiniz olabilir, bu nedenle belirsizliğin tüm güvenliği yalnızca betiğin çocuklarına ve kıskanç kız arkadaşlarına müstehcenlik kazandırır.

Https üzerinden POST verileri kodlanır, ancak URL'ler 3. taraflarca koklanabilir mi?

SSL şu şekilde çalışır. Yukarıda gönderdiğim iki isteği hatırlıyor musunuz? SSL'de nasıl göründükleri aşağıda açıklanmıştır: (Sayfayı https://encrypted.google.com/ olarak değiştirdim, çünkü example.com SSL'ye yanıt vermiyor).

SSL üzerinden POST

q5XQP%RWCd2u#o/T9oiOyR2_YO?yo/3#tR_G7 2_RO8w?FoaObi)
oXpB_y?oO4q?`2o?O4G5D12Aovo?C@?/P/oOEQC5v?vai /%0Odo
QVw#6eoGXBF_o?/u0_F!_1a0A?Q b%TFyS@Or1SR/O/o/_@5o&_o
9q1/?q$7yOAXOD5sc$H`BECo1w/`4?)f!%geOOF/!/#Of_f&AEI#
yvv/wu_b5?/o d9O?VOVOFHwRO/pO/OSv_/8/9o6b0FGOH61O?ti
/i7b?!_o8u%RS/Doai%/Be/d4$0sv_%YD2_/EOAO/C?vv/%X!T?R
_o_2yoBP)orw7H_yQsXOhoVUo49itare#cA?/c)I7R?YCsg ??c'
(_!(0u)o4eIis/S8Oo8_BDueC?1uUO%ooOI_o8WaoO/ x?B?oO@&
Pw?os9Od!c?/$3bWWeIrd_?( `P_C?7_g5O(ob(go?&/ooRxR'u/
T/yO3dS&??hIOB/?/OI?$oH2_?c_?OsD//0/_s%r

SSL üzerinden GET

rV/O8ow1pc`?058/8OS_Qy/$7oSsU'qoo#vCbOO`vt?yFo_?EYif)
43`I/WOP_8oH0%3OqP_h/cBO&24?'?o_4`scooPSOVWYSV?H?pV!i
?78cU!_b5h'/b2coWD?/43Tu?153pI/9?R8!_Od"(//O_a#t8x?__
bb3D?05Dh/PrS6_/&5p@V f $)/xvxfgO'q@y&e&S0rB3D/Y_/fO?
_'woRbOV?_!yxSOdwo1G1?8d_p?4fo81VS3sAOvO/Db/br)f4fOxt
_Qs3EO/?2O/TOo_8p82FOt/hO?X_P3o"OVQO_?Ww_dr"'DxHwo//P
oEfGtt/_o)5RgoGqui&AXEq/oXv&//?%/6_?/x_OTgOEE%v (u(?/
t7DX1O8oD?fVObiooi'8)so?o??`o"FyVOByY_ Supo? /'i?Oi"4
tr'9/o_7too7q?c2Pv

(not: HEX'i ASCII'ye dönüştürdüm, bazıları açıkça görüntülenmemelidir)

Tüm HTTP görüşmesi şifrelenir, iletişimin görünen tek kısmı TCP / IP katmanındadır (IP adresi ve bağlantı noktası bilgileri anlamına gelir).

Burada büyük bir cesur açıklama yapalım. Web sitenize bir HTTP yöntemi üzerinde diğerinden daha fazla güvenlik sağlanmamıştır, tüm dünyadaki bilgisayar korsanları ve yeni başlayanlar burada gösterdiğim şeyi tam olarak nasıl yapacağımı biliyorlar. Güvenlik istiyorsanız SSL kullanın. Tarayıcılar geçmişi saklama eğilimindedir, RFC2616 9.1.1 tarafından bir eylem gerçekleştirmek için GET'i KULLANMAMAK, ancak POST'un güvenlik sağladığını düşünmek önerilir.

POST'un bir güvenlik önlemi olduğu tek şey mi? Tarayıcı geçmişinizde kıskanç eski saygısızlığa karşı koruma. Bu kadar. Dünyanın geri kalanı hesabınıza giriş yaparak size gülüyor.

POST'un neden güvenli olmadığını daha fazla göstermek için Facebook her yerde POST istekleri kullanıyor, bu yüzden FireSheep gibi yazılımlar nasıl var olabilir ?

HTTPS kullansanız ve sitenizde XSS güvenlik açıkları bulunmasa bile CSRF ile saldırıya uğrayabileceğinizi unutmayın . Kısacası, bu saldırı senaryosu kurbanın (sitenizin veya hizmetinizin kullanıcısı) zaten oturum açmış olduğunu ve uygun bir çerezi olduğunu varsayar ve kurbanın tarayıcısından (sözde güvenli) sitenizle bir şeyler yapması istenir. CSRF'ye karşı korumanız yoksa, saldırgan yine de mağdurların kimlik bilgileriyle işlem yapabilir. Saldırgan, kurbanın tarayıcısına aktarılacağı için sunucu yanıtını göremez, ancak hasar genellikle bu noktada yapılır.


1
CSRF hakkında konuşmadığınız bir utanç :-). Sizinle iletişim kurmanın bir yolu var mı?
Florian Margaine

@FlorianMargaine Beni Twitter'da ekleyin, size e-postamı göndereceğim. twitter.com/#!/BrianJGraham
Gizli Bölüm

Facebook'un güvenli olduğunu kim söyledi? Yine de iyi bir cevap. +1.
Amal Murali

1
"[...] bu yüzden tüm güvenlik belirsizliği sadece senaryo çocuklarına ve kıskanç kız arkadaşlarına müstehcenlik sağlıyor. [...]". bu tamamen kıskanç gf'nin becerilerine bağlıdır. üstelik hiçbir gf / bf'nin tarayıcı geçmişinizi ziyaret etmesine izin verilmemelidir. Hiç. lol.
turkishweb

34

Ek güvenlik yoktur.

Kayıt verileri geçmişte ve / veya günlük dosyalarında görünmez, ancak verilerin güvenli tutulması gerekiyorsa SSL'ye ihtiyacınız vardır.
Aksi takdirde, teli koklayan herkes verilerinizi yine de okuyabilir.


2
SSL üzerinden bir URL alırsanız, üçüncü bir taraf URL'yi göremez, bu nedenle güvenlik aynıdır
davetron5000

7
GET bilgileri yalnızca SSL tünelinin başında ve sonunda görülebilir
Jacco

1
Ve sys yöneticileri günlük dosyaları grep zaman grep zaman.
Tomalak

1
POST verilerinin kullanıcının tarayıcı geçmişinde saklanmayacağına dair bazı ek güvenlik olduğunu söyleyebilirim , ancak GET verileri olacaktır.
Kip

3
SSL / TLS üzerinden HTTP (doğru şekilde uygulandı), saldırganın kabloyu koklamasına (veya aktif olarak kurcalamaya) sadece iki şeyi görmesini sağlar - hedefin IP adresi ve her iki yöne giden veri miktarı.
Aaron

29

Bile POSTkarşı hiçbir gerçek güvenlik yararı sağlayan GETgiriş formları veya nispeten hassas bilgilerle diğer herhangi bir şekilde, emin kullandığınız yapmak POSTgibidir:

  1. POSTEdilen bilgiler kullanıcının geçmişine kaydedilmez.
  2. Formda gönderilen hassas bilgiler (şifre vb.) Daha sonra URL çubuğunda görünmez (kullanarak GET, geçmişte ve URL çubuğunda görünür olur).

Ayrıca, GETteorik bir veri sınırı vardır. POSTyapmaz.

Gerçek hassas bilgiler için SSL( HTTPS) kullandığınızdan emin olun.


Varsayılan ayarlarda, firefox / IE'ye her kullanıcı adı ve şifre girdiğimde, bu bilgiyi kaydetmek isteyip istemediğimi soruyor, özellikle daha sonra yazmak zorunda kalmayacağım.
Kibbee

Andrew Sanırım kullanıcı girdi alanlarında otomatik tamamlama anlamına geliyor. Örneğin, Firefox web siteme girdiğim tüm verileri hatırlıyor, bu nedenle bir arama kutusuna metin yazmaya başladığımda, metni önceki aramalarla tamamlamayı önerecek.
James McMahon

Evet, bu otomatik tamamlama noktası, değil mi? Demek istediğim aslında otomatik tamamlama değil, tarihti.
Andrew Moore

Saldırgan tam tarayıcı geçmişine erişebiliyorsa, tam tarayıcı otomatik tamamlama verilerine de erişebilir.
Mikko Rantalainen

19

GET ve POST'tan hiçbiri, tıpkı faks ve telefonlardan hiçbirinin diğerinden "daha güvenli" olmadığı gibi, doğası gereği diğerinden "daha güvenli" olmadığı anlamına gelir. Çözmeye çalıştığınız sorun için en uygun olanı seçebilmeniz için çeşitli HTTP yöntemleri sağlanmıştır. GET, idempotent sorgular için daha uygundur, ancak POST "eylem" sorguları için daha uygundur, ancak sürdürdüğünüz uygulamanın güvenlik mimarisini anlamadıysanız, kendinizi herhangi biriyle kolayca çekebilirsiniz.

GET ve POST'un başlangıçta ne anlama geldiğine dair genel bir fikir edinmek için HTTP / 1.1 RFC'nin Bölüm 9: Yöntem Tanımlarını okursanız muhtemelen en iyisidir .


16

GET ve POST arasındaki fark güvenlik açısından değil, sunucuya yönelik niyetlerinde görülmelidir. GET hiçbir zaman sunucudaki verileri değiştirmemelidir - en azından günlüklerden başka - ancak POST yeni kaynaklar oluşturabilir.

Güzel proxy'ler POST verilerini önbelleğe almaz, ancak URL'den GET verilerini önbelleğe alabilirler, bu nedenle POST'un daha güvenli olması gerektiğini söyleyebilirsiniz. Ancak POST verileri, iyi oynatılmayan vekiller için hala kullanılabilir olacaktır.

Cevapların çoğunda belirtildiği gibi, tek kesin bahis SSL'dir.

Ancak, GET yöntemlerinin veritabanı satırlarını silme gibi herhangi bir değişiklik yapmadığından emin olun.


1
Buna katılıyorum. Soru güvenlik değil, POST ve GET'in yapmak için tasarlandığı şey bu.
pbreitenbach

6

Benim seçim için her zamanki yöntem gibi bir şey:

  • Alınacak öğeler için GET URL ile sonradan
    • Örneğin, daha sonra search.php? S = XXX yapabilmeniz için Arama GET olmalıdır.
  • Gönderilecek öğeler için POST
    • Bu, GET'e nispeten görünmez bir şekilde koordine edilir ve gönderilmesi daha zordur, ancak veriler yine de cURL aracılığıyla gönderilebilir.

Ama olan bir GET daha POST yapmak zor. GET, adres kutusundaki bir URL'dir. POST, bir HTML sayfasında veya cURL'de bir <form> gerektirir.
pbreitenbach

2
Sahte bir mesaj not defteri ve 5 dakika sürüyor ... çok daha zor değil. Var olmayan bir telefon sistemine özellikler eklemek için not defteri kullandım. Sistem için yönetici formlarının, satıcı açısından "mümkün olmayan" düğmelere komut atamamı sağlayacak bir kopyasını oluşturabildim.
Matthew Whited

6

Bu güvenlikle ilgili değildir, ancak ... tarayıcılar POST isteklerini önbelleğe almaz .


6

İkisi de istek üzerine sihirli bir şekilde güvenlik sağlamaz, ancak GET genellikle güvenliğini engelleyen bazı yan etkiler ima eder.

GET URL'leri tarayıcı geçmişinde ve web sunucusu günlüklerinde gösterilir. Bu nedenle, giriş formları ve kredi kartı numaraları gibi şeyler için asla kullanılmamalıdır.

Ancak, sadece verilerin POST olması verilerin güvenliğini sağlamaz. Bunun için SSL istiyorsun. Hem GET hem de POST, HTTP üzerinden kullanıldığında verileri kablo üzerinden düz metin olarak gönderir.

POST verileri için başka iyi nedenler de vardır - sınırsız miktarda veri gönderme veya sıradan kullanıcılardan parametreleri gizleme gibi.

Dezavantajı, kullanıcıların POST yoluyla gönderilen bir sorgunun sonuçlarını işaretleyememesidir. Bunun için GET'e ihtiyacınız var.


5

Bu durumu göz önünde bulundurun: Özensiz bir API GET isteklerini kabul eder:

http://www.example.com/api?apikey=abcdef123456&action=deleteCategory&id=1

Bazı ayarlarda, bu URL'yi istediğinizde ve istekle ilgili bir hata / uyarı varsa, bu satırın tamamı günlük dosyasına kaydedilir. Daha da kötüsü: üretim sunucusunda hata mesajlarını devre dışı bırakmayı unutursanız, bu bilgiler tarayıcıda düz olarak görüntülenir! Artık API anahtarınızı herkese verdiniz.

Ne yazık ki, bu şekilde çalışan gerçek API'ler var.

Günlüklerde bazı hassas bilgilere sahip olma veya bunları tarayıcıda görüntüleme fikrini istemiyorum. POST ve GET aynı değildir. Her birini uygun yerlerde kullanın.


3
  1. TRANSİT GİRİŞİNDE GÜVENLİK: POST ve GET arasında fark yok.

  2. BİLGİSAYARDA GÜVENLİK BİLGİSAYARDA: POST daha güvenlidir (URL geçmişi yok)


2

Neye karşı güvende olmak istediğinizi tanımlamazsanız, güvenlik kavramı anlamsızdır.

Saklanan tarayıcı geçmişine, bazı günlük türlerine ve URL'lerinize bakan kişilere karşı güvende olmak istiyorsanız, POST daha güvenlidir.

Ağ etkinliğinizi koklayan birine karşı güvende olmak istiyorsanız, fark yoktur.


1

Birçok kişi, GET isteklerinin yalnızca veri alması ve sunucudaki verileri değiştirmemesi ve POST isteklerinin tüm veri değişiklikleri için kullanıldığı bir kuralı (Ross tarafından kabul edilmiştir) kabul eder. Bir daha doğal, diğerinden daha güvenli eğer olmasa da yapmak bu sözleşmeye izleyin kesişen güvenlik mantığı uygulayabilirsiniz (hesaplarıyla örneğin sadece insanlar verileri değiştirmek, böylece kimliği doğrulanmamış POST reddedilir).


4
Aslında bir "kural" değil, HTTP standardının bir parçası. RFC, farklı yöntemlerden ne bekleneceği konusunda çok açıktır.
John Nilsson

Aslında, GET isteklerinin durumu değiştirmesine izin verirseniz, ziyaret edebileceğinizi düşündüğü sayfaları önceden getiren bir tarayıcı yanlışlıkla istemediğiniz eylemleri gerçekleştirir.
Jessta

1

Bir POST isteğini değiştirmek daha zordur (sorgu dizesini düzenlemekten daha fazla çaba gerektirir). Düzenleme: Başka bir deyişle, bu sadece belirsizliğe göre güvenlik, ve zar zor.


3
Firefox için birkaç eklentiyi kullanarak POST isteklerini sorgu dizesi istekleri kadar kolay değiştirebilirim. Çerez verilerini kalbimin içeriğine bile değiştirebilirim.
stephenbayer

script kiddies yavaşlatmak olmaz, tam olarak script kiddies her zaman denemek şey türüdür. Sorun bazen başarılı olmaları.
Jacco

2
Uh. Firefox için eklentileri kullanmak = sorgu dizesinden daha fazla çaba.
göz kapaksızlığı

Cevabınız insanlara bir gönderi kullanırken daha güvenli olduklarını, aslında olmadığlarında yanlış bir fikir verecektir. Kötü cevap, kötü adam.
Chris Marasti-Georg

Cevabımın amacını daha açık hale getirmek için düzenledim. Umarım bu yardımcı olur.
göz kapaksızlığı

1

Diğer tüm cevapları tekrarlamak üzereyim, ama henüz bahsetmediğim bir yönü var - bu veri kaybının hikayesi. Nerede bulacağımı bilmiyorum, ama ...

Temelde, her birkaç gece gizemli bir şekilde tüm verilerini kaybetmediği bir web uygulamasıyla ilgilidir ve kimse nedenini bilmiyordu. Günlükler daha sonra incelendiğinde, sitenin google veya başka bir keyfi örümcek tarafından bulunduğunu ve "bu girişi sil" ve "emin misiniz?" bağlantıları.

Aslında - bunun bir kısmı belirtildi. Bu, "GET'teki verileri değil, yalnızca POST'ta verileri değiştirmenin" arkasındaki hikaye. Tarayıcılar GET'i mutlu edecek, asla POST yapmayacak. Robots.txt bile hatalı çalışan tarayıcılara karşı yardımcı olmaz.


1

Ayrıca, siteleriniz GET kullanarak kontrol etmediğiniz diğer harici sitelere bağlantı içeriyorsa, bu verileri sitenizdeki bağlantılara bastıklarında harici sitelerdeki refeerer başlığına koyacağınızı da bilmelisiniz. Giriş verilerini GET yöntemleriyle aktarmak DAİMA büyük bir sorundur. Bu, yalnızca günlükleri kontrol ederek veya Google analitiklerine (veya benzeri) bakarak giriş bilgilerini kolay erişim için açığa çıkarabileceğinden.


1

RFC7231:

"URI'lerin güvenli kaynakları tanımlasalar bile paylaşılmaları, güvence altına alınmamaları amaçlanmıştır. URI'ler genellikle ekranlarda gösterilir, bir sayfa yazdırıldığında şablonlara eklenir ve çeşitli korumasız yer imi listelerinde saklanır. URI içindeki hassas, kişisel olarak tanımlanabilir veya ifşa etme riski taşıyan bilgiler.

Hizmet yazarları, verilerin istek hedefine yerleştirileceği için hassas verilerin sunulması için GET tabanlı formlardan kaçınmalıdır. Mevcut sunucuların, proxy'lerin ve kullanıcı aracılarının çoğu, istek hedefini üçüncü tarafların görebileceği yerlerde günlüğe kaydeder veya görüntüler. Bu tür hizmetler yerine POST tabanlı form gönderimi kullanmalıdır. "

Bu RFC, hassas verilerin GET kullanılarak gönderilmemesi gerektiğini açıkça belirtir. Bu açıklama nedeniyle, bazı uygulayıcılar bir GET isteğinin sorgu bölümünden elde edilen verileri aynı özenle işleyemeyebilir. Verilerin bütünlüğünü sağlayan bir protokol üzerinde çalışıyorum. Bu spesifikasyona göre, GET verilerinin bütünlüğünü garanti etmek zorunda olmamalıyım (ki ben bu özelliklere uymadığı için yapacağım)


1

Daha önce söylediği gibi, bazı insanlar HTTPS güvenliği getiriyor.

Ancak, GET geçmişte saklanabileceğinden POST, GET'ten biraz daha güvenlidir.

Ancak daha da fazlası, ne yazık ki, bazen POST veya GET'in seçimi geliştiriciye bağlı değildir. Örneğin, bir köprü her zaman GET tarafından gönderilir (javascript kullanılarak bir yazı formuna dönüştürülmedikçe).


0

GET herkes tarafından görülebilir (şimdi omzunuzdakiler bile) ve önbelleğe kaydedilir, bu nedenle posta kullanmanın daha az güvenli olması, bazı şifreleme rutini olmadan btw post'un emin olmaması, biraz güvenlik için SSL kullanmanız gerekir ( https)


0

POST'un güvenlik açısından daha kötü olmasının bir nedeni , GET'in varsayılan olarak günlüğe kaydedilmesi, parametrelerin ve tüm verilerin web sunucunuz tarafından neredeyse evrensel olarak günlüğe kaydedilmesidir.

POST bunun tam tersidir , neredeyse evrensel olarak kaydedilmez ve saldırgan etkinliğini tespit etmek çok zor olur.

"Çok büyük" argümanını satın almıyorum , hiçbir şey kaydetmemek için bir sebep yok , en azından 1KB, insanların pop'a kadar zayıf bir giriş noktasında çalışan saldırganları tanımlamaları için uzun bir yol kat eder, sonra POST yapar HTTP tabanlı herhangi bir arka kapının sınırsız miktarda veriyi sessizce geçmesine olanak tanıyan bir çift hizmet.


0

Fark, GET'in verileri açık ve POST'u gizli göndermesidir (http başlığında).

Bu nedenle get, Google'daki sorgu dizeleri gibi güvenli olmayan veriler için daha iyidir. Yetkilendirme verileri asla GET aracılığıyla gönderilmeyecektir - bu nedenle POST'u kullanın. Tabii ki tüm tema biraz daha karmaşık. Daha fazlasını okumak istiyorsanız, bu makaleyi okuyun (Almanca).


0

Son zamanlarda , ortadaki insanın sıkıştırılmış HTTPS isteklerinin istek gövdesini ortaya çıkarmasına izin veren bir saldırı yayınlandı. İstek üstbilgileri ve URL HTTP tarafından sıkıştırılmadığından, GET istekleri bu saldırıya karşı daha iyi korunur.

GET isteklerinin de savunmasız olduğu modlar vardır , SPDY istek başlıklarını sıkıştırır, TLS ayrıca isteğe bağlı (nadiren kullanılan) bir sıkıştırma sağlar. Bu senaryolarda saldırının önlenmesi daha kolaydır (tarayıcı satıcıları zaten düzeltmeler sağlamıştır). HTTP düzeyinde sıkıştırma daha temel bir özelliktir, satıcıların devre dışı bırakması pek olası değildir.

Bu, GET'in POST'tan daha güvenli olduğu bir senaryoyu gösteren bir örnektir, ancak bu saldırı sebebinden POST yerine GET'i seçmenin iyi bir fikir olacağını düşünmüyorum. Saldırı oldukça karmaşıktır ve önemsiz olmayan önkoşullar gerektirir (Saldırganın istek içeriğinin bir kısmını kontrol edebilmesi gerekir). Saldırının zararlı olacağı senaryolarda HTTP sıkıştırmasını devre dışı bırakmak daha iyidir.


0

Feragatname: Aşağıdaki noktalar web sitesi URL'leri için değil, yalnızca API çağrıları için geçerlidir.

Ağ üzerinden güvenlik : HTTPS kullanmalısınız. GET ve POST bu durumda eşit derecede güvenlidir.

Tarayıcı Geçmişi : Angular JS, React JS vb. API çağrıları gibi ön uç uygulamaları, ön uç tarafından yapılan AJAX çağrılarıdır. Bunlar tarayıcı geçmişinin bir parçası haline gelmez. Bu nedenle, POST ve GET eşit derecede güvenlidir.

Sunucu tarafı günlükleri : Yazma veri maskeleme ve erişim günlükleri biçimini kullanarak, tüm veya yalnızca hassas verileri istek URL'sinden gizlemek mümkündür.

Tarayıcı konsolunda veri görünürlüğü: Merkezi amaçlara sahip biri için POST verilerini GET kadar görüntülemek neredeyse aynı çabadır.

Bu nedenle, doğru kayıt uygulamaları ile GET API, POST API kadar güvenlidir. Her yerde POST sonrasında zayıf API tanımlarını zorlar ve bundan kaçınılmalıdır.


-2

Mesaj, mesaj gövdesinde iletildiği için yüklü SSL ile birlikte en güvenli olanıdır.

Ancak bu yöntemlerin hepsi güvensizdir, çünkü altında kullandığı 7 bitlik protokol, kaçma ile hacklenebilir. Hatta seviye 4 web uygulaması güvenlik duvarı üzerinden.

Yuvalar da garanti değildir ... Bazı şekillerde daha güvenli olmasına rağmen.


-3

Bu eski bir gönderi, ancak bazı cevaplara itiraz etmek istiyorum. Hassas verileri aktarıyorsanız, SSL kullanmak istersiniz. SSL'yi bir GET parametresiyle (örn.? Userid = 123) kullanırsanız, bu veriler düz metin olarak gönderilir! Bir POST kullanarak gönderirseniz, değerler iletinin şifrelenmiş gövdesine konur ve bu nedenle çoğu MITM saldırısı tarafından okunamaz.

Büyük ayrım, verinin geçtiği yerdir. Yalnızca veriler bir URL'ye yerleştirilirse şifrelenemez, aksi takdirde URL'yi okuyabildiğiniz için sunucuya yönlendirilemezsiniz. Bir GET böyle çalışır.

Kısacası, SSL üzerinden bir POST'ta verileri güvenli bir şekilde aktarabilirsiniz, ancak bunu bir GET ile SSL kullanarak veya kullanamazsınız.


4
Bu tamamen doğru değil. SSL bir aktarım katmanı protokolüdür. FIRST sunucusuna bağlanır, ardından TÜM Uygulama verilerini şifrelenmiş ikili veri akışı olarak gönderir. Bu konuyu kontrol edin: answer.google.com/answers/threadview/id/758002.html
Simeon G

Bir TCPDump yapın ve bunun% 100 doğru olduğunu göreceksiniz. Sunucuya bağlanmak için isteğinizi şifrelenmemiş olarak göndermeniz gerekir. Bunu bir GET olarak yaparsanız, argümanlarınız ilk isteğe eklenir ve bu nedenle şifrelenmez. Bağladığınız gönderide ne görürseniz görün, bunu TCPDump (veya benzeri) ile test edebilirsiniz.
LVM

1
Bitti! Mac bilgisayarımda tcpdump çalıştırdım. Ve cevabınız% 100 yanlış çıktı. Kullandığım komut şudur: sudo tcpdump -w ssl.data -A -i en1 -n dst bağlantı noktası 443 Sonra ssl.data'ya baktığımda tabii ki gobly gook gördüm. Tüm HTTP verileri şifrelenmiştir. Ve normal bir ssl olmayan çağrının çalıştığından emin olmak için kullandım: sudo tcpdump -w clear.data -A -i en1 -n dst bağlantı noktası 80 . Bunu gmail ve google plus'ımda (HTTPS olan) ve google.com gibi SSL olmayan bazı sayfalarda test ettim.
Simeon G

Bir ağ uzmanı değilim, bu yüzden tcpdump üzerinde yanlış komutları kullandığımı düşünüyorsanız lütfen beni düzeltmekten çekinmeyin.
Simeon G

Komutu elimde değil, ama Wireshark / Ethereal ile de kontrol edebilirsiniz.
LVM

-3

POST bile GET isteklerini kabul eder. User.name ve user.passwd gibi girdilere sahip bir formunuz olduğunu varsayalım, bunların kullanıcı adı ve parolasını desteklemesi gerekir. Yalnızca? User.name = "kullanıcım & user.passwd =" şifrem "eklersek, istek" oturum açma sayfasını atlayarak "kabul edilir.

Bunun çözümü sunucu tarafında filtreler (java filtreleri e olarak) uygulamak ve GET argümanları olarak hiçbir dize sorgusu geçirilmediğini tespit etmektir.


2
Doğru değil! Bu tamamen arka ucunuza POST'ları kabul eden kodun GET'leri de kabul edip etmediğine bağlıdır.
Colin 't Hart
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.