我正在使用Ruby on Rails 3.1.0,我想知道什麼是防止將「惡意」值存儲在數據庫。有一種常見的做法來拒絕「惡意」用戶輸入到rails應用程序
例如,我有一個數據庫表的列意味着存儲的URL。通過驗證(只是長度檢查)的用戶可以提交一個URL,如http://<script>alert('hello!');</script>
。 我想不要存儲像上面的鏈接...我該怎麼做?
我正在使用Ruby on Rails 3.1.0,我想知道什麼是防止將「惡意」值存儲在數據庫。有一種常見的做法來拒絕「惡意」用戶輸入到rails應用程序
例如,我有一個數據庫表的列意味着存儲的URL。通過驗證(只是長度檢查)的用戶可以提交一個URL,如http://<script>alert('hello!');</script>
。 我想不要存儲像上面的鏈接...我該怎麼做?
正確的事情做的是使用URI解析URL應該再檢查每個組件:
validate :url_check
def url_check
u = URI.parse(self.url)
# check u.scheme, u.userinfo, etc. and call errors.add(:url, '...')
# if something is invalid.
rescue URI::InvalidURIError
errors.add(:url, 'You are being naughty.')
end
現在,這是正確的答案:-) – 2012-01-11 12:20:58
@Sergio:我討厭解析,所以我聘請真正的懶惰,讓別人爲我做,它是超級有效的。 – 2012-01-11 19:57:10
雖然這些鏈接在數據庫中,但它們沒有任何傷害。當您嘗試渲染它們時可能會出現問題。 Rails在逃避你輸出的大多數事情方面做得很好(我不敢說「一切」,因爲我不知道)。
你可以額外的肯定和自己逃生的字符串:
CGI.escape your_link_url
鏈接:CGI.escape
我在呈現它們時遇到問題:「URI :: InvalidURIError」。 – user502052 2012-01-11 11:09:54
@ user502052:當你渲染他們逃跑或按原樣? – 2012-01-11 11:11:06
我渲染「原樣」。 – user502052 2012-01-11 11:12:30
您可以使用正則表達式來驗證它沒有 '<', '>' URL有效的URL。並且HTML將它編碼到適用的地方。
你是什麼意思,「HTML編碼它在哪裏適用」? – user502052 2012-01-11 11:11:15
如果您顯示的是用戶的鏈接,則需要對其進行HTML編碼,以避免腳本執行。 – ysrb 2012-01-11 12:12:01
我想通過避免存儲「惡意」鏈接來解決底層問題。 – user502052 2012-01-11 12:16:00
輸入驗證就是這種需要停止;擴展你的驗證,以包括更多的長度檢查。這與數據庫無關。請記住,稍後在輸出中使用存儲的值時,還需要執行輸出編碼。請參閱https://www.owasp.org/index.php/XSS_(Cross_Site_Scripting).p_vention_Cheat_Sheet – Cheekysoft 2012-01-11 14:44:17