Bağlamlarda çeşitli web formu giriş güvenli yapmak için doğru yolu nedir?

3 Cevap php

Bir web uygulamasının çeşitli yerlerinde kullanım için güvenli web kullanıcı girişi yapmak için yol: Tüm doğru (en esnek, gevşek bağlı, en sağlam, vb okuyun) sizce nedir? Açıkçası biz sadece (disk, vb tasarruf, ekranda veritabanı, görüntü) her bağlamının ilgili sanitization işlevleri kullanabilirsiniz, ancak güvensiz veri işleme ve güvenli hale getirmek için bazı genel "model" var mı? Düzgün, güvenli yapılmadığı sürece güvensiz olarak tedavi uygulamak için kurulmuş bir yolu var mı?

3 Cevap

Zaten söylenir gibi, web güvenliği hakkında endişe dikkate almak için birkaç şey vardır. Burada dikkate alınması gereken bazı temel ilkeleri şunlardır:

  • Sorgular ve değişkenlerin entegre ediliyor kullanıcıların doğrudan giriş kaçının.

Yani bu araçlar $variable = $_POST['user_input'] gibi bir şey yok. Bu gibi herhangi bir durum için, kullanıcıya çok fazla kontrol teslim edilir. Giriş bazı veritabanı sorgusu etkiler ise, her zaman karşı kullanıcı girişi doğrulamak için beyaz listeler var. Sorgu bir kullanıcı adı için ise, iyi bir kullanıcı adlarının bir listesini karşı doğrulamak. Kullanıcı girişi hemen içeri düştü ile basit bir sorgu yapmak ETMEYİN

Bir (mümkünse) istisna bir arama dizesi içindir. Bu durumda, bu kadar basit, sterilize etmek gerekir.

  • Sanitasyon olmadan kullanıcı girişi saklamaktan kaçının.

Kullanıcı profili oluşturarak veya diğer kullanıcılar için bilgi yükleme ise, kabul edilebilir ne tür veriler bir beyaz listesi var, ya da kötü niyetli olabilir şey dışarı atmak için ya var. Bu sisteminizin güvenliği için, ama diğer kullanıcılar için (sonraki noktaya bakınız.) Sadece

  • Arindirilarak olmadan tarayıcı bir kullanıcı ASLA herhangi çıktı.

Bu muhtemelen güvenlik danışmanları bana vurguladı olması en önemli şeydir. Sen sadece o kullanıcı tarafından alındığında girişini sterilize güvenemez. Eğer çıktıyı kendiniz yazmadım eğer, her zaman çıkış herhangi bir HTML karakter kodlama veya <plaintext> etiketi sarılarak zararsız olduğundan emin olun. A kullanıcısı bu sayfayı görüntülemek başka kullanıcıların aleyhine javascript biraz yükler eğer geliştirici kısmında basit ihmal olduğunu. Herhangi ve tüm kullanıcı çıktı hiçbir şey ama tüm tarayıcılarda metin olarak görünebilir bilerek geceleri daha iyi uyku olacaktır.

  • Herkes ancak kullanıcı form kontrol asla izin vermeyin.

XSS olması gerekenden daha kolaydır ve bir paragrafa karşılamak için gerçek bir ağrı. Basitçe bir form oluşturduğunuzda, koyun kullanıcıların form verilerini idare edecek bir komut dosyası erişim veriyoruz. Birinin oturumu veya birinin çerez çalmak eğer ben form sayfasındaki oldu sanki, ben şimdi komut konuşabilirsiniz. Ben beklediği veri türünü ve bunun için bakacağız değişkenlerin isimlerini biliyorum. Ben kullanıcı ve komut farkı söyleyemem sanki sadece bu değişkenler iletebilirsiniz.

Yukarıdaki sanitasyon ancak kullanıcı doğrulama meselesi değildir. Benim son nokta doğrudan bu fikri ile ilgili.

  • Kullanıcı doğrulama veya rol doğrulama için çerezleri kullanmaktan kaçının.

Bir kullanıcının çerez çalmak olabilir, ben bir kullanıcı kötü bir gün emin olun daha fazlasını yapmak mümkün olabilir. Ben çerez "üye" olarak adlandırılan bir değeri vardır fark ederseniz, ben çok kolay "admin" bu değeri değiştirebilirsiniz. Belki de işe yaramaz, ancak birçok komut için, herhangi bir yönetici düzeyinde bilgi anında erişim olurdu.

Basitçe söylemek gerekirse, bir web formu sabitlemek için kolay bir yolu yoktur, ancak ne yapmaları gerektiğinin basitleştirmek temel ilkeleri vardır ve böylece komut güvence stres kolaylaştırır.

Iyi ölçmek için bir kez daha:

  • Tüm girdileri
  • Tüm çıktı Encode
  • Sıkı bir beyaz listeye karşı yürütülmesi için kullanılan herhangi bir giriş doğrulamak
  • Giriş gerçek kullanıcıdan gelen olduğundan emin olun
  • Herhangi bir kullanıcı veya rol tabanlı doğrulama browser-side/user-modifiable yapmak asla

Ve herhangi bir kişinin liste ayrıntılı ya da mükemmel olduğunu varsayalım asla.

Ben böyle bir genel amaçlı bir çerçeve hem de var ki biraz şüpheci daha değilim ve bir programlama dili daha az karmaşık olması.

"Güvenli" bir tanımı farklı katmanları arasında çok farklı

  • Girdi alanı doğrulama, sayılar, tarihler, listeleri, posta kodları, araç tescilleri
  • Çapraz alan doğrulama
  • Alan doğrulama - geçerli bir sayaç okuma? Bayan Jones bu ay 300.000.000 £ TMMOB kullanılır?
  • Inter-istek doğrulama - Eğer gerçekten aynı gün kendiniz için iki transatlantik uçuş rezervasyon?
  • Veritabanı tutarlılık, yabancı anahtar doğrulama
  • SQL injection

Ihlalleri tespit edildiğinde de eylemleri düşünün.

  • UI katmanında neredeyse kesinlikle sadece sessizce numberic alanlarda sigara haneli chras dışarı şerit yok, biz UI hata yükseltmek
  • UI biz muhtemelen all alanlar ve bayrak her hatayı doğrulamak istiyor
  • diğer katmanları biz bir istisna ya da bir iş sürecini intiate olabilir

Belki vizyon kaçırıyorum? Eğer aklınızda ne yakın alır bir şey gördün mü?

Tüm kullanımlar için veri sterilize etmek için tek bir yöntemi kullanmak değil, ama iyi bir başlangıç:

Filtre Var verilerin farklı bir sayı alır ve (eğer sayılar olmasını bekliyoruz şeyleri olmayan basamak gibi) kötü karakterleri çıkarır ve emin geçerli biçimde (IP adresleri) yapar.

Not: Uygun fonksiyonu için etrafında çok Google E-posta Adresleri, çok daha karmaşık filter_var uygulanması daha vardır.

Bir veritabanına giriş şeyler üzeresiniz kadar ben bu kullanarak tavsiye etmem, ve sadece yine hazırlanmış mysqli ifadeler kullanmak muhtemelen iyidir.