JavaScript: istemci tarafı ile sunucu tarafı doğrulaması


179

Hangisi istemci tarafı veya sunucu tarafı doğrulaması yapmak için daha iyidir?

Bizim durumumuzda kullanıyoruz

  • jQuery ve MVC.
  • Görünümümüz ile Denetleyici arasında geçiş yapmak için JSON verileri.

Yaptığım doğrulamaların çoğu, kullanıcılar girerken verileri doğrulamak. Örneğin, keypressolayı bir metin kutusundaki harfleri önlemek, maksimum karakter sayısını ayarlamak ve bir sayının aralıkta olması için kullanıyorum.

Sanırım daha iyi bir soru olurdu, istemci tarafı üzerinde sunucu tarafı doğrulama yapmak için herhangi bir fayda var mı?


Müthiş herkese cevap veriyor. Sahip olduğumuz web sitesi şifre korumalı ve küçük bir kullanıcı tabanı için (<50). JavaScript çalıştırmıyorlarsa ninjaları göndeririz. Ancak herkes için bir site tasarlıyor olsaydık, her iki tarafta da doğrulama yapmayı kabul ederdim.


2
javascript devre dışı bırakılabilir
Enrico Murru

JavaScript'i devre dışı bırakan kullanıcıları engellemenin kesin bir yolu yoktur. Kullanıcı JS etkin olarak sayfanıza gelir ve ardından devre dışı bırakırsa, yapabileceğiniz hiçbir şey yoktur. (Tamam, gönderme kontrolünü uygulamak için JS'yi kullanabilirsiniz, böylece bu senaryoda çalışmayı durduracaktır, ancak bu her şey gibi atlanabilir.)
Stewart

Yanıtlar:


347

Diğerlerinin söylediği gibi, her ikisini de yapmalısınız. İşte nedeni:

Müşteri Tarafı

Ortalama bir kullanıcıya daha iyi geri bildirim verebildiğiniz için önce istemci tarafında girişi doğrulamak istiyorsunuz . Örneğin, geçersiz bir e-posta adresi girip bir sonraki alana geçerse, hemen bir hata mesajı gösterebilirsiniz. Bu şekilde kullanıcı formu göndermeden önce her alanı düzeltebilir .

Yalnızca sunucuda doğrulama yaparsanız, formu göndermeleri, bir hata iletisi almaları ve sorunu bulmaya çalışmaları gerekir.

(Sunucunun, kullanıcının orijinal girdisi doldurulmuş olarak formu yeniden oluşturmasıyla bu acı hafifletilebilir, ancak istemci tarafı doğrulaması hala daha hızlıdır.)

Sunucu Tarafı

Sunucu tarafında doğrulamak istiyorsunuz çünkü JavaScript'inizi kolayca atlayabilen ve sunucuya tehlikeli girdi gönderebilen kötü niyetli kullanıcıya karşı koruma sağlayabilirsiniz.

Kullanıcı arayüzünüze güvenmek çok tehlikelidir. Yalnızca kullanıcı arayüzünüzü kötüye kullanmakla kalmaz, kullanıcı arayüzünüzü, hatta bir tarayıcıyı kullanmıyor olabilirler . Kullanıcı URL'yi manuel olarak düzenler veya kendi Javascript'ini çalıştırırsa veya HTTP isteklerini başka bir araçla değiştirirse ne olur? curlÖrneğin bir komut dosyasından veya komut dosyasından özel HTTP istekleri gönderirlerse ne olur ?

