我有一个使用此代码的show视图:
%ul.pager
%li.pull-left{ class: ('disabled' if collection_of_all_topics.index(@topic).zero?) }
= link_to t('.previous_topic_html'), previous_topic(collection_of_all_topics, @topic)
%li.pull-right{ class: ('disabled' if collection_of_all_topics.index(@topic).zero?) }
= link_to t('.next_topic_html'), next_topic(collection_of_all_topics, @topic)
当我尝试执行brakeman -q
命令时,我收到以下两个警告:
Medium | topics/show (TopicsController#show) | Cross Site Scripting | Unsafe model attribute in link_to href near line 29: link_to(t(".previous_topic_html"), previous_topi>>
| Medium | topics/show (TopicsController#show) | Cross Site Scripting | Unsafe model attribute in link_to href near line 31: link_to(t(".next_topic_html"), next_topic(+Topic>>
对于link_to方法的path参数,我有一组逻辑,用于计算位于topic_helper.rb文件中的下一个和上一个主题:
module TopicsHelper
def next_topic?(collection_of_all_topics, topic)
!(topic == collection_of_all_topics.last)
end
def next_topic(collection_of_all_topics, topic)
return '' unless next_topic?(collection_of_all_topics, topic)
topic_path(collection_of_all_topics[(collection_of_all_topics.index(topic) + 1)])
end
def previous_topic(collection_of_all_topics, topic)
topic_path(collection_of_all_topics[(collection_of_all_topics.index(topic) - 1)])
end
end
我已经在安全部分使用XSS对Rails指南进行了一些阅读,但我仍然不了解这里的问题,或者更重要的是如何修复它。我已经尝试过这些方法来修复错误:
= h(link_to t('.previous_topic_html'), previous_topic(collection_of_all_topics, @topic))
= sanitize(link_to t('.previous_topic_html'), previous_topic(collection_of_all_topics, @topic))
= link_to t('.previous_topic_html'), sanitize(previous_topic(collection_of_all_topics, @topic))
= link_to t('.previous_topic_html'), h(previous_topic(collection_of_all_topics, @topic))
这些实现仍会导致警告。为什么这是一个警告,我该如何解决这个问题?
答案 0 :(得分:4)
Brakeman抱怨,因为您正在视图中访问@topic
的属性。 TopicsHelper可能会触发它吗?看看他们的解释here。 IMO,Brakeman在这个问题上有点过于敏感。如果你真的担心,消毒应该可以解决问题。这里的危险是最终用户可以操纵链接中的@topic id并访问其他主题。这对你来说是个问题吗?
在Brakeman github issues上查看此问题。
另见issue。
TLDR;这可能是误报,应该被忽略。