2011-09-13 55 views
0

我創建一個非常基本的iPhone模擬器,我想要做的只是把它在一個位置,然後我們有,並希望把它放在任何網站,我們只是把它用:http://www.example.com/iphone-test.php?url=http://www.example.com/mobile/PHP安全性 - 獲取變量,URL安全嗎?

有什麼我需要注意的可能是不安全的?沒有涉及數據庫或任何其他內容,但爲了防止有人想搞亂並在URL中放入一些內容,我可以做些什麼來幫助使這個更安全一點?

這裏是我的代碼:

<?php 
    if(isset($_GET['url'])) { 
     $url = $_GET['url']; 
     ?> 

     <!doctype html> 
     <html lang="en"> 
      <head> 
       <meta charset="utf-8"> 
       <title>iPhone Test</title> 
       <style type="text/css"> 
       #iphone { 
        background:url(iPhone.png) no-repeat; 
        width:368px; height:706px; 
        position:relative; 
        overflow:hidden; 
       } 
       #iphone iframe { 
        position:absolute; 
        left:30px; 
        top:143px; 
        border:0;overflow:hidden; 
       } 
       </style> 
      </head> 
      <body> 
       <div id="iphone"> 
       <iframe src="<?=$url;?>" width="307" height="443"><p>Your Browser does not support iFrames.</p></iframe> 
       </div> 
      </body> 
     </html> 
     <?php 
    } 
?> 

編輯:感謝所有的幫助。我做了一些研究和這裏是我到目前爲止有:

<?php 
include_once 'filter.php'; 
$filter = new InputFilter(); 

