2013-05-01 149 views
0

在我的博客,我在表格/職位所使用的網址/編碼錯誤導致的Postgres錯誤

如果其他網站鏈接到我的博客文章之一,包含不正確的URL無效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

只要確定,你是**不是**像這樣查詢PGsql:'Post.where(「slug like'#{params [:search]}'」)'?如果是,則使用Post.where(「slug like'?'」,params [:search])'代替。 – MrYoshiji 2013-05-01 14:58:46

+0

感謝提醒我,但是我使用的是非危險/愚蠢的方式:) – soulnafein 2013-05-02 09:13:28

+0

您是否試圖將'#編碼:UTF-8'放在PostsController的最頂端? http://stackoverflow.com/questions/16322433/encoding-and-utf-8-exceptions-after-upgrade-to-ruby-1-9-3-and-rails-3-2/16324815#16324815 – MrYoshiji 2013-05-02 13:26:02

回答

0

在查詢數據庫之前檢查編碼。最佳做法是確保您沒有運行產生錯誤的查詢。

查詢前不檢查輸入不僅可能引發錯誤,而且是安全漏洞。

關於UTF-8字符;除了將# encoding: UTF-8添加到.rb文件(這是一個與Ruby 2.0.0相關的問題)。正如MrYoshiji所指出的那樣。

關於數據庫安全:

不是傳遞一個字符串條件的選項,你可以傳遞一個數組來淨化受污染的字符串是這樣的:

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

+0

如果你可以請提供一個更具體的答案,例如在這個特定的情況下檢查什麼來確定編碼是否正確,我會選擇你的答案。 – soulnafein 2013-05-02 09:14:54

+0

我應該檢查字符串與無效編碼?什麼是檢查他們是utf-8的方法? – soulnafein 2013-05-07 10:56:30