网址中的编码错误会导致Postgres错误

时间:2013-05-01 14:48:33

标签: ruby-on-rails

在我的博客上,我使用表格/ 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"

应对这类问题的最佳做法是什么? 在查询数据库之前,我应该检查编码吗?我应该抓住那些例外吗?

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原始文档。