Bir PHP sitede XSS saldırıları önlemek için en iyi yöntemler nelerdir

18 Cevap php

Sihirli tırnak üzerinde ve globallerinin kapalı kayıt böylece ben yapılandırılmış PHP var.

Ben her zaman o kullanıcı girişi türetilmiştir çıktılamak am şey için htmlentitiesi () aramak için elimden geleni yapacağım.

Ben de zaman zaman gibi ekli xss kullanılan ortak şeyler benim veritabanı seach ...

<script

Başka ne yapıyorum gerektiği ve nasıl ben yapmaya çalışıyorum şeyler always yapmış olduğundan emin olabilirsiniz.

18 Cevap

Girişi kaçan başarılı XSS ​​önlenmesi için yapabileceğiniz en iyi değil. Ayrıca çıkış öncelenmesi gerekir. Eğer Smarty şablon motoru kullanırsanız, (ben yukarıda ad olan kendi |e değiştirici kullanmak) HTML öğeleri tüm duyarlı karakterleri dönüştürmek için |escape:'htmlall' değiştirici kullanabilirsiniz.

Giriş / çıkış güvenlik Benim yaklaşımdır:

  • mağaza kullanıcı girişi değiştirilmez (HTML girişine kaçan, sadece DB-farkında PDO yapılan öncelenimin tablolarını)
  • Kullanmak ne çıktı biçimi bağlı olarak, çıktıda kaçış (ör: HTML ve JSON farklı kaçan kurallar gerekir)

Ben bir tek çıkışında, giriş sırasında hiçbir şey kaçmıyor gerektiği görüşünde değilim. (Çoğu zaman) bu yana bu veri nereye gidiyor biliyor ki kabul edemeyiz. Daha sonra dışarı gönderdiğimiz bir e-görünür verileri alır formu varsa, Örnek, farklı kaçışa (aksi takdirde kötü niyetli bir kullanıcının e-posta başlıklarını yazabilirsiniz) gerekir.

Diğer bir deyişle, yalnızca veri uygulama "terk" olan son anda kaçabilir:

  • Liste öğesi
  • XML için kaçış, XML dosyasına yazın
  • Kaçmak, DB yazın (yani belirli bir veritabanı yönetim için)
  • E-posta yazmak, e-postalar için kaçış
  • vb

Kısa gitmek için:

  1. Size veri nereye gittiğini bilmiyorum
  2. Veri aslında farklı öncelemeli Mekanizma ANCAK İKİ gerek, birden fazla yerde sona olabilir
  3. Veri yanlış hedef için kaçtı gerçekten hoş değil. (Örneğin konu "Tommy \ 's bar git" e-posta ile almak.)

Eğer giriş katmanında veri kaçış eğer Esp 3. ortaya çıkar (ya da vb, yine de-kaçmak gerekir).

PS: Ben ikinci, o saf kötülük magic_quotes kullanmayan için tavsiye edilir olacak!

