2013-01-04 110 views
0

UPDATE:下面的代碼被認爲是如下涉及@JanDvorak @ MrCode討論安全的代碼,而我就在MrCode答案的評論:)下面的php代碼是否有涉及安全風險?

page1.php中

<form method="post" action="page2.php"> 
<textarea name="tryit" cols="!20" rows="10"></textarea> 
</form> 

頁2.PHP

<?php 
echo filter_input(INPUT_POST, 'tryit', FILTER_SANITIZE_SPECIAL_CHARS); 
?> 

我只是不想讓任何用戶執行任何系統代碼或調用任何系統函數。

感謝

+1

可能更適合[codereview.stackexchange.com](http://codereview.stackexchange.com/)... – War10ck

回答

1

的代碼在XSS方面的安全,因爲filter_input()FILTER_SANITIZE_SPECIAL_CHARS標誌編碼的HTML特殊字符,防止XSS漏洞。

Manual

FILTER_SANITIZE_SPECIAL_CHARS
HTML逃逸「」 <> &並用ASCII值字符小於32,任選地剝離或編碼其他特殊字符

。它與以下內容相同:

echo htmlspecialchars($_POST['tryit']); 

如果您將代碼移動到另一個上下文中,例如移入SQL查詢中,則它不再安全。特殊字符編碼特定於防止XSS。

+0

IT不會允許任何系統調用執行正確嗎?例如'ls'或exec(「ls」);類似的東西.. – UserHex

+1

沒有系統調用可以用該代碼執行。即使沒有過濾器,系統調用也不能執行(只有Javascript)。 – MrCode

+0

根據XSS *的上下文,它是安全的。 – Gumbo

0

使用htmlspecialchars,這將替換所有特殊的html字符:& ' " < >&amp; &#039; &quot; &lt; &gt;,之後它們將顯示爲正常字符。

+0

使用filter_input比我更喜歡htmlspecialchars?if我錯了,請告訴我正確的答案? – UserHex

0

此代碼片段不會執行操作系統或任何shell命令的任何功能。

filter_input也不會執行任何系統功能。

page2將僅顯示POST收到的任何文本。

存儲在$_POST['tryit']中的值不會受到影響。當您再次訪問該變量時(或將其HTML轉義版本存儲在某處),您需要分別對其進行清理。

filter_input不常用。您可以使用特定的轉義函數。