2012-04-22 53 views
4

我使用下面的代碼來控制分頁。它使用$_SERVER['PHP_SELF'],所以我想知道它的安全性如何,或者我需要做些什麼才能使$_SERVER['PHP_SELF']安全?

<?php 

    if($rows > 10) { 
     echo '<a id=nex href="'.$_SERVER['PHP_SELF'].'?pg='.($startrow+10).'"> 
     Next</a>'; 
    } 

    $prev = $startrow - 10; 

    if ($prev >= 0) { 
     echo '<a id=pex href="'.$_SERVER['PHP_SELF'].'?pg='.$prev.'"> 
     Previous</a>'; 
    } 

?> 
+0

「* secure *」有很多含義 - 你的是什麼? – 2012-04-22 21:31:31

+0

「安全」的含義$ _SERVER ['PHP_SELF']基本上在地址欄中執行什麼。我是PHP的新手,但我被告知$ _SERVER ['PHP_SELF']必須被清理...... – ariel 2012-04-22 21:32:20

+0

在這種情況下沒有問題,當您使用$ _SERVER ['PHP_SELF']作爲表單操作時。然後,只有當你傻乎乎的接受任何輸入而不檢查它。 – 2012-04-22 21:34:29

回答

7

工具來防止XSS攻擊,你應該使用htmlspecialchars()filter_input()逃脫$_SERVER['PHP_SELF']。有關更多信息,請參閱this question

另請注意,如果您啓動的href屬性爲?且沒有路徑,瀏覽器會將後續查詢字符串附加到當前請求,就像相對鏈接會附加到同一目錄一樣。

我假設您正在對其他地方的$prev$startrow進行消毒。數學比較應該讓他們安全,但是如果他們來自$ _GET,那麼在做其他事情之前通過intval()運行它們是個好主意。

+0

謝謝。這是我在查詢的頂部://新腳本開始 if(!isset($ _ GET ['pg'])or!is_numeric($ _ GET ['pg'])){ $ startrow = 0; } else { $ startrow =(int)mysql_real_escape_string($ _ GET ['pg']); } \t 所以使用(int)和轉義是正確的? – ariel 2012-04-22 21:55:56

+0

通過inval()傳遞一個值或將其轉換爲帶有(int)的整數產生相同的結果,是的。 – 2012-04-22 22:16:39

+0

psst:如果您想防止注射,請完全遠程操作屬性。它默認爲一個空字符串,這是一個相對的URI,代表了99.9%的情況下'$ _SERVER ['PHP_SELF']'的含義。 – hakre 2014-12-26 16:11:16

0

$_SERVER['PHP_SELF']在某種意義上已經安全的,沒有人物可以產生要張貼改變你的HTML語法。唯一的是文件名本身。

通常情況下,您應該使用諸如htmlspecialchars之類的方法在將輸出發佈到瀏覽器之前對輸出進行清理。

8

你應該使用filter_inputhttp://php.net/filter_input

$phpSelf = filter_input(INPUT_SERVER, 'PHP_SELF', FILTER_SANITIZE_URL); 

然後用$phpSelf代替$_SERVER['PHP_SELF']

這比htmlspecialchars好,但理想的解決方案將可以使用像這樣http://htmlpurifier.org/

+0

謝謝。由於我是PHP的新手,我不確定使用filter_input vs htmlspecialchars有什麼區別?你能澄清嗎? – ariel 2012-04-22 21:54:05

+0

htmlspecialchars僅將一些HTML符號轉換爲實體,但用戶仍可以注入外來字符或UTF-8特殊字符。帶有FILTER_SANITIZE_URL的filter_input驗證URL鏈接(您也可以在PHP手冊中看到更多的殺毒程序類型),但這也不完整(有複雜的XSS技術可以繞過該技術)。 HTMLPurifier甚至更好,因爲它是爲了避免XSS並避免其他函數帶來的所有問題而編寫的。 – alganet 2012-04-22 22:02:12

+0

ok但是htmlspecialchars();仍然可以正常顯示用戶輸入,對嗎? – ariel 2012-04-22 22:05:54

相關問題