( Bu teorik değildir; örneğin, POSTkullanıcı her şirketin arama formunu doldurmuş, sonra toplanmış ve sıralanmış gibi istek göndererek kullanıcının aramasını birçok ortak havayoluna, otobüs şirketine vb. Yeniden gönderen bir seyahat arama motorunda çalıştım. Bu şirketlerin JS formu hiçbir zaman yürütülmedi ve döndürülen HTML'de hata mesajları vermeleri bizim için çok önemliydi. Tabii ki, bir API güzel olurdu, ama yapmamız gereken buydu. )

Buna izin vermemek sadece güvenlik açısından naif olmakla kalmaz, aynı zamanda standart dışıdır: bir istemcinin istedikleri şekilde HTTP göndermesine izin verilmeli ve doğru şekilde yanıt vermelisiniz. Buna doğrulama da dahildir.

Sunucu tarafı doğrulaması da uyumluluk için önemlidir - tarayıcı kullanıyor olsalar bile tüm kullanıcılar JavaScript etkin olmayacaktır.

Zeyilname - Aralık 2016

Veritabanının geçerli durumuna bağlı olduğu için sunucu tarafı uygulama kodunda düzgün bir şekilde yapılamayan ve istemci tarafı kodunda tamamen imkansız olan bazı doğrulamalar vardır . Örneğin, "bu kullanıcı adını başka hiç kimse kaydetmedi" veya "yorum yaptığınız blog yayını hala mevcut" veya "mevcut rezervasyonunuz istediğiniz tarihlerle çakışmıyor" veya "hesap bakiyenizde bu satın alma işlemini karşılamaya yetecek kadar var ." Yalnızca veritabanı, ilgili verilere dayanan verileri güvenilir bir şekilde doğrulayabilir. Geliştiriciler bunu düzenli olarak berbat ediyor , ancak PostgreSQL bazı iyi çözümler sunuyor .


30
Bu, 6 yıl sonra bile kabul edilen cevap olmalı: P
Jacob McKay

17
Evet, emin olmak için neredeyse 10 yıl beklemek istedim.
Brad8118

2
@kidmosey "Bu KURU ilkelerin bariz bir ihlali" Evet, bu bizim gibi programcılar için acı anlamına geliyor. Ancak bir kayıt formu hayal edin. Müşteri kodundaki "bir e-posta adresi bir @ içermelidir" bilgisini çoğaltmak, kullanıcıların daha hızlı geri bildirim alması ve daha fazla kaydolması anlamına gelir ve bu da yılda 100 bin dolar daha fazla gelir sağlarsa, ek bakım maliyetleri için daha fazla ödeme yapar. KURU çok iyi bir prensiptir, ancak tek düşünce bu değildir. Kod kalitesi, maliyet / fayda analizinde kullanıcılara ve bir kuruma ne kadar iyi hizmet ettiğiyle gerçekten ölçülür.
Nathan Long

1
@ArunRaaj Evet, sorunların çoğunu bu şekilde yakalayacaksınız, ancak% 100 güvenilir değil. İki kullanıcı formu aynı anda dolduruyorsa, her ikisine de user1kullanılabilir bir kullanıcı adı olduğu söylenebilir . Gönderdiklerinde, sunucu tarafını yeniden kontrol etmedikçe ikisi de aynı kullanıcı adını alır. Ve sunucu uygulama kodundaki bir kontrol bile aynı soruna sahip olabilir: iki istek gelir, birincisi veritabanını kontrol eder ve Tamam'a söylenir, ikincisi veritabanını kontrol eder ve Tamam'a söylenir, ilki kaydedilir, ikincisi kaydedilir kopya olarak. Sadece bir db benzersiz kısıtı benzersizliği garanti eder.
Nathan Long

1
@NathanLong Yarış koşullarına duyarlı verilerle ilgili doğrulama, bu cümlenin ses çıkarması kadar zor değildir. Düzgün yapmak bir acıdır, ancak talep etmek için senkronize edilmiş bir kaynak kullanan bir rezervasyon mekanizması oluşturun. Kullanıcı "usernameA" yazıyorsa, sunucu üzerinde benzersiz olup olmadığını kontrol etmek için birden fazla eşzamanlı çağrıyı engelleyen bir benzersizlik denetimi; benzersizse, aynı oturum kimliğiyle farklı bir kullanıcı adı test edildiyse, istemciye atanan geçici bir jetonla da ayırın. Jetonun süresi makul bir süre sonra dolar. Örnek: TicketMaster koltuk rezervi.
Elaskanator

79

Evet, istemci tarafı doğrulaması her zaman tamamen atlanabilir. Daha iyi bir kullanıcı deneyimi sağlamak için hem istemci tarafı, hem de aldığınız girdinin sadece istemci tarafından doğrulanmadığından ve doğrulanmadığından emin olmak için sunucu tarafı yapmanız gerekir.


43

Sadece tekrar edeceğim, çünkü oldukça önemli:

Her zaman sunucuda doğrula

ve kullanıcı duyarlılığı için JavaScript ekleyin.


31

İstemci tarafı doğrulamasına göre sunucu tarafı doğrulaması yapmanın yararı, istemci tarafı doğrulamanın atlanabilmesi / değiştirilebilmesidir:

  • Son kullanıcı javascript'i kapatmış olabilir
  • Veriler, sitenizi bile kullanmayan biri tarafından, bunu yapmak için tasarlanmış özel bir uygulama ile doğrudan sunucunuza gönderilebilir
  • Sayfanızdaki bir Javascript hatası (herhangi bir sayıdan kaynaklanan), doğrulama işleminizin tümü olmasa da bir kısmıyla sonuçlanabilir

Kısacası - her zaman, sunucu tarafını her zaman doğrulayın ve ardından son kullanıcı deneyimini geliştirmek için istemci tarafı doğrulamayı ek bir "ekstra" olarak düşünün.


18

Her zaman sunucuda doğrulamanız gerekir .

Ayrıca istemcide doğrulama yapmak kullanıcılar için iyi, ancak tamamen güvensizdir.


9

Hala cevaplayacak bir yer buluyorum.

Rob ve Nathan'ın cevaplarına ek olarak, müşteri tarafı doğrulamalarının önemli olduğunu da ekleyeceğim. Web formlarınıza doğrulama uygularken şu yönergeleri izlemeniz gerekir:

İstemci Tarafı

  1. Web sitenizdeki gerçek kullanıcılardan gelen gerçek istekleri filtrelemek için müşteri tarafı doğrulamaları kullanılmalıdır.
  2. İstemci tarafı doğrulaması, sunucu tarafı işlemesi sırasında oluşabilecek hataları azaltmak için kullanılmalıdır.
  3. İstemci tarafı doğrulaması, bant genişliği ve kullanıcı başına istekleri kaydetmeniz için sunucu tarafı gidiş-dönüşlerini en aza indirmek için kullanılmalıdır.

Sunucu Tarafı

  1. İstemci tarafında başarıyla yapılan doğrulamanın% 100 mükemmel olduğunu varsaymamalısınız. 50'den az kullanıcıya hizmet etse bile. Hangi kullanıcının / emplyee'nizin "kötülüğe" dönüştüğünü asla bilemezsiniz ve yerinde doğru doğrulamalara sahip olmadığınızı bilerek bazı zararlı etkinlikler yapamazsınız.
  2. E-posta adresini, telefon numaralarını doğrulamak veya bazı geçerli girişleri kontrol etmek açısından mükemmel olsa bile, çok zararlı veriler içerebilir. Doğru ya da yanlış olursa olsun sunucu tarafında filtrelenmesi gerekir.
  3. İstemci tarafındaki doğrulama atlanırsa, sunucu tarafındaki doğrulamalarınız sizi sunucu tarafındaki işleminizdeki olası hasarlardan kurtarmaya gelir. Son zamanlarda, bazı kötü yararlar elde etmek için uygulanabilecek birçok SQL Enjeksiyonu hikayesi ve diğer teknikler duyduk.

Her iki doğrulama türü de kendi kapsamlarında önemli roller oynar, ancak en güçlü olanı sunucu tarafıdır. Tek bir noktada 10 bin kullanıcı alırsanız, kesinlikle web sunucunuza gelen isteklerin sayısını filtrelersiniz. Geçersiz e-posta adresi gibi tek bir hata bulursanız, formu tekrar geri gönderir ve kullanıcıdan sunucunuzu ve bant genişliğini kesinlikle yiyecek olanı düzeltmesini ister. Daha iyi javascript doğrulaması uygularsınız. Javascript devre dışı bırakılmışsa, sunucu tarafı doğrulaması kurtarmaya gelecek ve bahse girerim, web sitelerinin% 99,99'u javascript kullandığından ve zaten tüm modern tarayıcılarda varsayılan olarak etkin olduğundan sadece birkaç kullanıcı yanlışlıkla devre dışı bırakmış olabilir.


İnsanların kod enjeksiyonuna karşı tamamen korumayı ihmal ettiklerini gördüm, bunu sadece müşteri tarafında yapmayın. Ve kod enjeksiyonu referansı, bunun bağlantısı olmadan tamamlanmaz: xkcd.com/327 :)
Stewart

