在我的博客上,我使用表格/ posts /
中的网址如果另一个网站链接到我的某个博文,其中包含的网址不正确,包含无效的UTF-8字符,我会收到以下异常:
Blog::PostsController# (ActiveRecord::StatementInvalid) "PG::Error: ERROR: invalid byte sequence for encoding \"UTF8\": 0xb0\n: SELECT \"posts\".* FROM \"posts\" WHERE (slug like 'Examp\xB0le-blog-post') LIMIT 1"
应对这类问题的最佳做法是什么? 在查询数据库之前,我应该检查编码吗?我应该抓住那些例外吗?
答案 0 :(得分:0)
在查询数据库之前检查编码。最佳做法是确保您没有运行产生错误的查询。
在查询之前不检查输入不仅可能引发错误,而且是一个安全漏洞。
关于UTF-8字符;同时将# encoding: UTF-8
添加到.rb
文件中(这是一个应该在Ruby 2.0.0中修复的问题)。正如 MrYoshiji 指出的那样。
关于数据库安全性:
不是将字符串传递给conditions选项,而是可以传递一个数组来清理受污染的字符串,如下所示:
Model.where("login = ? AND password = ?", entered_user_name, entered_password).first
如您所见,数组的第一部分是带有问号的SQL片段。数组第二部分中的变量的已清理版本替换了问号。或者您可以传递相同结果的哈希值:
Model.where(:login => entered_user_name, :password => entered_pas
数组或哈希表单仅在模型实例中可用。您可以在其他地方尝试
sanitize_sql()
。养成在SQL中使用外部字符串时考虑安全性后果的习惯。
See here原始文档。