2016-07-22 73 views
0

我注意到幾個SQL注入保護教程,導師會說「」,您必須在輸出到頁面時清理所有用戶數據「 - 或沿線的東西..爲什麼需要清理輸出到瀏覽器的數據

但是,我很困惑,爲什麼這是必要這樣做。

其中一個原因是:你通常不會將數據輸入到數據庫中,因此不需要再次輸出數據。

對我來說似乎有點無意義,我一直在尋找尋找答案,爲什麼這是必要的,但我似乎無法找到解釋如何防止任何攻擊的任何頁面。

如果有人能告訴我那的,那將是極大的讚賞,

感謝。

+0

當您使用Prepared Statements時,您不會再輸入。您僅因SQL注入而逃脫。由於XSS,您清理輸出。您將html特殊字符轉換爲其代表性的html代碼,以便瀏覽器不會將其解析爲HTML。 –

+0

@CharlotteDunois請參閱編輯。我似乎混淆了消毒和轉義 –

回答

1

數據庫不是網頁。

什麼使數據安全放置在一串SQL中與使數據安全放置在HTML文檔中的內容不同。

即使是這樣,從數據庫讀取數據的行爲也會給你非轉義的數據。舉一個微不足道的例子:給定INSERT INTO foo (a, b) VALUES ('John', 'O\'Brian'):\沒有插入到數據庫中。它只是停止'結束SQL中的字符串。


當您將數據插入數據庫時​​,您需要將其轉義(或使用預準備語句)以抵禦SQL注入攻擊。

將數據插入網頁時,您需要將其轉義(或使用基於DOM的白名單過濾器)來抵禦XSS攻擊。

現在你可能當你插入數據到數據庫而不是插入到數據庫時,試圖防止XSS,但這是不成熟的,可能會導致更大的問題。這意味着您將在數據庫中存儲HTML而不是文本,如果您決定要將文本用於其他目的(如插入電子郵件或僅被搜索),那麼這種方法就不太有用。

+0

我知道'\\''是用來轉義數據的。但是'htmlspecialchars'(例如)函數呢?爲什麼無緣無故地使用它(在輸入和輸出上)。似乎有點歪曲我。對不起,這種奇怪的問題,只是很好奇 –

+1

@CaelanGrgurovic - 你不知道。將數據插入HTML時使用它。將數據插入到SQL中時不使用它。 – Quentin

+0

ohh。奇怪的是,我所看到的大多數教程都以不同的方式對它進行了研究,或者只是對輸入數據進行消毒**或**對輸入和輸出進行數據清理。 –

-1

首先,包括在將數據插入數據庫之前應該轉義數據的教程通常很糟糕或過時。始終使用帶有參數的準備好的語句,而不是手動轉義數據。

轉義輸出數據是爲了防止對您的用戶進行跨站點腳本攻擊(XSS)攻擊。

相關問題