2012-01-11 25 views
0

我正在使用Ruby on Rails 3.1.0,我想知道什麼是防止將「惡意」值存儲在數據庫。有一種常見的做法來拒絕「惡意」用戶輸入到rails應用程序

例如,我有一個數據庫表的列意味着存儲的URL。通過驗證(只是長度檢查)的用戶可以提交一個URL,如http://<script>alert('hello!');</script>我想不要存儲像上面的鏈接...我該怎麼做?

+1

輸入驗證就是這種需要停止;擴展你的驗證,以包括更多的長度檢查。這與數據庫無關。請記住,稍後在輸出中使用存儲的值時,還需要執行輸出編碼。請參閱https://www.owasp.org/index.php/XSS_(Cross_Site_Scripting).p_vention_Cheat_Sheet – Cheekysoft 2012-01-11 14:44:17

回答

3

正確的事情做的是使用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 
+0

現在,這是正確的答案:-) – 2012-01-11 12:20:58

+0

@Sergio:我討厭解析,所以我聘請真正的懶惰,讓別人爲我做,它是超級有效的。 – 2012-01-11 19:57:10

1

雖然這些鏈接在數據庫中,但它們沒有任何傷害。當您嘗試渲染它們時可能會出現問題。 Rails在逃避你輸出的大多數事情方面做得很好(我不敢說「一切」,因爲我不知道)。

你可以額外的肯定和自己逃生的字符串:

CGI.escape your_link_url 

鏈接:CGI.escape

+0

我在呈現它們時遇到問題:「URI :: InvalidURIError」。 – user502052 2012-01-11 11:09:54

+0

@ user502052:當你渲染他們逃跑或按原樣? – 2012-01-11 11:11:06

+0

我渲染「原樣」。 – user502052 2012-01-11 11:12:30

0

您可以使用正則表達式來驗證它沒有 '<', '>' URL有效的URL。並且HTML將它編碼到適用的地方。

+0

你是什麼意思,「HTML編碼它在哪裏適用」? – user502052 2012-01-11 11:11:15

+0

如果您顯示的是用戶的鏈接,則需要對其進行HTML編碼,以避免腳本執行。 – ysrb 2012-01-11 12:12:01

+0

我想通過避免存儲「惡意」鏈接來解決底層問題。 – user502052 2012-01-11 12:16:00

相關問題