[Rails]where 메서드의 "⇔ 63;(자리 표시자)
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열을 포함하는enumArticleモデル内において下記は同義
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 설명서
Reference
이 문제에 관하여([Rails]where 메서드의 "⇔ 63;(자리 표시자)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://zenn.dev/yusuke_docha/articles/f04fb2cbd22508텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)