Eğer insanlar RAW embed kodları yayınlamak için izin ne zaman XSS kendinizi korumak için nasıl?

4 Cevap php

Tumblr ve diğer web blogging insanlar youtube videoları ve tüm video ağların gömülmüş kodlarını göndermek için izin verir.

ama nasıl sadece flash nesnesi kodu filtre ve diğer herhangi bir html veya komut dosyalarını kaldırmak? ve hatta bu geçerli bir video kodu değil size Informes otomatik bir kodu var.

Bu REGEX ifadeler kullanılarak yapılır? Ve bunu yapmak için bir PHP sınıfı var mı?

Teşekkürler

4 Cevap

Genel olarak konuşursak, using regex is not a good way to deal with HTML: standartlarda izin verilen pek çok çeşitleri vardır ... Ve tarayıcılar bile geçerli olmadığını kabul HTML: HTML düzenli ifadeler için yeterince düzenli değil!


In PHP, as your question is tagged as php, a great solution that exists to filter user input is the HTMLPurifier tool.

Ilginç şeyler bir çift vardır:

  • Belirttiğiniz verir which specific tags are allowed
  • Her etiket için tanımlayabilirsiniz which specific attributes are allowed

Temel olarak, fikir sadece yerine siyah-list (which will never be quite complete) kullanarak kötü şeyler kaldırmak için çalışmakla, (white-list) belirtmek ne tutmaktır.


And if you only specify a list of tags and attributes that can do no harm, only those will be kept -- and the risks of injections are lowered a lot.


Quoting HTMLPurifier's home page :

HTML Purifier is a standards-compliant HTML filter library written in PHP.
HTML Purifier will not only remove all malicious code (better known as XSS) with a thoroughly audited, secure yet permissive whitelist, it will also make sure your documents are standards compliant, something only achievable with a comprehensive knowledge of W3C's specifications.

Evet, başka büyük bir şey olduğunu the code you get as output is valid.



Tabii ki, bu sadece HTML giriş arındırmak / / filtresini temizlemek için izin verir; Eğer kullanıcı tarafından kullanılan URL hem de olduğunu doğrulamak için izin vermez:

  • Doğru; Gerçek bir içeriğe yani puan
  • Web sitesi tarafından tanımlandığı gibi "Tamam"; yani örneğin herhangi bir çıplaklık, ...


About the second point, there's not much one can do about it : the best solution will be to either :

  • Online koymak konum önce bir moderatör kabul ettiniz / içeriğini reddetmek
  • Bayrak web sitesinin kullanıcıların uygunsuz olarak bazı içerik bir yol verin, böylece bir moderatör eylemleri sürüyor.

Temelde, video içeriğini kendisi kontrol etmek, fazla seçenek yok ama bir insan "ok" veya "not ok" demek var.


About the first point, though, there's hope : some services that host content have APIs that you might want / be able to use.

Örneğin, Youtube bir API sağlar - Developer's Guide: PHP bkz.

Senin durumunda, Retrieving a specific video entry bölümü umut verici görünüyor: Bu gibi görünen bir URL'ye HTTP isteği göndermek eğer:

http://gdata.youtube.com/feeds/api/videos/videoID

(Replacing "videoID" by the ID of the video, of course)

Video geçerli olup olmadığını, bazı ATOM yayınını alırsınız; ve "Geçersiz kimliği" eğer o değil

Bu içeriği en azından bazı URL doğrulamak yardımcı olabilir - Eğer kullanıcılar gibi her olası içerik barındırma hizmeti için bazı özel kod geliştirmek gerekecek olsa bile ...


Now, to extract the identifier of the video from your HTML string... If you're thinking about using regex, you are wrong ;-)

Bir HTML dize verilerinin bir kısmını elde etmek için en iyi çözüm genellikle için:

Ve DOM kullanarak da standart bir API kullanarak HTML belgeyi değiştirmek için izin verecek - yardımcı olabilir, bir sonraki video için bazı mesajı, ya da buna benzer başka bir şey eklemek istediğiniz durumda.

