PHP &

4 Cevap php

PLATFORM: PHP & mySQL

Benim deney amaçları için, benim kendi web kendimi XSS enjeksiyonlarının birkaç denedim. Benim form textarea girişi var bu durumu göz önünde bulundurun. Bu bir textarea olduğu gibi, ben metin ve (İngilizce) karakterlerin her türlü girmek mümkün duyuyorum. İşte benim gözlemler:

A). Ben sadece sayisinda strip_tags ve mysql_real_escape_string uygulamak ve sadece veritabanına veri ekleme önce the query is breaking ve ben nedeniyle anormal fesih, benim masa yapısını gösteren bir hata ile vurmak duyuyorum benim girişine htmlentitiesi kullanmayın yoksa.

B). Ben sadece veritabanına veri ekleme, önce benim girişi strip_tags, mysql_real_escape_string ve htmlentitiesi uygulayarak ediyorsam, the query is NOT breaking ve benim veritabanına textarea veri eklemek için başarıyla mümkün mümkün duyuyorum.

Yani tam olarak ne zaman kullanılması gerektiğini htmentities pahasına ama emin kullanılması gerektiğini anlıyorum. Akılda yukarıda, ben bilmek istiyorum:

  1. Tam olarak ne zaman htmlentities kullanılmalıdır? Sadece ben DB verileri göstermek için çalışıyorum htmlentitiesi uygulamak sonra DB içine veri ekleme ya da bir şekilde DB içine veri almak ve daha önce kullanılmış mıdır?

  2. (Ben benim durumumda en belirgin ve etkin çözüm olduğuna inanıyorum) Yukarıdaki nokta B anlatılan yöntem) takip ederseniz ben DB verileri göstermek için çalışıyorum, ben hala htmlentitiesi uygulamak gerekiyor? Eğer öyleyse, neden? Değilse, neden olmasın? http://shiflett.org/blog/2005/dec/google-xss-example: Ben de yazı geçtikten sonra benim için gerçekten kafa karıştırıcı, çünkü ben bu ask

  3. Sonra bu bir daha PHP fonksiyon denir: html_entity_decode. Htmlentities benim girişine uygulanmıştır gibi (B noktasının belirtildiği gibi benim prosedürün ardından) DB benim verileri göstermek için kullanabilir miyim? Zaman html_entity_decode ve Htmlentities ve: Hangisini dan tercih etmelisiniz?

PREVIEW PAGE:

Ben burada özel bir durumun biraz daha özel ayrıntıları eklemek için yardımcı olabileceğini düşündüm. Bir 'Önizleme' sayfası olduğunu düşünün. Bir textarea giriş gönderdiğinizde Şimdi, Önizleme sayfa girişi alır ve gösterir html ve aynı zamanda, gizli bir giriş, bu girişi toplar. Önizleme butonuna gönderme düğmesi vurduğunuzda, daha sonra gizli girişinden veri için yeni bir sayfa POST'ed ve o sayfa DB içine, gizli giriş içerdiği verileri ekler. Ben formu başlangıçta gönderildiğinde htmlentitiesi geçerlidir (ama sadece sayisinda strip_tags ve mysql_real_escape_string uygulanır) ve textarea içinde kötü niyetli bir giriş var yoksa, gizli giriş kırık ve gizli giriş son birkaç karakter gözle {[(0 olarak görülüyor )]} istenmeyen sayfada. Yani akılda tutarak bu, ben Önizleme sayfasında düzgün gizli giriş bütünlüğünü korumak için bir şeyler yapmak ve henüz bunu kırmak kalmaması gizli giriş veri toplamak gerekir. Bunu nasıl gidiyorsun? Bu bilgi gönderme gecikme için özür dileriz.

Şimdiden teşekkür ederim.

4 Cevap

İşte başparmak genel bir kural.

last possible moment de değişkenleri Escape.

Eğer değişkenler verilerin temiz temsilleri olmak istiyorum. İşte o zaman kesinlikle don't bu istiyorum, "O'Brien" adlı birinin soyadını saklamak için çalışıyorsanız, bir:

O'Brien
O\'Brien

.. Iyi, onun adı değil, çünkü: içinde hiçbir imi ya da eğik çizgi var. Bunu değiştirmek zaman that,: (SQL sorgusunun içine eklemek, ya da bir HTML sayfası yazdırmak gibi) Eğer değişken ve belirli bir bağlamda çıktı bunu da çekerken.

$name = "O'Brien";

$sql = "SELECT * FROM people "
     . "WHERE lastname = '" . mysql_real_escape_string($name) . "'";

$html = "<div>Last Name: " . htmlentities($name, ENT_QUOTES) . "</div>";

Sen htmlentities veritabanında saklanan dizeleri kodlanmış olmasını istiyorsanız asla. Bir CSV veya PDF, ya da bir şey isn't HTML oluşturmak istediğinizde ne olur?

Temiz verileri tutmak ve sadece anın belirli bir bağlam için kaçış.

Özünde, çıkış noktasında htmlentities, vb sonra mysql_real_escape_string önce veritabanı ekleme için kullanabilirsiniz (SQL enjeksiyonu önlemek için) ve olmalıdır.

Ayrıca sayısal değerler gibi is_int, is_float, vb gibi fonksiyonlar vb, gerçekten sayısal olduğunu (örneğin) sağlamak için tüm kullanıcı girişi kontrol aklı uygulamak isteyeceksiniz Bu noktada yararlıdır. (Bu işlevler ve diğer benzer olanlar hakkında daha fazla bilgi için PHP kılavuzun variable handling functions bölümüne bakın.)

  1. HTML'E (DB veya $ _GET / $ _POST hiçbir olsun) değerini yazdırırken daha önce sadece. htmlentities veritabanı ile hiçbir ilgisi yoktur.
  2. B overkill. Size DB yerleştirmeden önce mysql_real_escape_string ve htmlentities HTML yazdırmadan önce gerekir. Htmlentities etiketleri gibi ekranda olacak sonra, etiketleri şerit gerekmez < b r /> e.t.c

Teorik DB için yerleştirmeden önce htmlentitiesi yapabilir, ama özgün metni gerekir eğer bu, daha fazla veri işlem yapmak gerekebilir.

3. See above

Ben daha önce de iki önemli şey öğrendim:

Eğer _POST / $ _GET / $ _REQUEST $ değerleri alma ve değerlerini sterilize mysql_real_escape_string işlevini kullanmak, DB eklemeyi planlıyoruz ediyorsanız. Htmlentities onları kodlamak etmeyin.

Neden sadece Htmlentities onları kodlamak ve veritabanında onları koymak değil mi? Peki, burada bir şey var - amaç veri olarak anlamlı ve mümkün olduğunca temiz yapmak ve Jeff'in Köpek gibi Htmlentities ile verileri kodlamak Jeff " s Köpek olur ... onun anlamını kaybetmeye verilerin bağlamını neden olacaktır . Eğer DİNLENME servcies uygulamaya karar ve DB o dize getirme ve JSON koyarsanız ve - bu güzel değil Jeff " s Köpek gibi geleceğiz. Siz de çözmek için başka bir işlev eklemek gerekiyor.

Eğer "Jeff'in Dog" "Jeff " s Dog eşleşmiyor beri onu bulamazsınız" tablosundan nereden alan = 'Jeff \' s Köpek 'select * "SQL kullanarak" Jeff Dog "aramak istediğiniz varsayalım . " Kötü, ha?

Bir web sayfasına (CHAR türünden) çıkış alfanümerik dizeleri, htmlentitiesi kullanım - HER ZAMAN!