다음 코드가 있습니다.
class Product < ActiveRecord::Base
validates :title, :description, :image_url, presence: true
validates :price, numericality: {greater_than_or_equal_to: 0.01}
validates :title, uniqueness: true
validates :image_url, allow_blank: true, format: {
with: %r{\.(gif|jpg|png)$}i,
message: 'URL must point to GIT/JPG/PNG pictures'
}
end
작동하지만 “rake test”를 사용하여 테스트하려고하면 다음 메시지가 표시됩니다.
rake aborted!
The provided regular expression is using multiline anchors (^ or $), which may present a security risk. Did you mean to use \A and \z, or forgot to add the :multiline => true option?
무슨 뜻이에요? 어떻게 고칠 수 있습니까?
답변
답변
이 경고는 유효성 검사 규칙이 자바 스크립트 삽입에 취약하기 때문에 발생합니다.
귀하의 경우 \.(gif|jpg|png)$
에는 줄 끝까지 일치합니다. 따라서 규칙은이 값 pic.png\nalert(1);
을 true로 확인 합니다.
"test.png\n<script>alert(1)</script>" === /\.(gif|jpg|png)$/i
# => true
"test.png\n<script>alert(1)</script>" === /\.(gif|jpg|png)\z/i
# => false
전략 읽기 :
답변
문제 정규식은 고안이 아니라 config / initializers / devise.rb에 있습니다. 변화:
# Regex to use to validate the email address
config.email_regexp = /^([\w\.%\+\-]+)@([\w\-]+\.)+([\w]{2,})$/i
에:
# Regex to use to validate the email address
config.email_regexp = /\A([\w\.%\+\-]+)@([\w\-]+\.)+([\w]{2,})\Z/i
답변
경고는 다음과 같은 문자열이 유효성 검사를 통과하지만 원하는 것이 아닐 수도 있음을 알려줍니다.
test = "image.gif\nthis is not an image"
re = /\.(gif|jpg|png)$/i
re.match(test) #=> #<MatchData ".gif" 1:"gif">
^
및 둘 다 $
문자열의 시작 / 끝이 아닌 모든 행의 시작 / 끝 과 일치합니다. \A
그리고 \z
각각 전체 문자열의 시작과 끝을 일치시킵니다.
re = /\.(gif|jpg|png)\z/i
re.match(test) #=> nil
경고의 두 번째 부분은 ( “또는 추가하는 것을 잊었다 : 여러 => 진정한 옵션”참조) 실제로의 동작을 원한다면 당신을 말하고있다 ^
그리고 $
당신은 단순히 지나가는 경고를 침묵 수있는 :multiline
옵션을 선택합니다.
답변
루비가 보안을 위해 기호 \z
대신 보길 원한다면 $
코드는 다음과 같을 것입니다 :
validates :image_url, allow_blank: true, format: {with: %r{\.(gif|jpg|png)\z}i, message: 'URL must point to GIF, JPG, PNG.'}
답변
