Skip to content

Commit faf751b

Browse files
committed
security: _dojo.html.erb 内の dojo.url を安全化して XSS を防止
1 parent 99a6421 commit faf751b

File tree

2 files changed

+15
-2
lines changed

2 files changed

+15
-2
lines changed

app/models/dojo.rb

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,19 @@ def active?
8989
def active_at?(date)
9090
created_at <= date && (inactivated_at.nil? || inactivated_at > date)
9191
end
92+
93+
# URLの安全性をチェックして、安全なURLを返す
94+
def safe_url
95+
return '#' if url.blank?
96+
97+
# URI.parseがエラーになるか、HTTPスキームでない場合は'#'を返す
98+
begin
99+
uri = URI.parse(url)
100+
uri.scheme&.match?(/\Ahttps?\z/) ? url : '#'
101+
rescue URI::InvalidURIError
102+
'#'
103+
end
104+
end
92105

93106
# 再活性化メソッド
94107
def reactivate!

app/views/shared/_dojo.html.erb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
<li class="dojo" id="<%= dojo.name %>">
22
<header>
3-
<%= link_to lazy_image_tag(dojo.logo, alt: "CoderDojo #{dojo.name}", class: 'dojo-picture'), dojo.url,
3+
<%= link_to lazy_image_tag(dojo.logo, alt: "CoderDojo #{dojo.name}", class: 'dojo-picture'), dojo.safe_url,
44
target: "_blank", rel: "external noopener" %>
55
<span class="dojo-name">
6-
<%= link_to "#{dojo.name} (#{dojo.prefecture.name})", dojo.url, target: "_blank", rel: "external noopener" %>
6+
<%= link_to "#{dojo.name} (#{dojo.prefecture.name})", dojo.safe_url, target: "_blank", rel: "external noopener" %>
77
<% if not dojo.counter == 1 %>
88
<span class="dojo-counter"
99
data-original-title="道場数"

0 commit comments

Comments
 (0)