2017-10-01 99 views
-1

本主題不讓我要求它是身體的解決方案,以及或頭部, 內嵌,通過指數等PHP刪除腳本標籤通過指數等

remove script tag from HTML content

我想對其中又有多少劇本我刪除控制。

我希望我沒有這些論據去了解各地再次使用正則表達式比其他某些 事情。我喜歡最有關這個主題的答案是從平的正是如此:

$html = preg_replace("/<script.*?\/script>/s", "", $html) ? : $html; 

我想盡可能多的粒度控制儘可能這種做法然而,這從整個$content刪除腳本。我想看到這只是從身體刪除腳本,(或從身體到下面)。

而且也只是從頭部(或身體上多達遠頂部)去除腳本。還通過索引。如身體第一,頭部第四等。

最後,我想看到內聯元素js東西刪除,儘可能多的控制 儘可能。

感謝

+0

「答案我喜歡關於這一主題的最多的是從平」 - 殤它不起作用。 https://pastebin.com/t28dn6Zt – Quentin

回答

0

我最終會回答你的問題,讓我得到你即將當你還沒有說做主持,雖然

這樣的解釋,我不明白爲什麼你會想要做到這一點。從用戶收集原始html並在其他地方顯示它被認爲是一個巨大的安全漏洞。使用純粹的正則表達式來擺脫所有的javascript將會很困難。清除腳本標記很容易,但刪除內聯JavaScript將是困難的部分。雖然有可能,我會建議尋找另一種方式來進行比給用戶的網頁的JavaScript的剝離版本之外的其他任務。你可以做到這一點

一種方式是通過iframe。使用

<iframe src="html_you_want_to_strip" sandbox=""></iframe> 

將禁用在iframe中運行的所有javascript。請記住,還有其他方式可以在不使用JavaScript的情況下將惡意項目加載到您的網站中。

現在,我已經解釋了,當談到剝JavaScript,以便回答你的問題,你應該做的,

A.刪除只從身體腳本標記,只是頭:

最好刪除javascript時獲得粒度的方法是使用PHP的DOMDocument類。基本上,你會了將文檔裝入此DOMDocument類剝奪你想要的任何腳本標記它。例如,如果你只是想擺脫在體內的腳本標籤,你可以寫這樣的事情:

<?php 
$html = "the HTML you want filtered"; 
$DOM = new DOMDocument('1.0','utf-8'); 
$DOM->loadHTML($html); 
$bodyTags = $DOM->getElementsByTagName('body'); 
/* 
We will run under the assumption that the user has the ability to add two 
body tags and hide information in the second one, that is why we don't 
just use $DOM->getElementsByTagName('body')[0] 
*/ 
foreach($bodyTags as $body){ 
    foreach($body->getElementsByTagName('script') as $script){ 
     $script->parentNode->removeChild($script); 
     /* 
     The reason we have to this is because you cant just do 
     $script->remove(), that would be too easy :) 
     */ 
    } 
} 

相同的代碼上面可以用來剝去頭標記的腳本。如果您想刪除具有特定索引的項目,則可以使用您的foreach執行以下操作:

$i=0; 
foreach($body->getElementsByTagName('script') as $script){ 
    if($i!==(INDEX_TO_KEEP)){ 
     $script->parentNode->removeChild($script); 
    } 
} 

B.刪除內聯javascript

我們可以使用相同的DOMDocument解析器,除了解析所有元素,這次查找所有JavaScript事件(謝天謝地所有的開始)。代碼如下所示。

<?php 
//starting where the last code leaves off 
foreach($DOM->getElementsByTagName('*') as $element){ 
    //This selects all elements 
    foreach($element->attributes as $attribute){ 
     if(preg_match('/on.*/',$attribute)==1){ 
      /* 
      "on" looks for on and ".*" states that there 
      can be anything after the on (onmousemove,onload,etc.) 
      */ 
      $element->removeAttribute($attribute) 
     } 
    } 
} 

在你的代碼的最後,您將要保存的剝離HTML,然後返回給用戶

$parsedHTML = $DOM->saveHTML() 
+0

謝謝丹尼爾。這將花費我幾天的時間來吸收和測試你的精彩課程。你非常開明。我希望我可以PM你。我正在開始爲此「爆炸」工作。最後的帖子(鏈接)似乎不是100%的專業內置DomDocument的東西。我看到其他內置插件短了。感謝你,我將不得不重新考慮許多事情。那麼你是說所有的Ajax,Proxy,CORS等用戶提供URL的地方都沒有希望安全嗎?白名單? I幀?謝謝 – user4245782

+0

只要您允許用戶在您的網頁上運行Javascript,就會產生巨大的安全風險。 Iframe能夠將用戶代碼與總體網站分離,但它們並不完美。例如,由於用戶創建了html,它必須託管在您的網站上。這意味着由用戶創建的Javascript函數可以訪問所有身份驗證Cookie,這是您永遠不希望發生的事情。如果您可以詳細說明您的整體項目是什麼,那麼我可能會幫助您找到不需要用戶創建自己的Javascript的解決方案。 –

+0

我相信你可以。我可能會被解僱。沒有PM可能? – user4245782