0

在我的博客上,我使用 /posts/ 形式的 url

如果另一个网站使用包含无效 UTF-8 字符的错误 URL 链接到我的一篇博客文章,我会收到如下异常:

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"

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

4

1 回答 1

0

在查询数据库之前检查编码。最佳做法是确保您没有运行会产生错误的查询。

在查询之前不检查输入不仅可能引发错误而且是一个安全漏洞。

关于 UTF-8 字符;随着添加# encoding: UTF-8.rb文件中(这是一个问题,应该从 Ruby 2.0.0 开始修复)。正如Yoshiji 先生所指出的那样。

关于数据库安全:

除了将字符串传递给条件选项之外,您还可以传递一个数组来清理受污染的字符串,如下所示:

Model.where("login = ? AND password = ?", entered_user_name, entered_password).first

如您所见,数组的第一部分是一个带有问号的 SQL 片段。数组第二部分中变量的净化版本替换了问号。或者您可以为相同的结果传递一个哈希:

Model.where(:login => entered_user_name, :password => entered_pas

数组或散列形式仅在模型实例中可用。你可以sanitize_sql()在别处试试。养成在 SQL 中使用外部字符串时考虑安全后果的习惯。

有关原始文档,请参见此处

于 2013-05-01T14:54:58.927 回答