XSS bakımı

4 Cevap php

Ben bir kalem-test uygulaması koştu ve XSS hataların bir ton, specfically, ben sorgu dizesi yoluyla geri tarayıcıya onaylanmamış veri echo'ing suçlu değilim bulundu.

Specifically, running this puts javascript into my page. http://www.mywebsite.com/search.php?q=%00'" [ScRiPt]%20%0a%0d>alert(426177032569)%3B[/ScRiPt].

Neyse ki, hiçbir yerde ben kullanıcıların bir veritabanına veri kaydetmek ve diğer uesrs sergilemeye izin, bu yüzden insanlar sadece bu sorunun kendilerini kesmek mümkün olacaktır DÜŞÜN, ama ben yine de bunu düzeltmek istiyorum.

Tavsiye Bunu yapmak için:

echo htmlentities($_POST[‘input’], ENT_QUOTES, ‘UTF-8’);

But currently I need to get this patched up asap, then go fix on a case by case basis. I have a header file I include on every page on the site, I know it's bad form, but what could blow up if I did:

array_walk($_POST, 'htmlentities');

Ben COOKIE'den için bunu yapmak ve de GET gerekir. Ben _REQUEST asla kullanmayın.

Teşekkürler

4 Cevap

De yolda HTML-kaçan açıkça yanlış bir şey, ama doğru bir şey ile kodunu değiştirmek kadar geçici bir düzeltme olabilir. Uzun vadede bu unmaintainable olacak ve her yerde sen ve kodlanmış karakterler üzerinden (veritabanı otomatik olarak yapabilir kesilmesi dahil) substring manipülasyonlar yaparak başlamak garip uygulama düzeyinde hataları yükler olacak. Eğer çok daha ayrıntılı olarak app bakmadan söyleyemem rağmen, güvenlik ihlallerine yol büyük olasılıkla değil.

Eğer $ _SESSION her zaman bir şeyler kodlayan başlarsanız, & amp gibi çok uzun dizeleri çarpma-kodlanmış alırsınız; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp , amp; çok hızlı.

Ben insanların sadece kendilerini kesmek mümkün olacaktır DÜŞÜN

Veya, başka bir web sayfasında bir saldırganın, sadece sitenizin gibi görünen bir sahte giriş kutusu görüntüler kullanıcı adı ve şifre hasat veya otomatik olarak kendi hesabını silmek için enjekte yeterli komut ile, sizin için yönlendirebilir veya iframe olabilir. Bunun gibi şeyler. Çok iyi değil.

Tavsiye Bunu yapmak için: Htmlentities ($ _POST ['giriş'], KBB _QUOTES, 'UTF-8') echo;

Kullanım htmlspecialchars'ın - Htmlentities ve tüm bu parametreler için gerek yok.

Sen gibi bir şey kullanarak kendinize birkaç basılmasını kaydedebilirsiniz:

function h($s) { echo(htmlspecialchars($s)); }
...
<?php h($POST['input']) ?>

Gerçekten bu kadar ekstra güçlük değil.

Körü körüne ön ucunda tüm giriş kaçan bu giriş ile ele programın herhangi bir parçası, bir veritabanında veri saklamak ediyorsanız vb html-kaçan sürümlerini <,>, &, işlemek zorunda olacağı anlamına gelir, o zaman veritabanı html-kaçan veri olurdu. Eğer (bir e-posta gönderme gibi) olmayan bir html bağlamda veri kullanırsanız, insanlar < görürdünüz Bunun yerine

Muhtemelen sadece çıktısı zaman kaçmak istiyorum.

Yukarıdaki kod işe yaramadı, ama bu yapar:

$_POST = clean_input($_POST);
$_GET = clean_input($_GET);
$_COOKIE = clean_input($_COOKIE);
$_SESSION = clean_input($_SESSION);

function clean_input($array){
    if(count($array)){
    	foreach ($array as $key => $value) {
    		$array[$key]=htmlentities($value, ENT_QUOTES, 'UTF-8');
    	}
    }
    return $array;
}

Ben sadece burada yanlış gidebiliriz anlamaya çalışıyorum.

Benim ilk tepkisi öncelikle sunum mantığı vb iş mantığı, ayrı ele emin önermek olacaktır

Sunum mantığı gerçekten ayrı ise, o zaman şu anda ekrana çıktısı nasıl değerlendirmek gerekir. Ekranda her şey çıktı kaçar aynı işlevi çağrı yoluyla her çıkış çalıştırabilir miyim?

Eğer ekrana aslında çıkış gitmek ama şansını olduğu gibi bırakılmış olması gereken bir şey kaçmak olacak çünkü ben veritabanı manipülasyonlar veya veriler üzerinde iş mantığı manipülasyonlara önce bunu yapmazdı zaman örnek çağrı clean_output için.