2009-08-26 5 views
36

Formlardan genel girişleri filtrelemek için iyi bir işlev bilen var mı? Zend_Filter_input, girdinin içeriği hakkında önceden bilgi gerektiriyor gibi görünüyor ve HTML Purifier gibi bir şey kullanmanın büyük bir performans etkisine sahip olduğundan endişeleniyorum.PHP'de XSS filtreleme işlevi

Ne böyle bir şey: Herhangi bir giriş için http://snipplr.com/view/1848/php--sacar-xss/

çok teşekkür.

+2

HTMLPUrifier bazı kaynakları alabilir, ancak büyük olasılıkla bu kadar çok içerik yayınlanmıyor olabilir? (örneğin danışılana kıyasla); Veriyi DB'ye kaydederken HTMLPurifier çalıştırıyorsanız ve DB'den okurken değil, OK olabilir ... –

cevap

69

Basit bir yol? kullanın: Ayrıca bunun için filter_var() kullanabilirsiniz

$str = strip_tags($input); 

:

$str = filter_var($input, FILTER_SANITIZE_STRING); 

filter_var() avantajı sıyırma veya düşük ve yüksek karakter kodlaması, örneğin, davranışlarını kontrol edebilir olmasıdır. İşte

sanitizing filters listesidir.

+3

teşekkürler - filter_var() hakkında bilmiyor muydu? – codecowboy

+0

Bu en iyi yol mu? maksimum güvenlik için en iyi yol. – andho

+13

Cletus genellikle düz eski 'strip_tags()' kullanarak, üzerinde spot olma eğilimindedir iken büyük bir gözetim ve bir güvenlik endişesi. Daha fazla bilgi için lütfen http://htmlpurifier.org/comparison#striptags –

23

XSS saldırıları için kullanmak koymak yolları hacker bir dizi PHP'nin yerleşik işlevler XSS saldırıları her türlü yanıt vermeyen vardır. Bu nedenle, strip_tags, filter_var, mysql_real_escape_string, htmlentities, htmlspecialchars, vb. Gibi işlevler bizi% 100 korumaz. Daha iyi bir düzeneğe ihtiyacınız var, çözüm şu: Çözümün en iyi ve güvenli yolu HTML Arındırıcı kullanmaktır:

function xss_clean($data) 
{ 
// Fix &entity\n; 
$data = str_replace(array('&','<','>'), array('&','<','>'), $data); 
$data = preg_replace('/(&#*\w+)[\x00-\x20]+;/u', '$1;', $data); 
$data = preg_replace('/(&#x*[0-9A-F]+);*/iu', '$1;', $data); 
$data = html_entity_decode($data, ENT_COMPAT, 'UTF-8'); 

// Remove any attribute starting with "on" or xmlns 
$data = preg_replace('#(<[^>]+?[\x00-\x20"\'])(?:on|xmlns)[^>]*+>#iu', '$1>', $data); 

// Remove javascript: and vbscript: protocols 
$data = preg_replace('#([a-z]*)[\x00-\x20]*=[\x00-\x20]*([`\'"]*)[\x00-\x20]*j[\x00-\x20]*a[\x00-\x20]*v[\x00-\x20]*a[\x00-\x20]*s[\x00-\x20]*c[\x00-\x20]*r[\x00-\x20]*i[\x00-\x20]*p[\x00-\x20]*t[\x00-\x20]*:#iu', '$1=$2nojavascript...', $data); 
$data = preg_replace('#([a-z]*)[\x00-\x20]*=([\'"]*)[\x00-\x20]*v[\x00-\x20]*b[\x00-\x20]*s[\x00-\x20]*c[\x00-\x20]*r[\x00-\x20]*i[\x00-\x20]*p[\x00-\x20]*t[\x00-\x20]*:#iu', '$1=$2novbscript...', $data); 
$data = preg_replace('#([a-z]*)[\x00-\x20]*=([\'"]*)[\x00-\x20]*-moz-binding[\x00-\x20]*:#u', '$1=$2nomozbinding...', $data); 

// Only works in IE: <span style="width: expression(alert('Ping!'));"></span> 
$data = preg_replace('#(<[^>]+?)style[\x00-\x20]*=[\x00-\x20]*[`\'"]*.*?expression[\x00-\x20]*\([^>]*+>#i', '$1>', $data); 
$data = preg_replace('#(<[^>]+?)style[\x00-\x20]*=[\x00-\x20]*[`\'"]*.*?behaviour[\x00-\x20]*\([^>]*+>#i', '$1>', $data); 
$data = preg_replace('#(<[^>]+?)style[\x00-\x20]*=[\x00-\x20]*[`\'"]*.*?s[\x00-\x20]*c[\x00-\x20]*r[\x00-\x20]*i[\x00-\x20]*p[\x00-\x20]*t[\x00-\x20]*:*[^>]*+>#iu', '$1>', $data); 

// Remove namespaced elements (we do not need them) 
$data = preg_replace('#</*\w+:\w[^>]*+>#i', '', $data); 

do 
{ 
    // Remove really unwanted tags 
    $old_data = $data; 
    $data = preg_replace('#</*(?:applet|b(?:ase|gsound|link)|embed|frame(?:set)?|i(?:frame|layer)|l(?:ayer|ink)|meta|object|s(?:cript|tyle)|title|xml)[^>]*+>#i', '', $data); 
} 
while ($old_data !== $data); 

// we are done... 
return $data; 
} 
+3

