1

私のCMSアプリケーションでは、gsubを使用して、ユーザーが指定したhtmlテンプレート(文字列)の一部をアプリケーションの動的コード(ユーザーからのコメントやページコンテンツなど)に置き換えています。Rails 3への移行に備えて、Rails 2.3.5から2.3.12にアップグレードし、rails_xss gemをインストールして、文字列を並べ替えようとしています。

文字列を別の文字列(テンプレート)にgsubして、着信文字列を安全ではないものとして扱い、テンプレートセクションを安全なものとして扱う方法があるかどうか疑問に思っていますか?

私はすでにこれを再考し、おそらく関心のある領域の周りにテンプレートを分割し、ギャップに動的ビットを挿入して、レンダリングされるさまざまな安全な文字列と安全でない文字列の配列として全体を渡す必要があることをすでに感じています。それは正しい道のように聞こえますか?

アップデート

これが私が現在していることの例です。レイアウトから呼び出されるのはヘルパーです。テーマはデータベースから取得されます。これは、実際のコンテンツに置き換えようとしている特定のHTMLコメントを含む単なる文字列です。

final_theme.gsub!('<body>', '<body>' + (render '/user_bars/user_bar'))
final_theme.gsub!('</body>', (render '/theme/google_analytics') + '</body>') if SiteSetting.first.google_analytics_code.present?
final_theme.gsub!('<!--THEME_MetaTitle-->', (render '/theme/meta_title'))
final_theme.gsub!('<!--THEME_Breadcrumbs-->', (render '/theme/breadcrumbs'))
final_theme.gsub!('<!--THEME_Footer-->', (render '/theme/footer'))
final_theme.gsub!('<!--THEME_Body-->', (render '/theme/body'))

これらは単純なケースであり、実際のパラメータを含むコメントもあります(たとえば、インデックスバーを描画するための深さのレベルを指定しますが、ページには多くのレベルがある可能性があります)。scanを使用して詳細を検索し、gsubを再度使用してコメントを実際のインデックスバーコードに置き換えます。

これは私のコードの領域であり、私をまったく満足させないので、私はリファクタリングのアドバイスを完全に受け入れています。

4

2 に答える 2

1

(NZKozのものではなく)rails / rails_xssから最新のプラグインをインストールした後、SafeBufferのgsubingが許可されていないというエラーが発生し始めました。けっこうだ :)

私はこれを代替案として考え出し、誰かがその正しさを保証できる場合は、これを正解として受け入れます。

final_theme = final_theme.html_safe

final_theme = final_theme.split('<!--THEME_Breadcrumbs-->').inject do |output, piece| 
  output + render('/theme/breadcrumbs') + piece
end

これは単なる抜粋ですが、基本的に元のテーマを安全としてマークし(安全であるため)、関心のある部分を分割し、文字列を連結して新しいコードをミックスに挿入し、html_safenessを確保します!

于 2011-06-30T04:34:47.503 に答える
0

Rails 3の最近のリリースの1つ(3.0.7または3.0.8だと思います)で、この問題に関する多くのセキュリティ問題が修正されたと思います(現時点ではコミットを見つけることができませんが)。

ユーザー入力をGsubbingすることは、コードの臭いのように感じます。おそらく、コードを提供して、それをリファクタリングすることを検討できますか?

于 2011-06-27T09:07:30.080 に答える