[Rails]where 메서드의 "⇔ 63;(자리 표시자)

14903 단어 Railstech

where 방법의 "⇔63;무엇


published.where('published_at < ?', Time.current)
결론?은 점위부호라고 불리며 두 번째 파라미터로 지정된 값으로 바뀐다
즉, Time.current에서 얻은 현재 시간과 ?의 값을 비교하여 published_at로 검색한 것이다.

where 방법


이것은 표 조건에 부합되는 기록을 수조 형식으로 얻을 수 있는 방법이다
find 및 findby 방법은 하나의 취득,where가 조건에 부합되는 모든 기록을 얻는 것이다
モデル名.where("条件")

기본적인 기술 방법


SQL 주입을 방지하기 위해서, 기본적으로 하나의 조건에서 검색할 때,where (열 이름: 조건) 처럼 기호 지정으로 정의합니다.
User.where(name: "太郎")
# => nameカラムが太郎のレコードを取得

SQL 주입


SQL 주입은 SQL을 호출할 때 안전상의 결함을 이용하여 데이터베이스 데이터를 불법으로 조작하는 공격 방법을 가리킨다
예제)
id = params[:id]
User.where("id = #{id}")
사용자 id가 1인 사용자를 가정하면 다음과 같은 SQL을 발행한다
SLECT 'users'.* FROM 'users' WHERE (id = 1)
사용자 id는 1명의 기록을 얻을 수 있습니다
다만, 이 부분의 값이 1OR1=1인 모드를 살펴보자
id = '1 OR 1 = 1'
User.where("id = #{id}")
다음과 같은 SQL 릴리즈
SLECT 'users'.* FROM 'users' WHERE (id = 1 OR 1 = 1)
OR에 따라 id=1과 1=1이라는 두 공식을 판정한다
SQL에서 WHERE에 실제로 전달되면 모든 레코드가 제공됩니다.
이 때 1=1의 공식이 진실로 판단되어 모든 기록이 획득됩니다
이렇게 되면 모든 사용자의 데이터가 확보되기 때문에 안전상 매우 위험하다
만약 대책으로 산열 형식으로 기술한다면 방지할 수 있다
User.where(id: id)

SELECT `users`.* FROM `users` WHERE `users`.`id` = 1
또는 자리 표시자 사용

복잡한 검색(자리 표시자)


기본적인 사용법
User.where("kind > ?", 1)
kind는 1보다 큰 모든 사용자를 얻을 수 있습니다
자리 표시자 시도?두 번째 매개 변수 1과 교체,kind와 비교 검색
복잡한 예를 하나 더 들다
app/models/article.rb
published.where('published_at < ?', Time.current)
※ published는 아티클 모형에서 enum형으로 정의됨
class Article < ApplicationRecord

	enum state: { draft: 0, published: 1,  waiting_for_publication: 2}

end
published는 모든published 대상의state열을 포함하는enum
Articleモデル内において下記は同義

published
Article.published
self.published

=> [#<Article:0x00007f9ffb5e77f0
  id: 5,
  category_id: 1,
  author_id: nil,
  uuid: "95d9e832-822f-4db1-aaf7-8f9d9e68c71e",
  slug: "slug",
  title: "例",
  description: "例",
  body: "",
  state: "published",
  published_at: Thu, 26 Aug 2021 20:18:00 JST +09:00,
  created_at: Tue, 24 Aug 2021 20:15:54 JST +09:00,
  updated_at: Wed, 25 Aug 2021 17:27:43 JST +09:00,
  deleted_at: nil>,
 #<Article:0x00007f9ffb5e7660
  id: 6,
  category_id: 1,
  author_id: nil,
  uuid: "abbbc8d5-d37c-44a9-9f14-de8f4796519a",
  slug: "例",
  title: "例",
  description: "",
  body: "",
  state: "published",
  published_at: Wed, 25 Aug 2021 17:46:00 JST +09:00,
  created_at: Wed, 25 Aug 2021 17:45:44 JST +09:00,
  updated_at: Wed, 25 Aug 2021 17:53:55 JST +09:00,
  deleted_at: nil>]
상술한 기술 방법을 점위부호라고 하는데 이런 문법도 SQL 입력을 방지하는 문법이다

자리 차지 문자의 묘사 방법과 총결


아까 예예요.
published.where('published_at < ?', Time.current)
<는 자리 차지 문자로 불리며 두 번째 파라미터로 지정된 값으로 바뀐다
상술한 예에서 현재 시간?을 얻는 등 변수가 자주 있다
주의 Time.current 사용 시 쓸 수 없음?즉, where(カラム名: "条件"에서 얻은 현재 시간과 Time.current의 값을 비교하여 ?로 검색한 것이다.

참고 자료


Active Record 쿼리 인터페이스 - Rils 설명서

좋은 웹페이지 즐겨찾기