Ben için çalışmak şirket için bunun için bir algoritma hayata geçirdik. Gayet güzel çalışıyor. ANCAK, bunu uygulamak için oldukça karmaşık oldu.

Ben kesinlikle bu sizin için kolay bir şekilde çalıştığını görmek için HTMLPurifier kontrol. Bunu ben yaptım gibi eski okul-yol yapmakta ısrar ederse, bu temel adım:

1. First of ==> get friendly with stripos()

2. You have to make an recursive function to identify the start and stop tags for the widget, that includes all combinations of <embed></embed> or <embed/> (selfclosing) or <object></object> ... or <object><params>...<embed/></object>

3. After this, you have to parse out all attributes and params.

4. Now, all <object> tags should have <param> tags as child elements. You have to parse all of these to get all the data you need for finally generating a new embed or object tag. Escpecially the params and attributes that holds with, height, data source are important.

5. Now, you don't know if the attributes are enclosed by single or double-quotes, so your code has to be lenient in this way. Also, you dont know if the code is valid or well formed. So, It should be able to handle nested embed/object tags, embed tags that are not enclosed correctly etc etc... As it is user generatede content, you can't really know and trust the input. You will see that there are lots of combinations.

6. If you manage to parse the embeded element with all its attributes (or object element and its child params), the whitelisting of domains is easy...

Benim kod oldukça büyük kod yaklaşık 800 satır, olmak kadar sona erdi ve My alghorithm zamanda sık sık kesilmiş ve içerdiği tüm SEO metin kaldırıldı vb doğru durak ve bitiş etiketlerini bulmakta, özyinelemeli yöntemleri ile doluydu geri Widget tutan site bağlantıları gibi, embed kodunu yapıştırın.

Onun iyi excercise, ama sen ... bu yolda yürümeye başlamak etmeyin nerede ise.

Öneri: yapılmış hazır, açık kaynak kodlu bir şeyler bulmaya çalışın!

Bu güvenli olmayacak. Tarayıcılar html dağınık olsa bile insanların sayfalarının içeriğini görüntülemek yardımcı olan komik küçük işlevleri vardır. Yoluyla bir şey almak için sonsuz fırsatlar vardır :)

here buzdağının ucu görmek için kontrol edin

Ne yapmak gerekiyor genişlik ve yükseklik için sadece bir bağlantı ve aditional girişler için tek bir girişi kullanmak ve bu filtre olduğunu. SONRA nesne Kendinizi etiketlemek oluşturmak.

Bu might güvenli.

Bir white list approach is the (only) way to go, güvenlik açıklarına karşı sitenizin "güvenli" hale arıyorsanız. Ben güvenle tüm kullanıcı tarafından oluşturulan içerik kaçan tavsiye ederim, ve beyaz liste sadece güvenli ve sitenizde çalıştığını biliyorum biçimlendirme. Bu demektir sadece etiketleri, ama aynı zamanda flaş gömmeler.

Eğer herhangi bir youtube gömülü izin vermek istiyorsanız Örneğin, ürettiği embed kodunu arar bir doğrulama RegEx yazmak. Herhangi başkalarına kabul (veya basitçe kaçan biçimlendirme olarak görüntülemek) reddediyorum. Bu test edilebilir. Bütün bu ayrıştırma saçmalıkları unutun.

Ayrıca vimeo video eklemek istiyorsanız, o sağladıkları embed kodunu bakmak ve de kabul ediyorum.

Öf? Ben bu bir ağrı gibi görünüyor biliyorum, ama gerçekte genel moda çeşit "kötü" içerik tespit etmeye çalışır bazı algoritması daha yazmak çok daha kolay.

Algoritma çalışma basit sürümünü aldıktan sonra, geri gitmek ve güzel yapabilir. Siz "geçici" beyaz liste geçmek ve çıkış kaçan rutin onaylı Regexes eklemek için bir yönetici süreç yok vs URL'ler, komut içeren içeriği kabul edemedi. Bu şekilde meşru kullanıcılar soğuk dışarı sol değil, ancak bu tür saldırılara karşı öz kadar açmayın.