Files
danbooru/app/helpers/posts_helper.rb
evazion a38e12f091 Fix XSS in source link on post show page.
This vulnerability allows someone to create a source link that appears
to lead to Pixiv like normal, but that actually executes Javascript code
when clicked.

1) Set the source of a post to javascript:"http://img1.pixiv.net/img/xss/";alert("xss");
2) Wait for someone to click the source link in the Information sidebar.
3) Profit.

The cause is that the regexes for detecting Pixiv URLs aren't anchored
to the front of the string using \A. This allows non-http:// links to be
created.
2014-10-17 15:15:48 -05:00

86 lines
2.8 KiB
Ruby

module PostsHelper
def resize_image_links(post, user)
links = []
if post.has_large?
links << link_to("L", post.large_file_url, :id => "large-file-link")
end
if post.has_large?
links << link_to("O", post.file_url, :id => "original-file-link")
end
if links.any?
content_tag("span", raw("Resize: " + links.join(" ")))
else
nil
end
end
def post_source_tag(post)
if post.source =~ %r!\Ahttp://img\d+\.pixiv\.net/img/([^\/]+)/!i
text = "pixiv/<wbr>#{wordbreakify($1)}".html_safe
source_search = "source:pixiv/#{$1}/"
elsif post.source =~ %r!\Ahttp://i\d\.pixiv\.net/img\d+/img/([^\/]+)/!i
text = "pixiv/<wbr>#{wordbreakify($1)}".html_safe
source_search = "source:pixiv/#{$1}/"
elsif post.source =~ %r{\Ahttps?://}i
text = post.normalized_source.sub(/\Ahttps?:\/\/(?:www\.)?/i, "")
text = truncate(text, length: 20)
source_search = "source:#{post.source.sub(/[^\/]*$/, "")}"
end
# Only allow http:// and https:// links. Disallow javascript: links.
if post.normalized_source =~ %r!\Ahttps?://!i
source_link = link_to(text, post.normalized_source)
else
source_link = truncate(post.source, :length => 100)
end
if CurrentUser.is_builder? && !source_search.blank?
source_link + "&nbsp;".html_safe + link_to("&raquo;".html_safe, posts_path(:tags => source_search))
else
source_link
end
end
def post_favlist(post)
post.favorited_users.reverse_each.map{|user| link_to_user(user)}.join(", ").html_safe
end
def has_parent_message(post, parent_post_set)
html = ""
html << "This post belongs to a "
html << link_to("parent", posts_path(:tags => "parent:#{post.parent_id}"))
html << " (deleted)" if parent_post_set.parent.first.is_deleted?
sibling_count = parent_post_set.children.count - 1
if sibling_count > 0
html << " and has "
text = sibling_count == 1 ? "a sibling" : "#{sibling_count} siblings"
html << link_to(text, posts_path(:tags => "parent:#{post.parent_id}"))
end
html << " (#{link_to("learn more", wiki_pages_path(:title => "help:post_relationships"))}) "
html << link_to("&laquo; hide".html_safe, "#", :id => "has-parent-relationship-preview-link")
html.html_safe
end
def has_children_message(post, children_post_set)
html = ""
html << "This post has "
text = children_post_set.children.count == 1 ? "a child" : "#{children_post_set.children.count} children"
html << link_to(text, posts_path(:tags => "parent:#{post.id}"))
html << " (#{link_to("learn more", wiki_pages_path(:title => "help:post_relationships"))}) "
html << link_to("&laquo; hide".html_safe, "#", :id => "has-children-relationship-preview-link")
html.html_safe
end
end