HTTP, sunucuyla etkileşim için farklı yollar tanımlar ve 4 temel yöntem vardır: GET, POST, PUT ve DELETE. URL'nin tam adı bir kaynak tanımlayıcısıdır, bunu şöyle düşünebiliriz: URL adresi, ağdaki bir kaynağı tanımlamak için kullanılır ve HTTP'de GET, POST, PUT, DELETE bu kaynağı kontrol etmek, değiştirmek, eklemek ve silmek gibi dört işlemle karşılık gelir. Bu noktada genel bir anlayışa sahip olmalısınız; GET genellikle kaynak bilgisini almak/sorgulamak için kullanılırken, POST genellikle kaynak bilgisini güncellemek için kullanılır.
1. HTTP spesifikasyonuna göre, GET bilgi alımı için kullanılır ve güvenli ve aynı güç sahibi olmalıdır.
(1). Sözde güvenlik demek, işlemin bilgiyi değiştirmek yerine elde etmek için kullanıldığı anlamına gelir. Başka bir deyişle, GET taleplerinin genellikle yan etkileri olmamalıdır. Yani, veritabanı sorgusu gibi sadece kaynak bilgisini alır ve kaynağın durumunu değiştirmez, veri eklemez veya durumu etkilemez.
* Not: Burada güvenlik kavramı yalnızca değiştirilmemiş bilgileri ifade eder.
(2). idempotent, aynı URL'ye yapılan birden fazla isteğin aynı sonucu vermesi gerektiği anlamına gelir.
Ancak pratikte yukarıdaki iki düzenleme o kadar katı değildir. Başkalarının makalelerinden alıntı örnekleri: Örneğin, bir haber sitesinin ana sayfası sürekli güncellenir. İkinci talep farklı bir haber partisi getirse de, operasyon yine de güvenli ve güçlü kabul edilir çünkü her zaman güncel haberleri geri getirir. Temelde, amaç bir kullanıcının bir bağlantıyı açtığında, kaynağın kendi bakış açısından değiştirilmediğinden emin olmasıdır.
2. HTTP spesifikasyonuna göre, POST sunucudaki bir kaynağı değiştirebilecek bir isteği temsil eder. Yukarıdaki örneği alıntılamaya devam ederek: Still news Web sitesini örnek alın, okuyucular haberler hakkında kendi yorumlarını paylaşmalıdır, çünkü yorum gönderildikten veya kaynaklar değiştirildikten sonra sitenin kaynakları farklıdır.
Yukarıda, HTTP spesifikasyonunda GET ve POST'un bazı prensiplerini kabaca tartışıyor. Ancak, birçok kişi bunu yaparken HTTP spesifikasyonuna uymaz, bu da bu sorunun birçok nedenine yol açabilir, örneğin:
1. Birçok kişi kaynakları güncellemek için GET kullanıyor çünkü POST kullanmak için FORM'a gitmeleri gerekiyor, bu biraz sorunlu olacak.
2. Kaynakları ekleme, silme, değiştirme ve kontrol işlemleri, PUT ve DELETE kullanmaya gerek kalmadan GET/POST ile aslında tamamlanabilir.
3. Bir diğeri, erken Web MVC çerçeve tasarımcılarının URL'leri bilinçli olarak soyut kaynak olarak görmemesi ve tasarlamaması, bu yüzden ciddi bir sorun olarak, geleneksel Web MVC çerçevesinin temelde sadece iki HTTP yöntemi, GET ve POST desteği vermesi, ancak PUT ve DELETE yöntemlerini desteklemesidir.
* MVC'nin kısa açıklaması: MVC başlangıçta Masaüstü programında vardı, M veri modelini, V kullanıcı arayüzünü ve C denetleyiciyi ifade eder. MVC'nin kullanılmasının amacı, aynı programın farklı temsiller kullanabilmesi için M ve V'nin uygulama kodunu ayırmaktır.
Yukarıdaki 3 nokta genellikle eski stili tanımlar (HTTP spesifikasyonuna sıkı sıkıya uyulmadan), mimarinin gelişimiyle birlikte şimdi HTTP spesifikasyonunu destekleyen yeni bir stil olan REST (Representational State Transfer) var.
Ana problemi konuştuktan sonra, yüzey fenomeninden GET ile POST arasındaki farka bakalım:
1. GET talebinin verileri URL'ye eklenir (yani veri HTTP protokol başlığına yerleştirilir) ve ? URL'yi böl ve veri ileti, parametreler & ile bağlanır, örneğin: login.action?name=hyddd&password=idontknow&verify=%E4%BD%A0%E5%A5%BD. Veri İngilizce harfler/sayılarsa, olduğu gibi gönderin, eğer boşluksa, +'ya dönüştürün, Çince/diğer karakterlerse, diziyi doğrudan BASE64 ile şifreleyin ve örneğin %E4%BD%A0%E5%A5%BD gibi bir örnek alın; burada %XX'deki XX, onaltılık sembolle temsil edilen ASCII'dir.
POST, gönderilen verileri HTTP paketinin paket gövdesine yerleştirir.
2. "GET yöntemiyle gönderilen maksimum veri yalnızca 1024 bayt olabilir, teorik olarak POST'a sınır yoktur ve IIS4'te 80KB, IIS5'te 100KB'a kadar büyük miktarda veri aktarılabilir"??!
Yukarıdaki cümle diğer makalelerden yönlendirilmiştir, aslında bunu söylemek yanlış ve yanlıştır:
(1). Öncelikle, "GET yöntemiyle gönderilen veri en fazla 1024 bayt olabilir", çünkü GET verileri URL üzerinden gönderir, bu yüzden GET ile gönderilebilecek veri miktarı doğrudan URL'nin uzunluğuyla ilgilidir. Aslında, URL'ler için üst parametre sınırı yoktur ve HTTP protokol spesifikasyonu URL uzunluğunu sınırlamaz. Bu sınır, belirli bir tarayıcı ve sunucu tarafından uygulanan bir sınırlamadır. IE'nin URL uzunluğu sınırı 2083 bayttır (2K+35). Netscape, FireFox gibi diğer tarayıcılar için teorik bir uzunluk sınırı yoktur ve bu sınır işletim sisteminin desteğine bağlıdır.
Bu, sadece parametre değer veri uzunluğunu değil, tüm URL uzunluğunu sınırlar. [Bkz. Ref. 5]
(2). Teorik olarak, POST'un boyut sınırı yoktur, HTTP protokol spesifikasyonunun da bir boyut sınırı yoktur ve "POST veri için 80K/100K boyut sınırı vardır" demek doğru değildir, POST verisi için bir sınır yoktur ve sınırlayıcı rol sunucunun işleyicisinin işlem gücüdür.
ASP programları için, Request nesnesi her form alanı işlenirken 100K veri uzunluğu sınırına sahiptir. Ancak Request.BinaryRead ile böyle bir sınırlama yok.
Bundan sonra, IIS 6.0 için Microsoft güvenlik nedenleriyle kısıtlamaları artırdı. Ayrıca şunlara da dikkat etmemiz gerekiyor:
1). IIS 6.0, varsayılan olarak maksimum 200 KB ASP POST verisi sunar ve limit form alanı başına 100 KB'dir. 2). IIS 6.0 yükleme dosyalarının varsayılan boyutu 4MB'dır. 3). IIS 6.0, varsayılan olarak maksimum istek başlığı 16KB'dir. Bu sınırlamalar IIS 6.0'dan önce mevcut değildi. [Bkz. Ref. 5]
Yani yukarıdaki 80K ve 100K sadece varsayılan değerler olabilir (not: IIS4 ve IIS5 parametrelerini henüz doğrulamadım), ama kesinlikle kendiniz ayarlayabilirsiniz. Bu parametrelerin varsayılan değerleri IIS'in her sürümünde farklı olduğundan, detaylar için ilgili IIS yapılandırma belgesine bakınız.
3. ASP'de sunucu, GET isteği parametresini elde etmek için Request.QueryString ve POST istek parametresini elde etmek için Request.Form kullanır. JSP'de, request.getParameter(\"XXXX\") ile alın, ancak jsp'de request.getQueryString() yöntemi de vardır, ancak kullanımı daha zahmetlidir, örneğin: bir test.jsp?name=hyddd&password=hyddd gönderin ve request.getQueryString() kullanarak :name= alın hyddd&password=hyddd。 PHP'de GET ve POST'tan veri almak için $_GET ve $_POST kullanırsınız, $_REQUEST ise hem GET hem de POST taleplerinden veri alabilirsiniz. JSP'de request ve PHP'de $_REQUEST kullanmanın gizli tehlikeleri olduğunu belirtmekte fayda var; bunlar bir sonraki makalede özetlenecek.
4.POST GET'ten daha güvenli. Not: Burada bahsedilen güvenlik, yukarıda bahsedilen GET'te bahsedilen "güvenlik" kavramıyla aynı değildir. Örneğin, GET üzerinden veri gönderirseniz, kullanıcı adınız ve şifreniz URL'de açık metin olarak görünür, çünkü (1) giriş sayfası tarayıcı tarafından önbelleğe alınabilir, (2) diğerleri tarayıcının geçmişini görebilir, böylece başkaları hesabınızı ve şifrenizi alabilir sahte saldırı.
Özetle, Get sunucudan veri talep etme talebi, Post ise sunucuya veri gönderme talebi, FORM'da Yöntem varsayılan olarak "GET" olarak belirlenir, özünde GET ve POST sadece farklı gönderme mekanizmalarıdır, birini alıp göndermez!
|