2013-04-25 44 views
2

我對PHP相當陌生,正在使用幾個_GET變量來確定頁面佈局/ Web服務數據以及頁面上的其他邏輯。我不存儲數據或寫入任何類型的數據庫。我應該使用什麼樣的消毒方法?我應該如何清理僅在頁面上使用的_GET變量?

例如,一個變種我使用的是這樣的:?

$querystring = $_SERVER['QUERY_STRING']; 
if(isset($_GET['semester']) && $_GET['semester'] != ''){ 
    $listxml = simplexml_load_file("http://path/to/webservice/?".str_replace('semester','term',$querystring)); 

這是怎麼回事但如果該查詢字符串有學期=集,而不是空白的,然後我用「術語」替換它並將查詢字符串按原樣傳遞給Web服務URL(Web服務使用術語變量,但術語變量干擾wordpress並重定向到該術語的帖子頁面(WP中的標記/類別),因此我通過WP作爲學期,然後只是改變它的網絡服務電話的期限

所以在這種情況下,我沒有做任何與_GET除了傳遞它就像Web服務一樣,Web服務對查詢字符串的處理不在我手中,但是我應該以任何方式爲他們「準備」它?

-

我也得到了類似這樣的情況:

$display = '';  
if (isset($_GET['display'])) { 
    $display = $_GET['display']; //set sort via querystring 
} else { 
    $display = 'interest'; //set to default by interest 
} 

後:

<div id='byalphabet' class='<?php global $display; if($display != 'alphabet'){echo 'hide';} ?>'> 

<div id="byinterest" class="<?php global $display; if($display != 'interest'){echo 'hide';} ?>"> 

-

而且使用一段JavaScript動態:

$view = ''; 
if (isset($_GET['view'])) { 
    $view = $_GET['view']; //set view via querystring 
} 

後來:

<script> 
<?php if ($view != ''){ $view = str_replace('/','',$view); ?> 
jQuery('#<?php echo $view; ?>').trigger('click'); //activate view option accordion pane 
jQuery('html,body').animate({'scrollTop':jQuery('#<?php echo $view; ?>').offset().top - 50},500); //scrollTo view 
</script> 

-

其他情況包括尋找一個_GET值array_search($_GET['major'], $slugs);一個數組,並使用重定向頁面:

$parts = explode('/',$_SERVER['REQUEST_URI']); 
Header("HTTP/1.1 301 Moved Permanently"); //SEO friendly redirect 
Header("Location: http://www.site.ca/programs/outline/".$parts[3]."/"); 

Ed它:我已經閱讀了很多彈出的類似問題,但他們大都指的是以某種其他方式使用數據,例如插入數據庫。

+1

'視圖=「);警報(」 XSS'就大功告成了 – Gumbo 2013-04-25 15:53:58

+0

@Gumbo它似乎沒有工作 - 這可能PHP自動改變? ('''); alert('click');' – tsdexter 2013-04-25 17:36:24

+0

或者使用'jQuery'('#'); alert('click');或者使用' ('XSS'); jQuery('#'以'jQuery('#'); alert('XSS'); jQuery('#' ).trigger('click');'這也只是拋出JS錯誤 - 我似乎無法得到它接受報價,因爲與HTML實體,百分之實體或直接引號字符..我知道我仍然需要消毒但PHP會自動處理報價? – tsdexter 2013-04-25 17:39:37

回答

2

您應該始終清理輸入參數。即使你沒有在數據庫中使用它們,你仍然很容易遭受跨站點腳本/ XSS攻擊。

<?php $view = $_GET['view'] ?> 
<script>jQuery('#<?php echo $view; ?>').trigger('click');</script> 

例如給上面的代碼,一切都很好,如果?view=page_one,因爲你的JavaScript看起來像jQuery('#page_one').trigger('click');

但是,如果你的查詢字符串是?view=hacked%27)%3B%20alert(document.cookies)%3B%20jQuery(%27%23page_one - 現在您的JavaScript看起來像在頁面上的以下內容:

jQuery('#hacked'); alert(document.cookies); jQuery('#page_one').trigger('click'); 

alert()可以很容易地被一個AJAX請求到身份驗證令牌等發送到不同的服務器。

最終,您所做的消毒類型取決於您使用輸入的上下文。在這個例子中,例如,你可能想要確保你轉義單引號,但實現之間可能有所不同。

在消毒的投入在這裏好文章:http://coding.smashingmagazine.com/2011/01/11/keeping-web-users-safe-by-sanitizing-input-data/

+0

感謝更多有用的答案,然後上面的評論。我試過你的建議,我沒有JS警報......但我知道,無論如何我需要消毒。我會看看這篇文章,謝謝。 – tsdexter 2013-04-25 17:05:26

+0

我的錯誤,我試圖在舊版本的頁面沒有視圖變種。在新版本中,它將'變成',它仍然會打斷JS,並在控制檯中引發JS錯誤。 '未捕獲的錯誤:語法錯誤,無法識別的表達式:#hacked');警報( '你好'); jQuery('#page_one'):'jQuery('#hacked \'); alert(\'hello \'); jQuery('#page_one')。trigger('click');' – tsdexter 2013-04-25 17:12:04

+0

它看起來像你正在逃避上面的單引號,我也沒有看到你的網站或測試我的代碼,它只是一個可能的攻擊的例子 – doublesharp 2013-04-25 17:35:44