Ne sadece, gerekli kaçan mümkün olduğunu?

3 Cevap php

Ben bir web sitesinde geliştiriciler bir ekip ile çalışıyorum. Web sitesi sınıfları kullanarak olacaktır. Ben sınıflar için veri erişim katmanı oluşturma sorumlu duyuyorum. Tüm kullanıcı girişi (yazı veya almak) alma üzerine kaçtı olacak bir anlayış var. Giriş seviyesi üzerinde çok az kontrole (Ben şahsen herkesin kodunu gözden sürece) sahip, ben (o veritabanını vurur hemen önce) benim de ucunda kaçan atmak için serin olacağını düşündüm. Sorun daha da eğik eklemeden mysql_real_escape_string nasıl kullanılacağını bilmiyorum olmasıdır.

Kullanıcı girişi çok iyi bir çizgi içerebilir beri eminim içinde bölü olmadığından emin olmak için kontrol edemez. Ben kaçan gereken her şey için kontrol ve önlerinde bir çizgi olduğundan emin olmak için mümkün olabilir, ama bunu yapmak için en iyi yol gibi görünmüyor.

Herhangi bir öneriniz?

3 Cevap

Eğer veri erişim katmanı vurur kadar not verileri kaçan düşündünüz mü? Takım alıyor yaklaşımı ile bazı gotchas onların çünkü ben soruyorum:

  • Eğer (bazı doğrulama başarısız oldu, çünkü bir hata mesajı ile formunu tekrar görüntülemek için, örneğin) kullanıcıya form verilerini görüntülemek için gerekiyorsa (' HTML özel değil çünkü), verileri de-kaçmak gerekiyor (< özel olduğu için) ve daha sonra veriyi yeniden kaçış. Eğer pulled from the database, sen (veri kaydedildiği zaman, veritabanı tarafından yapıldı çünkü) bu de-kaçış adım yapmak gerekir, ama yine HTML yapmanız gerekir kullanıcıya form verilerini görüntülemek için gerekiyorsa adımı kaçış. Eğer bir hata yaparsanız ve yanlış işlem yaparsanız, bozuk veri ya da kötü güvenlik sorunlarını tanıtmak.
  • Size app etrafında geçti tüm veriler kaçtı edilecektir karar farklı kaynaklardan sorunu farklı biçimlerde başa çıkabilirim. Yani, veri erişim katmanı veritabanından almak üzerine verileri yeniden kaçacak. Ancak, app gibi farklı parçalar bu hızla de-escape/re-escape saçma bir sürü yol açar, hafif gerekmez (veya tamamen) farklı kaçar. , Veritabanından veri kapmak onu kaçmak, bunu de-kaçış, HTML için kaçış, çıkış o.
  • Ön-uç formu işleme kodu veritabanı samimi bilgiye sahip olması gerekir. Örneğin, \' veritabanına ne anlama geliyor? Nasıl \ bir ' ya da kaçmak olmalıdır - eğer hiç? Hiç veritabanı motorunu değiştirmek, hatta ayarlarını değiştirirseniz, bu değişebilir. Ve sonra bulmak için kaçan / de-kaçan kod bir grup var. Tek bir kaçış / de-kaçış eksik SQL enjeksiyonu yol açabilir.
  • Alternatif olarak, veritabanı katmanı uygulaması standart kaçış dizisinden veritabanı en dönüştürmek için bir de-escape/escape döngüsü yapmak suretiyle ön-uç kod üzerinden veritabanının bu bilgiyi alabilir. Ama bu oldukça saçma görünüyor!

Başka bir yol var: veri kendisini kaçmak kaçtı ihtiyacı hangisi katman edelim. Veriler, her zaman, ham çıkmamış şeklinde tabakaları arasında geçirilir. Yani veri erişim katmanı tüm veritabanı kaçan yok. HTML çıktı kodu tüm HTML kaçan yok. Eğer PDF'leri oluşturmak istiyorum karar verdiğinizde, PDF kod tüm PDF kaçan yok.

  • Eğer, berrak ne çıktı formu yaptığınızda,: Her zaman HTML verileri kaçmak. O geldi olursa olsun. Bir de kaçış asla çalıştırmayın.
  • Her şeyi çiğ etrafında geçer gibi hiçbir de-escape/escape saçma, şimdi var. Gerektiğinde sadece kaçtı.
  • Ön-uç kod veri erişim katmanın uygulanması umursamıyor. Veri erişim katmanı mağazaları ve döner keyfi herhangi bir dize.
  • Eğer herhangi bir SQL enjeksiyon sorun var emin olmak için app bakmak için sadece one yere sahiptir.
  • Kolayca gibi tutucu olarak veritabanı sürücüsü özelliklerinden yararlanabilirler. Sonra bile veri erişim katmanı, her veritabanının kaçan gereksinimlerinin farkında olması gerekir değil; veritabanı sürücüsü işler.

Giriş kaçmış olup olmadığını bilmiyorsanız eğer kaçmak veya otomatik bir karar eklemek hiçbir yolu yoktur. Bunu analiz etmek için deneyebilirsiniz ama iyi olmayacak ve çift ters eğik çizgi çiftleri ve böyle karşılaşacak.

Erişim katmanı gönderilen veri temiz olması ve bir yerde kaçan işlemesi gereken kez karar almak. Bunu yaparsanız, diğer geliştiriciler bu konuda endişelenmenize gerek olmayacaktır (muhtemelen zaten istemiyorum) ve gelecekte başka bir veritabanına taşımak için çok daha kolay olacaktır. Ayrıca, herhangi bir zamanda hazırlanmış tablolara üzerinde taşımak özgürlük verecektir.

Edit: Bu Unuttum:

Having little control over the input level (unless I personally review everyone's code)

Ben sadece çok açık öncelemeli veritabanı katmanına aittir ve başka bir yerde yapılması gereken bir şey olduğunu yaparsanız onları kendilerini keşfetmek için ağrı değer olduğunu düşünüyorum.

Ben senin yerinde olsaydım, ben herkesin kod gözden yeterli tembel olmaz. Eğer kullanıcı girişi kaçması için gözden olmasa bile, yine de kendi kod verimli yapılır görmek isteyebilirsiniz. Ya da belki, bu İncelemeye yapmak için değil, ama birisi bunu yapmak zorunda.

Ben katmanları tarafından görevleri bölünmüş hayır çok uzun zaman önce hemen hemen benzer bir kurulum yaşadım. Bir ben denetleyicisi çalıştı, model üzerinde çalıştı, ve diğer bir görünümleri üzerinde çalıştı. Biz herkesin başkasının kod biz o iş için beklenen şekilde çalışacaktır Herkese çok güvenilir çünkü, biz onları birleştirmek için gerekli süre kadar en diğer kodu gözden rahatsız etmedi. Ne oldu biz geç gelişme modelinde verimsiz kod keşfedildi. Ve o işe yaramadı, sadece verimsiz değildi! Bu nedenle, bize daha fazla zaman mal kodunun büyük parçalar elden vardı.

Ben bunun içinde kullanıcılardan kabul girişleri belirtilen bir teknik gereksinimleri özellikleri belge oluşturmanızı öneririz. Bu belge kullanıcı girişi kabul edecek bölümünü kodlayacak olanlar tarafından takip edilmelidir. Daha da iyisi, onlar size geçmek için gidiyoruz veri geçersiz ise endişelenmenize gerek yok bu yüzden bu gereksinimleri sıkı takip ediliyor olmadığını görmek için birim testleri oluşturun.

Başka bir şey ... PHP kullanarak konum beri, neden iyi bir çerçeve kullanmak değil mi? En uygun çerçeveler artık (iyi, o kadar değil) veritabanı girişi kaçan hakkında bir çok endişelenmenize gerek kendi DAL ile birlikte gelir. Çerçeveler sizin için bunu yapmalıyız.

Ayrıca, 'hazırladı ifadelere bakmak isteyebilirsiniz.