if(isset($_GET['url'])) { 
if (filter_var($_GET['url'], FILTER_VALIDATE_URL)) { 
    $url = $filter->process($_GET['url']); 
?> 

來源:http://oozman.com/php-tutorials/avoid-cross-site-scripting-attacks-in-php/

類:http://www.phpclasses.org/browse/file/8941.html

你覺得呢?

+0

那麼一開始,確保URL不是以'的JavaScript開始:'...,並且確保你有網址在傳遞到腳本之前,在客戶端對URL進行編碼。 – DaveRandom

+0

不要相信客戶端對數據進行編碼以使服務器可以安全地插入到文檔中。 – Quentin

回答

3

如果任何人都可以訪問此頁面,那麼您就可以打開XSS和Phishing重定向。例如,嘗試將此添加到您的URL參數中:

?url="></iframe><script>alert(123)</script> 

在Firefox 6.02中觸發警報。這意味着任何JS可能被解僱並用於重定向認爲他們正在訪問您的網站的用戶。或者它可以用來竊取未標記爲HTTPOnly的Cookie。

這可以通過對HTML屬性進行編碼來緩解。這裏從OWASP描述:

除字母數字字符以外,所有ASCII值小於256的字符都使用& #xHH;格式(或可用的命名實體)以防止切換出屬性。這條規則如此寬泛的原因是開發人員經常會忽略屬性。正確引用的屬性只能使用相應的引號進行轉義。未加引號的屬性可以分解爲許多字符,包括[空格]%* +, - /; < => ^和|。

參考:現在https://www.owasp.org/index.php/XSS_(Cross_Site_Scripting)_Prevention_Cheat_Sheet#RULE_.232_-_Attribute_Escape_Before_Inserting_Untrusted_Data_into_HTML_Common_Attributes

,您的其他問題,上面會紮成地址。如果您允許輸入只是任意URL,那麼就沒有從做這樣的事情停止某人:

?url=http://myevilsite.com/redirect.php 

而且有頁面重定向用戶:

window.top.location.href = "http://www.site.com"; 

你唯一可以那麼做就是使用可接受的URL的白名單。

+0

非常感謝。剛剛更新了我的答案,那是怎麼回事?它防止你提到的URL參數。 – Drew

+0

它看起來像庫只是一個黑名單過濾器。黑名單很少夠用。幾乎不可能過濾出可能導致麻煩的所有事情。你最好做適當的HTML屬性編碼。此外,這仍然無法解決iframe父級重定向問題或僅加載可用於網上誘騙的iframe。你真的應該建立一個允許的URL的白名單 –

+0

是否有可能檢查該網站是否在我的服務器上?如果該網站的IP = _____,那麼去哪裏好? – Drew

1

您很容易受cross site scripting的影響。

所有需要做的事情是在URL中包含"></iframe><script>EEEEVVvvvillll!!!!,或者使用非HTTP/HTTPS URI。

+0

謝謝。只要有機會,我就更新了答案,這看起來是一個很好的解決方案嗎? – Drew

1

下面是這裏所涉及的安全問題清單..

的IFrame安全概要

週三,2007年10月24日我已經決定收集的概念的各種證明 我已經做了並總結爲什麼iframe有安全風險。 以下是最常見的原因: -

  1. 瀏覽器跨域利用

說明: - 因爲你可以嵌入其他網站的頁面中, 你可以利用該網頁,執行操作的用戶並在選定的網站上做任何事情 。概念的

證明: - 野生動物園的β3.03零天

  1. XSS/CSRF反射攻擊

描述: - 使用嵌入到受損網站iframe那麼 攻擊者可以反映到其他攻擊服務器因此使得攻擊難以追蹤,並且有一個焦點進行 攻擊。

概念驗證: - 沒有可用於此類型的攻擊,因爲它會在沒有實際進行攻擊的情況下難以顯示該方法。

  1. CSS和iframes可以從互聯網上掃描你的局域網!

說明: - 通過CSS開發功能以及使用的iframe檢查 如果默認IP地址存在,它可能讓你的網絡 地址範圍很容易地提供網絡設備使用 默認開箱IP地址。

概念證明: - CSS局域網掃描儀

  1. 局域網掃描使用JavaScript和iframe中

說明: - 使用類似的方法,它上面可能獲得使用Javascript 你的局域網信息。概念

證明: - 使用Javascript局域網掃描儀

  1. CSS的iframe覆蓋

說明: - I幀可以嵌入到Firefox中相互 你可以改變自己的外表,以創建無縫覆蓋與任何 網站。這會讓用戶很難知道他們正在與哪個網站進行交互並欺騙他們執行操作。

概念證明: - 威瑞信OpenID的漏洞(現已修復)

  1. URL重定向

說明: - I幀也允許你執行重定向,以便您可以 訪問的URL通常將無法訪問。在 美味示例中,POC從美味/家庭重定向到您的 帳戶書籤,然後使用CSS疊加顯示您的第一個 書籤。火狐和美味的帳戶是POC所必需的。

概念證明: - 美味的CSS覆蓋/重定向

Original here

你可以把它安全很多表現得像個代理,加載在PHP請求的URL,剝離東西展現出來的在HTML(JavaScript的等),然後在iframe中顯示它指向一個網頁服務器上

2

The request method does not provide any securiy features, please see this answer

您需要100%確定無疑,您的代碼不會使用JavaScript劫持該框架,或將該用戶引導至惡意網站,或導致您的網頁上出現一些他們不想要的內容的請求表單。

You can see some examples out here of that

<IFRAME SRC="javascript:alert('XSS');"></IFRAME> 

<iframe src=http://ha.ckers.org/scriptlet.html"></IFRAME> 

You could have the person lead to post something as well...

反正,我可以竊取你所有的cookies,或欺騙用戶以爲他們仍然在你的網站,但確實是對我的從哪裏獲得他們所有的寶貴的信息。

只需停下來,在你走之前,你需要知道你在做什麼,and you start by reading this

+0

謝謝!請檢查我更新的答案,並讓我知道你的想法。 – Drew

+0

對此不太有信心,這並不是針對你正在做的事情。在你做任何事之前去學習。 http://google-gruyere.appspot.com/ – Incognito

4

你應該使用PHP的filter_var,以檢查它是有效的...

if (isset($_GET['url'])) { 
     if (filter_var($_GET['url'], FILTER_VALIDATE_URL)) { 
      $url = $_GET['url']; 
     } 
    } 
+0

真棒,謝謝!這是一個額外的步驟。我將其添加到我最近的編輯中。 – Drew