2017-08-08 36 views
0

如果以前有人問過這個問題,我們表示抱歉 - 但在這種情況下,我覺得信息過多,而不是太少。在我看來,每個地方似乎都有矛盾的觀點。 任何澄清將不勝感激。我是否需要在HTML表單中使用htmlspecialchars()用戶輸入來防止XSS?

我有一個用戶註冊表單。我已驗證了不同的字段,但我沒有對數據使用任何清理功能(例如htmlspecialchars),因爲我讀here,最好將其保留到輸出(例如在用戶配置文件中)。我使用PDO準備好的語句來插入我的數據,所以我在那裏安全,據我所知。

但是,通過各種漏洞掃描程序運行我的域名後,他們報告說我的註冊表單非常不安全,並可能成爲XSS攻擊的受害者。我相信的代碼導致,這是如下的片斷:

<input type="text" placeholder="Username" name="user" maxlength="32" value="<?php echo test_input($user); ?>" pattern="^[a-zA-Z0-9]*$" required> 

我回聲荷蘭國際集團用戶的輸入回形式的情況下,他們有一個錯誤在另一個領域,以修正後重新提交。因此可能會將有害的腳本回顯到頁面中。

但是,當然這只是來自該特定用戶的輸入?他們可能造成的唯一危害是他們自己?掃描儀是錯誤的還是基本不知道風險?

我有一般字符串,電子郵件地址,URL的字段。我採取了哪些步驟來確保訪問者訪問我的網站的安全?

非常感謝您給我任何幫助/澄清!

編輯

function test_input($data) 
    { 
    $data = trim($data); 
    $data = stripslashes($data); 
    $data = htmlspecialchars($data, ENT_QUOTES | ENT_HTML5, 'UTF-8'); 
    return $data; 
    } 
+0

'test_input()'做了什麼? –

+0

對不起,這是我現在添加的用於防止危險腳本運行的功能。我會將其添加到原始帖子。基本上我的問題是,如果在這個階段是必要的,或者我只是返回用戶輸入的內容?感謝您指出了這一點。 – user2228716

+0

[偉大的逃避現實(或:你需要知道怎麼處理文本中的文本)](http://kunststube.net/escapism/) – deceze

回答

0

我需要在一個HTML表單進行htmlspecialchars()用戶的輸入,以防止XSS?

您需要東西htmlspecialchars通常是一個不錯的選擇。它很簡單,不會破壞輸入。

但是,當然這只是該特定用戶的輸入?

它來自該特定用戶的輸入瀏覽器

該用戶可能訪問了一個邪惡的第三方網站,該網站將XSS攻擊作爲其網站上表單輸入的默認值。然後他們將action的表格設置爲您的網站。然後他們用JS提交表單。

結果:他們的代碼由用戶的瀏覽器注入到您的網站,並且他們的JS在您的網站上執行(訪問用戶的Cookie和會話)。

+0

啊,現在這是完全合理的!非常感謝。因此,我可以將原始用戶輸入提交到我的數據庫中(前提是我在輸出中特別指定它),但是當回顯用戶輸入到表單中以進行更正時 - 我應該在給定的情況下也特別注意它? – user2228716

0

將任何變量插入到另一個上下文中時,還應該通過htmlspecialchars()(或上面的noHTML())運行它們,以確保它們不會分離並向父元素添加額外的屬性。

這是安全的:

<input type="text" name="username" value="<?php echo noHTML($htmlp->purify($_GET['username'])); ?>" /> 

這同樣是對XSS攻擊的安全,但仍然是一個壞主意:

<?php echo $htmlp->purify("<input type=\"text\" name=\"username\" value=\"".$_GET['username']."\" />"); ?> 

事實證明,背景是相當重要的,以防止交叉現場腳本攻擊。在其他上下文中(例如,我們處於HTML屬性的中間),在一個上下文中安全的內容(例如,允許HTML)可能是災難性的。

全部來源:https://paragonie.com/blog/2015/06/preventing-xss-vulnerabilities-in-php-everything-you-need-know

+0

這是一個很好的來源,非常感謝。我同意使用ENT_QUOTES來確保安全性,但是,如果我想在我的某個字段中允許使用單引號('),該怎麼辦?否則不會「我不喜歡XSS攻擊」被輸出爲像「我不喜歡XSS」的東西'? – user2228716

+0

你可以用反斜槓'「我不喜歡XSS攻擊」來避免引用。如果你發現我的答案有用的話給它upvote :) –

-1

我會在你所描述的,沒有,沒有太多的風險確切的情況說了,因爲值不保留即使他們提交的代碼注入和XSS攻擊,這隻會影響他們自己的看法。
但是,將非編碼值輸出回給用戶是不好的做法。如果頁面稍後被更改,或者該值被持久保存,並且稍後在沒有編碼的某種管理頁面中查看,該怎麼辦?那麼他們已經設法在您的網站上注入XSS攻擊。 在顯示它們之前始終對任何用戶輸入的值進行編碼是一種很好的做法。

+0

有道理,謝謝你的幫助! – user2228716

相關問題