İyi Uygulama: Meşru Cross-Site Scripting

5 Cevap php

Cross-site scripting genellikle negatif olarak kabul edilir iken, ben gerekli çeşitli durumların içine çalıştırmak.

Geçenlerde bir çok sınırlayıcı bir içerik yönetim sistemi sınırları içinde çalışıyordu. Ben sayfa içinde veritabanı kod eklemek için gerekli, ancak sunucu barındırma mevcut kullanılabilir bir şey yoktu. Ben aslında ben (böylece vb dinamik görüntüler, menü öğeleri, CSS, istinat) doğrudan CMS şablon içine benim komut içeriğini almak için AJAX kullanabilirsiniz düşünerek, kendi sunucusunda bir çift barebones komut dosyalarını kurmak. Yanılmışım.

Nedeniyle XMLHttpRequest nesneleri sınırlamaları, farklı bir etki alanından içerik kapmak mümkün değildir. Ben de "iFrame" düşündüm - Ben kare bir hayranı değilim rağmen, ben yerli görünür böylece ben, içeriğin genişliğini ve yüksekliğini uyumlu bir çerçeve oluşturmak düşündüm. Yine, cross-site scripting tarafından engellendi "korumaları." Ben gerçekten iFrame uzak bir dosyayı yüklemek olsa da, ben konak sayfa üzerinde veya yüklenen sayfa içinde boyutunu değiştirmek için JavaScript çalıştırılamadı.

Bu özel senaryoda, ben benim sunucu için bir alt işaret etmek mümkün değildi. I also couldn't create a script on the CMS server that could proxy content from my server, so my last thought was to use a remote JavaScript.

Uzak bir JavaScript çalışır. Kullanıcı bir dezavantajı olan, JavaScript devre dışı olduğunda kırılır; ama çalışıyor. Ben uzak bir JavaScript kullanarak yiyordum "sorun" Ben JS fonksiyonu document.write () çıkış için herhangi bir içerik kullanmak vardı. JS olmayan herhangi bir çıkış komut dosyası hataları neden olur. Her satır için document.write () kullanmanın yanı sıra, aynı zamanda içeriğin kaçtı sağlamak için var - yoksa daha fazla komut dosyası hataları ile sonuna kadar.

Aşağıdaki gibi benim çözüm oldu:

Benim komut dosyası, bir GET parametresi ("sayfa") alınan ve daha sonra dosyası ({$ sayfa}. Php) için baktım ve bir değişken içeriğini okuyun. Ancak, aslında her satır sonu karakterleri nihai içeriğini gerekli tüm karakterleri kaçan izledi ("\ n") şerit sonra (veritabanı etkileşimi gibi şeyler için) dahil komut dosyalarını çalıştırmak için garip tamponlama tekniklerini kullanmak zorunda kaldı. Sonuçta (JavaScript çıktılar) benim özgün senaryo benim sunucuda görünüşte "standart" komut erişir ve CMS şablon içinde görüntülemek için JavaScript standart çıktı dönüştürür olduğunu.

Bu çözüm çalışır iken aynı şeyi gerçekleştirmek için daha iyi bir yolu olabilir gibi görünüyor. Özellikle tamamen farklı bir etki alanından içerik dahil olmak amacıyla cross-site scripting iş yapmak için en iyi yolu nedir?

5 Cevap

Üç seçenek var:

  1. Bir server side proxy script oluşturun.
  2. Uzak dinamik HTML okumak için uzak bir komut dosyası oluşturun. Bu kolaylaştırmak için jQuery gibi bir kitaplığı kullanın. Gereken yerde HTML enjekte etmek load function kullanabilirsiniz. EDIT tanımak için sunucu tarafı komut dosyası gerektirir nedir örnek # 2 JSONP kullanan oldu ben aslında demek, "geri arama =?" param.

  3. Sunucunuzun web kökünde bir client side Flash proxy ve kurulum crossdomain.xml dosyasını kullanın.

Şahsen, ben bu diğer etki on the server aramak ve almak ve sayfanızda kullanmak için orada verileri ayrıştırma. Bu şekilde herhangi bir sorunları önlemek ve veri alma ve ayrıştırma için bir sunucu tarafı dil / platform gücü olsun.

Değil emin bile ayrıntılı açıklama ile bilmek için belirli bir senaryo ... Sert için çalışmak istiyorsunuz eğer ...

Çok az kod ekleyerek, easyXDM deneyebilirsiniz, veri geçirebiliriz veya yöntem farklı etki belgeler arasında çağırır.

Ben önce o YDN server side proxy script geldim. Bu Yahoo'nun arama API'leri ile çalışmak için inşa söylüyor.

Sadece dışarı Yahoo API kod Döşeme eğer, herhangi bir etki ile çalışacak mı? Yoksa onunla çalışmak istediğiniz etki ile değiştirmeniz gerekiyor?

iframe uzak içerik yerel javascript ulaşılabilir.

Uzak sunucu sadece document.domain Sayfanın ayarlamak zorunda.

Eg:

Site A src='Site B/home.php' ile bir iframe içeren

home.php bu gibi görünüyor:

[php stuff]...[/php]
[script type='text/javascript']document.domain='Site A'[/script]