簡體   English   中英

Rails查詢生成oci:error引用的字符串錯誤終止

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM