[英]rails query generates oci:error quoted string incorrectly terminated
我在應用程序中有以下代碼(非常舊):
results << User.all(
:select => "'#{entry.name}' AS user_name, '#{entry.lastname}, #{entry.firstname}' AS user_full_name, display_name",
:order => "display_name")
它生成以下查詢,我得到以下oci錯誤:
OCIError: ORA-01756: quoted string not properly terminated:
SELECT 'theupsstore2579' AS user_name, 'O'Brien, Perry' AS user_full_name, display_name FROM "Users" WHERE..
有沒有解決我的查詢的好方法?
使用quote_string是一個好方法
是的,有一個好方法。 您永遠不要在SQL查詢中使用插值字符串,例如"string bit #{interpolated_bit}"
-這對安全性非常不利,並會導致SQL注入攻擊。
在這種情況下-因為其中一個名稱包含一個'
字符(在姓氏O'Brien
-並且一旦將該值插入您的SQL字符串中,它將像對待任何'
字符一樣對待它並結束該字符串-即使'
(即Brien
位)之后還有更多
然后,這會導致數據庫出現語法錯誤。
但是-以這種方式使用內插字符串也使您可以進行SQL注入-如果有人鍵入'; DROP TABLE users;
'; DROP TABLE users;
(或等效名稱)進入其姓氏字段? 然后您的代碼愉快地將其放入SQL並運行了? 您使用插值字符串的方式並不安全。 不過Rails提供是安全的替代品-他們是你應該總是用什么。
例如內置的arel方法( where
select
order
等),並使用經過消毒的方法?
語法而不是
results << User.all(
:select => "'#{entry.name}' AS user_name, '#{entry.lastname}, #{entry.firstname}' AS user_full_name, display_name",
:order => "display_name")
你可以嘗試
results << User.select("'?' AS user_name, '?, ?' AS user_full_name, display_name", entry.name, entry.lastname, entry.firstname).order("display_name")
(盡管我質疑為什么要強制所有用戶使用相同的名稱-您是否真的希望這些條件成為僅選擇具有這些名稱的用戶的條件?)
我強烈建議您通讀所有的Rails指南。 在這種情況下,尤其是有關如何使用Active Record查詢的一種 :
並且您可能還需要閱讀安全指南-特別是在這種情況下, Rails指南的SQL注入部分
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.