0

そのため、ActionView に存在する非常に貧弱なドキュメント、特にselect_tagビュー ファイルから呼び出されたときに呼び出されるメソッドについて調べてきました。おそらく、次のように呼び出されます。

select_tag name, option_tags, options

ドキュメンテーションは、についてはまったく何も述べておらず、 についてはnameほとんど何も述べておらず、 を他の関数から取得する必要がある不透明な値として扱う例を通してのみoptions説明しています。option_tags

いつものように、Rails について何かを学ぶ唯一の方法は、Rails をリバース エンジニアリングすることです。

Ruby では、最初にクラスとオブジェクトを作成しない限り、モジュールで定義されたメソッドを呼び出すことができないため、Rails コンソールから直接実行してみました。

class H
  include ActionView::Helpers::FormOptionsHelper
  include ActionView::Helpers::FormTagHelper
end

H.new.options_for_select ["foo","bar"]

上記の の使用法は、options_for_select他の誰かが書いた実際のコードから来ています。戻り値は文字列です:

"<option value=\"foo\">foo</option>\n<option value=\"bar\">bar</option>"

どうやら、option_for_select(または ActiveRecord オブジェクトから HTML タグを生成するなど、私が話したくはない複雑さを導入する他の多くの関連関数の 1 つ) からの戻り値を のoption_tagパラメーターとして渡すことになっているようですselect_tag。その文字列をクリップボードにコピーして関数呼び出しに直接貼り付けた場合を除き、期待どおりの結果は得られません。

H.new.select_tag :my_name, "<option value=\"foo\">foo</option>\n<option value=\"bar\">bar</option>"

戻り値:

"<select name=\"my_name\" id=\"my_name\">&lt;option value=&quot;foo&quot;&gt;foo&lt;/option&gt;\n&lt;option value=&quot;bar&quot;&gt;bar&lt;/option&gt;</select>"

少なくとも、これにより、nameパラメーターの目的が明らかになります。

さらに奇妙なことに、コンソールに出力せずに戻り値を直接渡すと、テキストはエスケープされません。select_tag

H.new.select_tag :name, H.new.options_for_select(["foo","bar"])

戻り値:

"<select name=\"name\" id=\"name\"><option value=\"foo\">foo</option>\n<option value=\"bar\">bar</option></select>"

ここでWTFが行われていますか?

4

1 に答える 1

0

この質問を書きながら、私はその答えにたどり着きました。Ruby は私に嘘をついています (いつものように)。

評価する場合:

H.new.options_for_select ["foo","bar"]

Ruby は、結果が String であったことを示しています。しかし、それは Pry と Irb の両方が静か.to_sにすべてを呼び出しており、返されるものにoptions_for_selectto_s. 真実:

(H.new.options_for_select ["foo","bar"]).class
=> ActiveSupport::SafeBuffer
ActiveSupport::SafeBuffer.new("<foo>")
=> "<foo>"

したがって、これらのメソッドを作成した人は誰でも、ユーザーが提供する生の文字列をタグに組み込みたいと考えて<select>おり、それらの文字列には HTML/JavaScript インジェクションの試みが含まれている可能性があるため、エスケープする必要があります。

ActiveView はすべての文字列を疑わしいものとして扱いますが、特定の文字列をActiveSupport::SafeBuffer.

于 2017-05-24T23:05:51.930 に答える