Orada XSS yapmak için pek çok (http://ha.ckers.org/xss.html bak) vardır ve yakalamak çok zor.

Ben şahsen (örneğin Kod Ateşleyici) istimal geçerli çerçeveye bu devredebilir. Mükemmel değil iken, yapılan rutin hiç yapmak elimde daha fazla yakalayabilirsiniz.

Bu büyük bir soru.

Birincisi, (böyle bir veritabanına konduğunu gibi) depolama için güvenli yapmak dışında giriş metni kaçış yok. Bunun nedeni, size içeriği farklı şekillerde ve yerlerde sunmak böylece girdi ne tutmak istiyorum. Burada değişiklik yapma, daha sonra sunum bozabilir.

Size sunmak için gittiğinizde veri olmamalıdır ne filtre. Örneğin, bunun için aramak ve çıkarmak orada olmak javascript için bir neden yoksa. Bunu yapmak için kolay bir yolu strip_tags işlevini kullanmak ve sadece izin vardır html etiketleri sunmaktır.

Sonra, ne var almak ve htmlentities veya htmlspecialchars'ın ascii karakter var ne değiştirmek için düşünce geçmektedir. Bu bağlamda ve ne çıkmak istiyorum dayalı etmeyin.

Ben, ayrıca, Sihirli Tırnaklar kapatarak öneririz istiyorum. PHP 6 kaldırıldı ve kullanmak için kötü bir uygulama olarak kabul edilir. http://us3.php.net/magic_quotes at Detayları

Daha fazla bilgi kontrol için http://ha.ckers.org/xss.html

Bu başlamanıza yardımcı olmak için umarım yeterince tam bir cevap ama, değil.

rikh yazar:

Ben her zaman o kullanıcı girişi türetilmiştir çıktılamak am şey için htmlentitiesi () aramak için elimden geleni yapacağım.

Making Code Look Wrong Bu yardım için üzerinde Joel'ın kompozisyon görün

Bunun için PHPTAL güveniyor.

Smarty ve düz PHP aksine, varsayılan olarak tüm çıkış kaçar. Eğer htmlspecialchars() veya |escape yerde unutursanız siteniz vurnelable girmeyeceğim çünkü bu, güvenlik için büyük bir kazançtır.

HTML çıktı bunu önlemek için doğru yerdir yani XSS, HTML özgü saldırıdır. Eğer HTML kabul etmez bir ortamdan başka çıkış verilerine gerekiyor çünkü, veritabanı ön filtreleme veri çalışın, ama kendi riskleri vardır olmamalıdır.

Template library. Or at least, that is what template libraries should do. To prevent XSS all output should be encoded. This is not the task of the main application / control logic, it should solely be handled by the output methods.

If you sprinkle htmlentities() thorughout your code, the overall design is wrong. And as you suggest, you might miss one or two spots. That's why the only solution is rigorous html encoding -> when output vars get written into a html/xml stream.

Ne yazık ki, çoğu php şablon kütüphaneleri sadece kendi sözdizimi şablonu eklemek, ancak çıkış kodlama veya lokalizasyonu, veya html doğrulama, ya da önemli bir şey ile kendilerini endişe etmeyin. Belki başkası php için uygun bir şablon kütüphanesi bilir?

Tüm kullanıcı girişi kaçan çoğu site için yeterlidir. Ayrıca onlar başka bir siteye Referer linkinden çalıntı olamaz böylece oturum kimlikleri URL sonunda yok emin olun. Eğer kullanıcılar bağlantıları göndermek için izin verirseniz Ayrıca, hiçbir javascript: protokol bağlantılar izin emin olun; Bu kısa sürede kullanıcı linke tıkladığında gibi bir komut dosyası çalıştırmak istiyorum.

Eğer HTML çıkış dizeleri kodlayan XSS saldırıları, endişe varsa çözümdür. HTML formatında her çıkış karakteri kodlamak için Hatırlarsanız, başarılı bir XSS saldırısını yürütmek için hiçbir yolu yoktur.

Read more: Sanitizing user data: How and where to do it

Şahsen, ben magic_quotes devre dışı olacaktır. PHP5 + In varsayılan olarak devre dışıdır ve o her şeyi kaçış yok ve PHP6 silinecektir gibi hiç olmadığı gibi kod daha iyi olur.

Sonra, filtreliyor kullanıcı veri türüne bağlı olarak bir sonraki örneğin ne dikte edecek Sadece örneğin metin ise bir isim, daha sonra strip_tags(trim(stripslashes())); o ya da aralıkları kontrol etmek için düzenli ifadeleri kullanabilirsiniz.

Eğer değerler belirli bir aralık düşünüyorsanız, geçerli değerler bir dizi oluşturmak ve yalnızca yoluyla bu değerlere izin (in_array($userData, array(...))).

Eğer sayılar tam sayılar zorlamak için is_numeric veya belirli bir tür atama kullanmak kontrol ediyorsanız, o insanların yerine dizeleri göndermek için çalışıyor önlemek gerekir.

Eğer PHP5.2 + varsa filter() bakıyor ve e-posta adresleri de dahil olmak üzere çeşitli veri türlerini filtre ki uzantısı yararlanarak düşünün. Belgeler özellikle iyi değil, ama geliştirmektedir.

HTML ele varsa, o zaman PHP Input Filter veya HTML Purifier gibi bir şey düşünmelisiniz. HTML Arıtma de uygunluk için HTML doğrulamak olacaktır. Ben Giriş Filtre hala geliştirilmektedir emin değilim. Her ikisi de kullanılabilir ve hangi nitelikleri izin etiketleri bir dizi tanımlamak için izin verir.

Eğer üzerine karar ne olursa olsun, her zaman hiç (kendiniz dahil!) Bir kullanıcıdan gelen PHP komut dosyası haline gelen şey güven asla unutmayın.

Bu yanıtların hepsi harika, ama temelde, XSS çözüm dize manipülasyonla HTML belgeleri üreten durdurmak olacaktır.

Giriş süzme her zaman herhangi bir uygulama için iyi bir fikirdir.

Htmlentitiesi () ve arkadaşları kullanarak çıktı kaçan sürece düzgün kullanılan olarak çalışmak, ancak bu mysql_real_escape_string ($ var) ile dizeleri birleştirerek bir SQL sorgusu oluşturma HTML eşdeğer olmalıdır - bu çalışması gerekir, ama daha az şeyler işinizi doğrulamak , bu yüzden parametreli sorgular kullanarak gibi bir yaklaşıma göre, konuşmak için.

Uygulamalar belki DOM gibi standart bir arayüz kullanarak, dahili sayfası oluşturmak için, ve sonra XHTML / HTML / etc serileştirme işlemek için (libxml gibi) bir kütüphane kullanımı için uzun vadeli bir çözüm olmalıdır. Tabii ki, biz uzakta bu popüler ve yeterince hızlı olmaktan uzun bir yol, ama bu arada biz string işlemleri üzerinden bizim HTML belgeleri oluşturmak için var ve bu doğal olarak daha riskli.

"Sihirli tırnak" girişi her şeyi, tasarım yanlış bir şey kaçan çalışır kötü XSS kusurları bazı palyatif bir çözümdür. Kesinlikle XSS ile ilgili dikkatsizce yazıldığı bilinen bir PHP uygulamasını kullanmanız gerekir zaman kimse onu kullanmak isteyeyim tek durumdur. (Bu durumda bile "sihirli tırnak" ile ciddi bir belada.) Kendi uygulama geliştirirken, "sihirli tırnak" devre dışı bırakın ve bunun yerine XSS-güvenli uygulamalarını takip etmelidir.

Bir uygulama dış kaynaklardan dizeleri (diğer web sitelerine getirilen kullanıcı girişi, vb) içerir zaman XSS, bir cross-site scripting açığı oluşur, onun [X] HTML, CSS, ECMAscript veya doğru kaçan olmadan diğer tarayıcı-çözümlü çıktı, umut Küçüktür (in [X] HTML), tek veya çift tırnak (ECMAscript) gibi özel karakterler hiç görünmüyor. Buna uygun çözüm her zaman çıkış dilin kurallarına göre dizeleri kaçmak için: ECMAScript'te vb [X] HTML, ters eğik olarak varlıkları kullanarak

Güvenilmeyen ne olduğunu takip etmek zor olabilir ve kaçtı zorundadır Çünkü, her zaman HTML gibi bir dil için "biçimlendirme ile metin" yerine bir "metin dizesi" her şeyi kaçmak için iyi bir fikirdir. Böylece "string" (normal metin), "HTML dizesi" (HTML biçimlendirme) ve: Bazı programlama ortamları, çeşitli uyumsuz dize türleri getirerek kolaylaştırır. Bu şekilde, "HTML dizesi" için "string" doğrudan bir örtük dönüştürme imkansız olurdu ve bir dize HTML işaretleme haline gelebilir tek yolu kaçan bir fonksiyonu geçirilerek olduğunu.

Onu devre dışı bırakmayı kesinlikle iyi bir fikir olsa da, "küresellerle Kayıt Ol", XSS tamamen farklı bir sorun ile ilgilenir.

Size HttpOnly kullandığınız herhangi bir oturum çerezleri (veya tüm çerezleri) olun. Tarayıcıların çoğu bu durumda JavaScript gelen çerez değerini gizlemek olacaktır. Kullanıcı hala elle çerezleri kopya olabilir, ama bu doğrudan komut erişimi engellemeye yardımcı olur. StackOverflow bu sorun Durning beta vardı.

Bu, sadece duvardaki bir başka tuğla bir çözüm değildir

En azından veritabanına girmeden tüm verileri doğrulamak gerekir. Ve çok veritabanı bırakarak tüm verileri doğrulamak için deneyin.

mysql_real_escape_string is good to prevent SQL injection, but XSS is trickier. You should preg_match, stip_tags, or htmlentities where possible!

all kullanıcı girişi temizlemek için varolan kullanıcı girdi temizleme kitaplığı kullanın. Eğer uygulama, içine bir lot çaba koymak sürece kendinizi de hiç çalışmaz.

Ben size verilerinizi kaçan hakkında elle endişelenmenize gerek asla öyle iyi yolu kodunuzu bağlamak için izin veren bir sınıfını kullanarak bulmak.

PHP uygulamasında XSS önlemek için mevcut en iyi yöntem HTML Arıtma (http://htmlpurifier.org/) 'dir. Buna bir küçük dezavantajı oldukça büyük kütüphanesi ve iyi APC gibi bir op kod önbellek ile kullanılır olmasıdır. Sen güvenilmeyen bir içerik ekrana outputted edildiği her yerde bu kullanmak istiyorsunuz. Bu çok daha kapsamlı olduğunu htmlentities, htmlspecialchars'ın, filter_input, filter_var, strip_tags, vb bu

Bu yanlış alarmları neden olmaz bir sitede ayrıntılı bir sql enjeksiyon / xss enjeksiyon uygulamak zordur. Bir CMS son kullanıcı kullanmak isteyebilirsiniz ya da başka bir siteden öğeleri bağlar.

Ben tüm kullanıcılar NoScript ile Firefox yüklemek zorunda tavsiye ;-)