簡體   English   中英

最佳實踐:合法的跨站點腳本

[英]Best Practice: Legitimate Cross-Site Scripting

雖然跨站點腳本通常被認為是負面的,但我遇到了一些必要的情況。

我最近在一個非常有限的內容管理系統的范圍內工作。 我需要在頁面中包含數據庫代碼,但托管服務器沒有任何可用的可用內容。 我在自己的服務器上設置了幾個簡單的腳本,最初認為我可以使用AJAX將腳本的內容直接導入到CMS的模板中(從而保留動態圖像,菜單項,CSS等)。 我錯了。

由於XMLHttpRequest對象的限制,無法從其他域獲取內容。 所以我認為iFrame - 即使我不是框架的粉絲,我認為我可以創建一個與內容的寬度和高度相匹配的框架,這樣它就會顯得原生。 再次,我被跨站腳本“保護”阻止了。 雖然我確實可以將遠程文件加載到iFrame中 ,但我無法在主機頁面或加載頁面內部執行JavaScript來修改其大小。

在這種特殊情況下,我無法將子域指向我的服務器。 我也無法在CMS服務器上創建可以從我的服務器代理內容的腳本,所以我最后的想法是使用遠程JavaScript。

遠程JavaScript工作。 當用戶禁用JavaScript時,它會中斷,這是一個缺點; 但它的確有效。 我使用遠程JavaScript時遇到的“問題”是我必須使用JS函數document.write()來輸出任何內容。 任何不是JS的輸出都會導致腳本錯誤。 除了對每一行使用document.write() ,還必須確保內容被轉義 - 否則最終會出現更多腳本錯誤。

我的解決方案如下:

我的腳本收到一個GET參數(“頁面”),然后查找文件( {$page}.php ),並將內容讀入變量。 但是,我必須使用笨拙的緩沖技術才能實際執行包含的腳本(用於數據庫交互等),然后刪除所有換行符( \\n )的最終內容,然后轉義所有必需的字符。 最終結果是我的原始腳本(輸出JavaScript)訪問我服務器上看似“標准”的腳本,並將其標准輸出轉換為JavaScript以便在CMS模板中顯示。

雖然這個解決方案有效,但似乎可能有更好的方法來完成同樣的事情。 使跨站點腳本工作專門用於包含來自完全不同的域的內容的最佳方法是什么?

你有三個選擇:

  1. 創建服務器端代理腳本
  2. 創建遠程腳本以讀取遠程動態HTML。 使用像jQuery這樣的庫來簡化這個過程。 您可以使用load函數在需要的地方注入HTML。 編輯我最初的意思是#2使用JSONP ,它要求服務器端腳本識別“callback =?” PARAM。

  3. 使用客戶端Flash代理並在服務器的Web根目錄上設置crossdomain.xml文件。

就個人而言,我會調用服務器上的其他域並獲取並解析數據,以便在您的頁面中使用。 這樣就可以避免任何問題,並且您可以獲得服務器端語言/平台的強大功能來獲取和解析數據。

不確定這是否適用於您的特定場景......即使您的詳細描述也很難知道......

您可以嘗試使用easyXDM ,通過包含非常少的代碼,您可以在不同域的文檔之間傳遞數據或方法調用。

iframe遠程內容可以通過本地javascript訪問。

遠程服務器只需設置頁面的document.domain

例如:

站點A包含一個iframe,其中src='Site B/home.php'

home.php看起來像這樣:

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

我之前遇到過YDN服務器端代理腳本 它表示它是與雅虎的搜索API一起使用的。

如果您只是修改Yahoo API代碼,它是否適用於任何域? 或者您是否需要將其替換為您希望它使用的域?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM