Ben CodeIgniter framework kullanıyorum.
denetleyicisi veya model - ben nerede PHP girdi sterilize edilmelidir?
Ben mümkün olduğu kadar sanitasyon merkeziyetçi bir arkadaş olmak için kullanılan, ancak SO (for example here a>) hakkında yoğun tartışmalar fikrimi değiştirdi. Kesinlikle değer okuma.
Sana aşağıdaki uygulama göndermek:
Merkezi bir doğrulama rutin, hiçbir sanitasyon yapmak, ya da sadece "kaba" (veri türü için diyelim ki,) çekler ve boyutu ("$ _POST [" category_name "] 200 bayt daha büyük olmamalıdır.")
Mark gelen değişkenler unsafe (örneğin, $unsafe_id = $_POST["category_name"];). Ne kontrolörü / sınıfta saklayın / bunun için var yaparız.
Veri dezenfekte where it is used. Gelen veriler, örneğin bir exec çağrısında kullanılırsa, doğrudan çağrı önünde gerekli sanitasyon yapın:
$safe_category_name = escapeshellargs($unsafe_category_name);
exec("external_binary -category_name '$safe_category_name'");
aynı veri daha sonra bir kullanıldığında ise, diyelim ki, MySQL sorgu tekrar aramanın önünde sterilize:
$safe_category_name = mysql_real_escape_string ($unsafe_category_name);
mysql_query("SELECT * FROM items WHERE category_name = '$safe_category_name'");
(Bu sadece bir örnektir. Sıfırdan bir proje başlangıç, bu bağlamda gelen verileri kaçan güçlük uzak alır PDO ve hazırlanmış deyimleri, kullanmak isteyeceksiniz.)
aynı veri bir web sayfası sonra çıktı ise, yine doğrudan çağrı önünde sanitasyon yapın:
$safe_category_name = htmlspecialchars($unsafe_category_name);
echo "<span>$safe_category_name</span>";
Bu uygulama
IMO güvenli bir programlama tarzı yol açar, ilk olarak ele alınması gereken güvensiz değişkenler vardır varsayar bir iş akışı oluşturur.
Gereksiz dönüşümleri önler.
Giriş yapmak için bir tek-tıklama yöntemi olduğu yanılsamasını mücadele olur "güvenli." Yok. Sanitasyon bağlamında% 100 bağlıdır.
Bu yanıtların hepsi genel olarak PHP yöntemlerle ilgili ama CodeIgniter alakasız.
POST data
Eğer global_xss config.php etkin yaptıysanız $ this-> input-> post ('ITEM_NAME') kullandığınızda CodeIgniter otomatik POST verileri temizler. Sadece temizlenmesi belirli öğeler için isterseniz kullanabilirsiniz:
$this->input->post('item_name', TRUE);
Her iki yolda da XSS saldırıları ve diğer konularda güvenlidir.
SQL injection
Eğer ActiveRecord (insert (), update (), vb) kullanın veya sorgu () bağlamaları kullanırsanız veritabanına girilen her şey otomatik olarak kaçtı.
$this->db->query('INSERT INTO bla (?, ?)', array($foo, $bar));
Bu, tüm nereye gider ne yani artık faffing kaçtı olduğunu. Sadece kod ve çerçeve elinde güvenliğini bırakabilirsiniz.
Sanitization veri için dezenfekte ediliyor ne bağlıdır.
Genellikle sanitizasyona iki türü vardır:
İlk durumda bu SQL injection saldırılarını engellemek için, ve ikinci Cross-site scripting saldırıları önlemektir.
Yani soru (yukarıda belirtilen saldırı vektörleri getirmedi) cevap, sizin sanitization açıkları mevcut nerede olacak, ve daha özel olmalıdır:
Ben bu yardımcı umuyoruz.
Kontrolörler ince olmalıdır.
PHP girdi modeli tutan nerede ile ilgisi için model dezenfekte edilmelidir. yani modelinde SQL enjeksiyon engeller.
Ama son çıkışı ile ilgisi için görünümünde dezenfekte edilmelidir. yani görünümünde XSS engeller.
Temelde, bütün hassaslaşması sadece herhangi bir zarar yapıyor kötü veri önlemek için zamanında yapılmalıdır.
Bana göre, bu bir mandatory passage sizin Görünümü Eğer kullanıcıya bilgileri göstermek (yer arasında veri temsil beri kullanıcı girişi, controller dezenfekte edilebilir olmalı ve kullanıcıyı olsun girişi) ve Model (Eğer veri depolamak nerede).
Modeli her zaman, örneğin, belli bir noktada (veritabanı uygulama ve / veya onunla etkileşim yolu) modelinizi geçiş olabilir, yani MVC yapısında bir pluggable bileşeni olarak kabul edilmelidir . Bu nedenle, kullanıcı verileri bir doğrulama DB özel uygulama ile sınırlı olmamalıdır. sanitization o DB-spesifik (eğer varsa) olan sadece bir parçası modelde muhafaza edilmelidir.
Bu dedi, son karar size kalmış her zaman. Sadece aklınızda bulundurun:
Umarım bu yardımcı olur.
Ben form gönderme işleme denetleyicisi koymak istiyorsunuz. Phil Sturgeon işaret olarak config CodeIgniter'daki etkin global_xss seçeneği varsa zaten sanitasyon annoying seviyesini idare edecek.
Ek bir güvenlik seviyesi olarak ben CodeIgniter'ın form_validation kütüphanesini kullanabilirsiniz. İşte size bir örnek denetleyicisi:
function processForm()
{
// fields will need to be validated so load library
$this->load->library('form_validation');
// field name, error message, validaiton rules
$this->form_validation->set_rules('first_name','Name','trim|required');
if($this->form_validation->run() == FALSE)
{
// load form again showing errors
} else {
// update database or proceed to stage 2
}
}
I hope this helps! Cheers