2015-07-03 73 views
-1

我學習PHP和我遇到的htmlspecialchars(),它是用來防止黑客攻擊,怎麼來的?我在谷歌上看過它,還不明白。請給我舉個例子嗎?使用用htmlspecialchars()的

<form method="post" action="<?php echo htmlspecialchars($_SERVER['PHP_SELF']);?>"> 
Website : <input type="text" name="website"><br> 
<input type="submit" value="Submit" name="button"> 

</form> 

<?php 
if($_SERVER["REQUEST_METHOD"] == "POST"){ 
    $website = $_POST['website']; 
    echo "true"; 
if(empty($website)){ 

    echo "empty"; 
    } 
else{ 
    echo $website; 
    } 
} 
?>  

當我輸入一個網址,這樣http://www.example.com/test_form.php/%22%3E%3Cscript%3Ealert('hacked')%3C/script%3E輸出 http://www.example.com/test_form.php/%22%3E%3Cscript%3Ealert('hacked')%3C/script%3E


當我從 <form method="post" action="<?php echo htmlspecialchars($_SERVER['PHP_SELF']);?>"> 刪除htmlspecialchars() 輸出是一樣的。爲什麼?有什麼用的htmlspecialchars()然後?

和 然而,考慮到用戶輸入以下網址到地址欄:

http://www.example.com/test_form.php/%22%3E%3Cscript%3Ealert('hacked')%3C/script%3E


在這種情況下,上面的代碼將被轉換爲:(?如何以及在哪裏發生這種情況)

<form method="post" action="test_form.php/"><script>alert('hacked')</script>

+0

請儘量回答我的問題,而不是授予它的-1。 A 8小時的搜索後,我來到這裏是要問這個問題,所以請儘量澄清這對我:)。 –

+0

你只是逃避PHP_SELF的行動= URL。然後瀏覽器在發送POST請求時將HTML實體解釋掉。 PHP接收原始值。然後你不會逃避'$ website'。 - 另外,是關於[上一個問題]的評論投訴(http://stackoverflow.com/questions/31207902/how-to-convert-to-lt-and-convert-to-gt-using-php)發佈幾分鐘前由一個*不同的用戶? – mario

+0

可能的重複[你只在輸出上運行htmlspecialchars(),或者你還有其他功能嗎?](http://stackoverflow.com/q/526438),[使用htmlspecialchars()進行輸入/輸出HTML清理,對於MySQL數據庫糟糕的設計?(http://stackoverflow.com/q/14148937),[對所有輸出需要用htmlspecialchars()?](http://stackoverflow.com/q/17812833),[PHP& MySQL的:什麼時候究竟使用ヶ輛(http://stackoverflow.com/q/2077576) – mario

回答

2

如果你不使用htmlspecialchars()處理攻擊者可能執行代碼的JavaScript特別。

從您的代碼嘗試提交與<h1>Hello, World!</h1>的形式輸入的結果將是

你好,世界

並防止這種類型的攻擊,我們使用 htmlspecialchars()

沒有用htmlspecialchars()的代碼被執行

並提交<script>alert('alert');</script>結果將是警告框

在文本框中提供<script>alert('alert');</script>並提交。

enter image description here

結果 enter image description here

+0

我喜歡你的答案。但根據本[鏈接](http://prntscr.com/7oe6dh)這裏,代碼應該如果我不使用'用htmlspecialchars(彈出警報)'但沒有任何反應。爲什麼? –

+0

代碼''是不是在上面創建任何警報? 我的代碼是
' <形式方法= 「POST」 行動= 「?」> 名稱:
<?PHP的 如果($ _ SERVER [ 「REQUEST_METHOD」] == 「POST」){ \t $ website = $ _POST ['name']; if(empty($ website)){ \t echo「empty」; \t} else { \t echo $ website; \t}} ?> ' –

+0

的代碼顯示警報.... – Malik

2

用於防止XSS這個函數攻擊它簡單而功能強大但是如果你想防止SQL注入使用mysqli_escape_string而不是

你提供你應該在用戶輸入「回聲,打印」使用它的代碼

$website = hmtlspecialchars($_POST['website']); 

如果$網站應該是網址,你可以驗證它:

$website = (filter_var($_POST['website'], FILTER_VALIDATE_URL) === false) ? '' : hmtlspecialchars($_POST['website']); 
+0

可以請你解釋一下[link](http://prntscr.com/7oe6dh),當我試過這段代碼時,沒有任何提醒那裏 。 –

+0

如果您顯示的是用戶給出的PHP_SELF,則您必須轉義所有用戶條目 – bader

+1

如果您的意思是您無法執行JavaScript「maybe」,因爲您的瀏覽器保護 – bader