2017-07-11 95 views
1

我對字符編碼感到困惑。與html編碼混淆

我知道人們以不同的方式做事,但許多人建議您在輸入數據庫時​​將輸入存儲在數據庫中,然後在閱讀時根據您打算使用的內容進行處理。這對我有意義。

因此,如果用戶輸入一個單引號,雙引號或符號,小於,大於號,這些將在我的數據庫寫爲'「分別& <>。

現在,讀數據php,我通過HTMLPurify運行文本,以捕捉任何注入問題。

我還應該htmlencode嗎?如果我不這樣做,一切似乎都沒問題(在Chrome和Firefox中),但我不確定這是否正確並將它在其他瀏覽器中正確顯示?

如果我使用htmlentities與E NT_QUOTES和htmlspecialchars,我開始得到這些字符的代碼,我相信這是我應該看到的,如果看看頁面源,但不是在用戶看到的頁面上。

問題是,沒有做編碼,我看到了我想看到的東西,但是在我的腦海裏有這樣的小竅門,我沒有正確地做它!

+1

這可能會被標記爲脫離主題,因爲它完全基於意見。您可能想要用代碼示例來更改具體的問題。 – Difster

+1

將用戶輸入存儲爲「原樣」,但在輸出之前對其進行消毒(例如,如果要防止XSS)。你不需要HTML編碼任何東西。 – Terry

+0

將數據作爲實際數據 - 即,如果它是通過HTML,將其忽略。然後其他應用程序可以使用它。 –

回答

1

你有這個困惑。字符編碼是您的系統的一個屬性。您的網站和數據庫負責字符編碼。

你必須決定你會接受什麼。總的來說,網絡已經走向了UTF-8的標準化。因此,如果您的網站接受用戶輸入和您的數據庫,並且所涉及的所有連接都是UTF-8,那麼您可以接受爲UTF-8的輸入,並且應該適當配置數據庫中的字符集和排序規則。

此時所有網頁應該是HTML5,所以你should at a minimum be this頁的推薦HEAD部分:

<!DOCTYPE html> 
<html lang="en"> 
<head> 
<meta charset="utf-8"/> 

接下來你有SQL注入。你指定了PHP。如果你正在使用mysqli或PDO(在我的經驗中,這是更好的選擇),並且你正在爲所有變量使用bindParameter,所以沒有SQL注入的ISSUE。這個問題消失了,並且需要轉義輸入消失,因爲您不再需要擔心SQL語句可能會感到困惑。 這是不可能的了。

最後,你提到了htmlpurifier。這樣做的目的在於讓人們可以嘗試避免XSS和其他性質的漏洞,這些漏洞會在您接受用戶輸入時發生,並且這些人會注入html & js。

根據系統的性質以及您對輸出的處理方式,這總是會成爲問題,但正如其他人在註釋中所建議的那樣,您可以在檢索完輸出後在輸出上運行清理程序和篩選器來自數據庫。坐在一個PHP字符串變量裏面,沒有內在的危險,直到你通過將它注入到你正在服務的一個實時HTML頁面來實現武器化。

在尋找不良演員和試圖混淆你的系統的人方面,你顯然更好地存儲提交的原始輸入。然後,當你瞭解這些漏洞的性質時,你可以搜索你的數據庫尋找特定的東西,如果你先清理並存儲結果,你將無法做到這一點。