8

Sunucu tarafı doğrulaması yapabilir ve her alan için doğrulama sonuçları olan bir JSON nesnesi geri gönderebilir, istemci Javascript'i minimumda tutar (sadece sonuçları görüntüler) ve yine de hem istemci hem de sunucuda kendinizi tekrarlamak zorunda kalmadan kullanıcı dostu bir deneyime sahip olursunuz.


3
Kullanıcı dostu? Olabilir. Neredeyse anlık ve tereyağlı pürüzsüz mü? Muhtemelen değil.
quadrupleslap

4

İstemci tarafı, HTML5 giriş türleri ve kalıp nitelikleri aracılığıyla temel bir doğrulama kullanmalıdır ve bunlar yalnızca daha iyi kullanıcı deneyimi için aşamalı geliştirmeler için kullanıldığından (<IE9 ve safari'de desteklenmemiş olsalar da, onlara güvenmiyoruz). Ancak ana doğrulama sunucu tarafında gerçekleşmelidir.


"Ancak ana doğrulama sunucu tarafında gerçekleşmelidir." Olmamalı, olmalı.
Stewart


2

JavaScript çalışma zamanında değiştirilebilir.

Sunucuda bir doğrulama yapısı oluşturma ve bunu istemci ile paylaşma modeli öneririm.

Her iki uçta ayrı doğrulama mantığına ihtiyacınız olacak, örn:

"required"üzerinde niteliklerini inputsistemci tarafında

field.length > 0 sunucu tarafı.

Ancak, aynı doğrulama spesifikasyonunun kullanılması, validasyonu her iki uçta yansıtmanın biraz fazlalığını (ve hatalarını) ortadan kaldıracaktır.


2

İstemci tarafı veri doğrulaması daha iyi bir kullanıcı deneyimi için yararlı olabilir: örneğin, e-posta adresini yanlış yazan bir kullanıcı, yaptığı yazım hatası hakkında bilgi edinmek için isteğinin uzak bir sunucu tarafından işlenmesini beklememeliyim.

Bununla birlikte, bir saldırgan istemci tarafı doğrulamasını atlayabildiğinden (ve tarayıcıyı hiç kullanamayabileceğinden), sunucu tarafı doğrulaması gereklidir ve arka uçlarınızı hain kullanıcılardan korumak için gerçek kapı olmalıdır.


1

Brüt, sistematik, rastgele hatalar arasında ayrım yapan ilginç bir bağlantıyla karşılaştım .

Client-Side validationBrüt ve rastgele hataları önlemek için mükemmel uyum sağlar. Genellikle doku ve giriş için maksimum uzunluk. Sunucu tarafı doğrulama kuralını taklit etmeyin; kendi brüt, başparmak doğrulama kuralınızı sağlayın (örn. istemci tarafında 200 karakter; ngüçlü bir iş kuralı tarafından dikte edilen sunucu tarafında).

Server-side validationsistematik hataları önlemek için mükemmel uyum sağlar; iş kurallarını uygular.

Katıldığım bir projede, doğrulama sunucuda ajax istekleri ile yapılır. İstemcide buna göre hata mesajları görüntülüyorum.

İlave okumalar: brüt, sistematik, rastgele hatalar:

https://answers.yahoo.com/question/index?qid=20080918203131AAEt6GO


-2

Işık doğrulaması yapıyorsanız, bunu istemcide yapmak en iyisidir. Sunucunuzun daha iyi performans göstermesine yardımcı olacak ağ trafiğini kaydedecektir. Parola gibi bir veritabanından veya başka bir şeyden veri çekmeyi içeren karmaşık bir doğrulama varsa, bunu verilerin güvenli bir şekilde kontrol edilebileceği sunucuda yapmak en iyisidir.


2
Demek istediğin en iyi fikir değil. Kullanıcı her zaman istemci tarafı doğrulamasını atlayabilir ve istediklerini veritabanına gönderebilir.
kremuwa
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.