在對stackoverflow進行長時間的搜索後,我沒有發現任何人談論過這個問題,即使這是一個很大的選擇,問題是什麼是最好的,以防止XSS和SQL注入,轉義數據然後將其存儲數據庫還是按原樣存儲並在輸出時退出?什麼是最好的,逃避然後存儲或存儲,然後逃脫輸出?
注意:如果可能的話給出一些實踐例子會更好。
謝謝
在對stackoverflow進行長時間的搜索後,我沒有發現任何人談論過這個問題,即使這是一個很大的選擇,問題是什麼是最好的,以防止XSS和SQL注入,轉義數據然後將其存儲數據庫還是按原樣存儲並在輸出時退出?什麼是最好的,逃避然後存儲或存儲,然後逃脫輸出?
注意:如果可能的話給出一些實踐例子會更好。
謝謝
退出輸入,存儲,然後轉義輸出。
如果您在沒有轉義的情況下存儲,您很容易受到SQL注入的攻擊。
例子:你有一個查詢:
mysql_query("SELECT * FROM `table` WHERE `abc`= '{$_POST['def']}';
假設$ _POST [「高清」]等於
blah'; DROP TABLE `table`; SELECT * FROM `table` WHERE 'abc' = '123
這將導致你的表被丟棄,如果它沒有逃脫。
如果在不轉義的情況下輸出,則容易受到XSS的影響。
否則,用戶可以向其他用戶可以查看的頁面注入有害的Javascript。
那麼,在具體的例子中並不完全正確。 'mysql_query()'不支持多個查詢。 – 2010-04-01 23:58:25
你的問題並沒有多大意義,因爲非常行爲試圖存儲包含SQL注入數據是什麼原因的 SQL注入。
無論哪種方式,您應該使用Parameterized queries來防止SQL注入。
對於XSS/HTML轉義,我個人寧願在插入時做它,因爲那樣你只需要處理一次,而不是每次顯示。一個小優化,但很容易。
它在插入時逃脫是錯誤的。在插入時,你不知道字符串將在哪裏使用。例如,您可能希望將該字符串發送到HTML或JavaScript,或者您可能希望將該字符串用作URL中的查詢參數。或者,您可能希望在字符串存儲在數據庫中後對其進行一些分析。這些用例中的每一個都有不同的轉義方法。 – 2010-04-02 06:35:49
在某些特定情況下,消毒(如剝離HTML)是適當的。例如,持有URL的字段不應存儲HTML。另外,一個持有某人名字的字段不應該存儲HTML。然而,一個擁有全名的字段可能有一天將其存儲爲XML來描述給定名稱和姓氏,因此它可能不應該被剝離。必須考慮哪些格式可以存儲在一個字段中。 – outis 2010-04-02 20:30:25
爲了,你應該做到以下幾點 -
驗證輸入,看它是否符合你的期望。如果不是,則拒絕輸入並停止。如果符合,繼續下一步而不改變的輸入。
將輸入綁定到參數化查詢,或者在形成查詢時轉義輸入。請注意,轉義輸入並不會改變輸入。數據庫將始終包含用戶輸入的確切字符串。
向用戶顯示時,必須根據上下文進行轉義。大約有5種不同的方式可以轉義相同的字符串 - 具體取決於您是以HTML元素,HTML屬性,Javascript,CSS還是以URL的形式顯示。請參閱http://www.owasp.org/index.php/XSS_%28Cross_Site_Scripting%29_Prevention_Cheat_Sheet。再一次記住,轉義不會改變字符串。用戶必須總是看到他輸入的確切字符串。
您可能會試圖在數據庫中存儲修改過的字符串 - 但請不要這樣做。如果你爲HTML轉義它,你永遠不能在javascript中使用該字符串。如果你不得不做後端處理,你必須避開字符串。你很快就會到達一個你不能做正確的事情的階段。
請記住,轉義只是將數據從一個層傳輸到另一個層的一種方式。在休息時(數據庫或屏幕),數據應與用戶輸入的方式完全一致。
如果您正在轉義SQL,那麼您做錯了。始終使用參數化查詢。 – Nate 2010-04-02 17:29:48