2016-05-25 4 views
0

私はPostgreSQLにメールテンプレートを保存しています。これにより、ユーザは送信メールを編集できるようになります。私はLiquidを使ってサーバー上でコードが実行されないようにしています。 dbから電子メールテンプレートをフェッチして解析し、それをレンダリングして液体テンプレートをマーシャリングしたいと考えています。ここでこれを行うためのコードは次のとおりです。DBに裏付けされた液体テンプレートとMarshal.loadのセキュリティ上の懸念

# Saving template to the db 
text = "template text from possibly dangerous user {{stuff}}" 
template = Liquid::Template.parse(text) 
email_template = EmailTemplate.new # the db class 
email_template.source = Marshal.dump(template) 
email_template.save 

# time goes by and now we need that template 
template = Marshal.load(email_template.source) # !! Is this dangerous? !! 

私はMarshal.loadにより、リモートでコードが実行される可能性ができることを読みました。私はLiquid :: Templateオブジェクトをマーシャリングするつもりですが、これには恐ろしいユーザーが提供するデータが含まれています。私が気づく必要があるセキュリティ上の考慮事項はありますか?

答えて

1

理論上はです。実装上のセキュリティ上の問題です。 Ruby documentationから

設計することにより、::負荷が Rubyのプロセスにロードされたほぼすべてのクラスをデシリアライズすることができます。多くの場合、 マーシャルデータが信頼できないソースからロードされていると、リモートでコードが実行される可能性があります。

結果:: :: loadは汎用シリアル化 形式には適しておらず、ユーザーが入力した入力またはその他の信頼できないデータをアンマーシャリングしないでください。

あなたが信頼できないデータをデシリアライズする必要がある場合は、JSONまたは単純にロードすることができるだけで別の シリアル化形式を使用する、などの文字列、配列、ハッシュ、として「原始的」 種類が へのユーザ入力が任意に指定できるように決してデシリアライズする型。

実際には、あなたのケースでは、悪意のある入力がLiquidによって処理されるため、正常に処理する必要があります。

あなたのテンプレートは単純なテキストなので、私はシリアライズ/デシリアライズの理由は全く分かりません。シリアライズ/デシリアライズ時のパフォーマンスの低下もあります。

+0

ありがとうございました。上記を達成する別の選択肢がありますか? – bennick

+0

@bennick申し訳ありませんが、私の最後の行を逃した。今すぐ追加しました。 – Agis

+0

よかったです。 Marshal.loadプロセス中にLiquid :: Templateオブジェクトを使用してリモートコード例外が "リーク"する可能性があるかどうかはわかりませんでした。 – bennick

関連する問題