2017-10-06 166 views
0

對不起,對我的英文不好!關於來自mysql數據庫的php輸入和輸出數據

正如我正在學習PHP,並有一些關於從數據庫中插入和輸出數據的問題。

我正在使用PHP PDO。

要插入的數據我使用下面的函數數據庫:所以

public static function validate($string){ 
    $string = trim($string);   
    $string = htmlspecialchars($string, ENT_QUOTES, 'UTF-8'); 
    return $string; 
} 

當我插入這個數據O'Really <script>alert(is it safe?)</script>我看到的數據是正確的(也許)逃脫/保存在數據庫中。像這樣:&lt;script&gt;alert(1)&lt;/script&gt;

現在,當我輸出這個數據時,我應該使用任何PHP函數?

如果不是那麼安全嗎?

好吧,如果我使用任何PHP函數一樣htmlentities然後將數據顯示這樣的O&#039;Really &lt;script&gt;alert(is it safe?)&lt;/script&gt;

關當然,我不想要的。

現在,當我編輯這個數據我看到的數據被保存到數據庫中像這樣:

O&amp;#039;Really &amp;lt;script&amp;gt;alert(is it safe?)&amp;lt;/script&amp;gt;

你們能告訴我正確的方法/指導安全接入/輸出數據到/從數據庫?

+1

如果您是網站上唯一的編輯,並且不擔心別人添加任何疑問,那就夠了,如果沒有,請檢查此工作表https://www.owasp.org/ index.php/XSS_(Cross_Site_Scripting)_Prevention_Cheat_Sheet。另外,最好不要在表格中保存標籤,但在調用數據時添加標籤。 – AXAI

+3

關於這個尖叫的一切「!️」修剪和逃避是兩個完全不同的問題。對輸入進行修剪和清理,如果**,則只能在**時顯示。對於HTML,你使用HTML轉義函數,對於JSON和JavaScript,它是不同的。在寫入數據庫時​​,盡一切努力**使用帶有佔位符值的準備好的語句**。 – tadman

+0

你的問題與sql或注入無關。 –

回答

0

有(至少)兩個不同的風險要處理,同時從網頁存儲在數據庫中的用戶給出的數據:

  1. 跨站點腳本(XSS)攻擊,上面提到的AXAI。在這種情況下,問題實際上不是數據庫層,而是插入到HTML代碼中的動態文本字段。在你的代碼片段中,你通過將標記標記(<和>)轉換爲實體,然後將它們存儲在數據庫中,然後處理了這個問題。我建議做相反的事情(如tadman說):存儲純文本(但請參閱下一節),並在HTML輸出中輸出字段時使用htmlspecialchars()。

  2. SQL注入攻擊。基本上,你想正確地轉義任何特殊字符,例如'必須在SQL命令中變成\'。如果這種轉義正確完成,它不會扭曲保存在數據庫中的內容,而是確保用戶輸入的所有字符(無論是正常的還是特殊的)都被放入數據庫中。文章http://php.net/manual/en/security.database.sql-injection.php描述了這個更接近,並且還給事件提供了更好的方法(即可變綁定)。

+0

因此,對於第一點,你說的是插入這個數據'O'Really '直接沒有任何轉義到數據庫表並在輸出時使用'htmlspecialchars()',對嗎 –

+0

是的,把它沒有任何HTML風格的轉義到數據庫中。 **然而**,取決於你如何將它放入數據庫,你可能需要做特定於SQL的轉義:'INSERT ...('O \'真的