Hey @Sarfraz sizin göreviniz gerçekten güvenli mi? – Yakup

+0

da * urldecode * ekleyiniz, bu betik çalışmaz, örneğin% 22% 3E% 3Cscript% 3Ealert ('try_xss');% 3C/script% 3E –

+1

Bu kodda bir güncelleme var. Christian Stocker tarafından: http://blog.liip.ch/archive/2008/09/10/missed-case-in-externalinput-php-resulting-in-viable-xss-attacks.html –

7

. Zend Framework ile kullanmayla ilgili bazı ipuçları için bu bağlantıyı takip edin. siteler arası komut dosyası savunmasız (XSS) filtre fonksiyonu için Genel Çözümü olabilir www.mcafeesecure.com göre

HTML Purifier with Zend Framework

+7

Ama dammmmn bu kütüphane şişirilmiş . –

+0

Şişirilmiş olabilir, ancak filtrelemek için nükleer seçeneğe gerçekten ihtiyacınız olduğunda, bu en iyisidir. – LaXDragon

2
function clean($data){ 
    $data = rawurldecode($data); 
    return filter_var($data, FILTER_SANITIZE_SPEC_CHARS); 
} 
+1

çalışmıyor. ama '$ data = filter_var ($ _ GET ['data'], FILTER_SANITIZE_STRING);' çalışır. –

0

:

function xss_cleaner($input_str) { 
    $return_str = str_replace(array('<','>',"'",'"',')','('), array('&lt;','&gt;','&apos;','&#x22;','&#x29;','&#x28;'), $input_str); 
    $return_str = str_ireplace('%3Cscript', '', $return_str); 
    return $return_str; 
} 
+0

Önceden kabul edilen ve yüksek oranda kesilen cevap, temiz ve kısa bir çözüm sağlar. Ruhun bu cevaba ne ekler? [MetaSO sorusunu] kontrol edin (http://meta.stackexchange.com/questions/7656/how-do-i-write-a-good-answer-to-a-question) ve [Jon Skeet: Kodlama Blogu] (http://msmvps.com/blogs/jon_skeet/archive/2009/02/17/answering-technical-questions-helpfully.aspx) nasıl doğru bir cevap verileceği üzerine. – Yaroslav

3

Ben de benzer bir sorun var.

<?php function filterxss($str) { 
//Initialize DOM: 
$dom = new DOMDocument(); 
//Load content and add UTF8 hint: 
$dom->loadHTML('<meta http-equiv="content-type" content="text/html; charset=utf-8">'.$str); 
//Array holds allowed attributes and validation rules: 
$check = array('src'=>'#(http://[^\s]+(?=\.(jpe?g|png|gif)))#i','href'=>'|^http(s)?://[a-z0-9-]+(.[a-z0-9-]+)*(:[0-9]+)?(/.*)?$|i'); 
//Loop all elements: 
foreach($dom->getElementsByTagName('*') as $node){ 
    for($i = $node->attributes->length -1; $i >= 0; $i--){ 
     //Get the attribute: 
     $attribute = $node->attributes->item($i); 
     //Check if attribute is allowed: 
     if(in_array($attribute->name,array_keys($check))) { 
      //Validate by regex:  
      if(!preg_match($check[$attribute->name],$attribute->value)) { 
       //No match? Remove the attribute 
       $node->removeAttributeNode($attribute); 
      } 
     }else{ 
      //Not allowed? Remove the attribute: 
      $node->removeAttributeNode($attribute); 
     } 
    } 
} 
var_dump($dom->saveHTML()); } ?> 

$ onay dizisi tüm evcil özelliklerini ve doğrulama tutan: Ben büyük bir WYSIWYG editörü ile bir profil sayfasına html içeriği doldurmak için kullanıcıların ihtiyacı (! Redactorjs) i gönderilen html temizlemek için aşağıdaki fonksiyon yazdım kurallar. Belki bu sizin için yararlıdır. ipuçları Temiz XSS için

0

kullanarak deneyin açıktır böylece test etmedim ben

xss_clean($data): "><script>alert(String.fromCharCode(74,111,104,116,111,32,82,111,98,98,105,101))</script> 
1

htmlspecialchars() html formları görüntülenir filtreleme kullanıcı girişi için yeterli olduğunu henüz.

-1

Ben Almanca üstten çift noktalı mesajların ile benim sorun için bir çözüm buldum kullanan bir nihai çözüm yoktur.Tamamen mesajları temizliği (öldürme) dan sağlamak için, ben gelen verileri kodlamak:

*$data = utf8_encode($data); 
    ... function ...* 

Ve sonunda ben doğru işaretlerini almak için çıktı deşifre: Artık sonrası filtreden geçmesi

*$data = utf8_decode($data);* 

işlev ve doğru bir sonuç elde edersiniz ...