Dize komut dosyası etiketleri içeriyorsa bulmak için preg_match kullanın

3 Cevap php

Nasıl komut dosyası etiketleri içeren bir dize olmadığını kontrol etmek için PHP'nin preg_match fonksiyonu ile kullanmak için bir model yazabilirim?

3 Cevap

Onları kaçmaya çalışıyorsunuz? bu yüzden aşağıdakileri deneyin if (test değil)

$string=str_replace(array("&", "<", ">"), array("&amp;", "&lt;", "&gt;"), $string);

Bu yolla bir sürpriz saldırganların bekliyor olacak.

Güvenlik nedenleriyle? Temelde, yapamazsın. İşte ben geçmişte bu yaptığını öğrendiğim bazı şeyler şunlardır:

  • <a href="javascript:something">...</a>
  • <p onmouseover="something">
  • jscript:, mocha: gibi, farklı tarayıcılarda javascript: eşdeğer, ve livescript: olan URL şemaları vardır. Çoğu belgesiz.
  • Netscape eski sürümleri <> eşdeğer olarak (0x94 ve 0x95, sanırım?) Belli bayt tedavi. Umarım böyle bir şey, modern tarayıcılarda var.
  • VBScript.

MySpace bu yapmaya çalıştım ve sonuç onların tarafında çok sayıda diğer güvenlik afetler arasında, bir gün ya da öylesine için aşağı hizmet aldı "Samy benim kahramanım" solucan oldu.

Yalnızca metin ve biçimlendirme içeren HTML sınırlı bir alt kümesi kabul etmek istiyorsanız Yani, whitelist, değil blacklist var. Etiket beyaz listeye zorunda nitelikleri ve bağlantıları, URL şemaları izin vermek istiyorsanız. Orada bir kaç mevcut kütüphaneler bu iş için orada, ama ben olanları PHP tavsiye bilmiyorum.

Don't use regular expressions for processing xml/html. Sen değil DOM classes of PHP kullanmak gerekir, çok daha güvenilir bulacaksınız herhangi bir regex daha olmalıdır:

$document = new DOMDocument();
$document->loadHtml($html);
$xpath = new DOMXPath($document);
if ($xpath->query('//script')->length > 0) {
    // document contains script tags
}