我正在使用Ruby on Rails 3.1.0,我想知道防止在数据库中存储“恶意”值的常见做法。
例如,我有一个数据库表列,用于存储URL。通过验证(只是长度检查)的用户可以提交http://<script>alert('hello!');</script>
之类的网址。 我不允许存储上述链接...... 我该如何制作?
答案 0 :(得分: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
答案 1 :(得分:1)
虽然这些链接在数据库中,但它们没有任何危害。尝试渲染它们时可能会出现问题。 Rails在逃避你输出的大部分内容方面做得很好(我不敢说“一切”,因为我不确定)。
你可以更加确定并自己逃避一个字符串:
CGI.escape your_link_url
链接:CGI.escape
答案 2 :(得分:0)
您可以使用正则表达式验证它是否为有效的网址,而不包含&#39;&lt;&#;,&#39;&gt;&#39;网址。 HTML将其编码在适用的位置。