質問: Rails5.1でcarrierwaveを使って画像をアップロードする機能を作成しました。 バリデーションとしては * 拡張子チェック(画像ファイルだけ) * ファイルサイズ制限 ユーザ ユーザー登録済みであれば編集ページから自分の画像としてアップロードできます。 保存場所は * public/uploads以下 アクセスは * http://ドメイン/uploads/xxx/xxx/ファイル名でブラウザでアクセス可能。画像が表示される。 * /uploads/xxx/xxx/ のパスは htmlのimageタグのsrc属性に書かれていて誰でも参照できます。 この時、セキュリティ的に脆弱性はあるのでしょうか? 画像に扮して攻撃コードを挿入して被害がでることがあるのでしょうか? 被害が出る場合どのようにして防げばよいのでしょうか??? 宜しくおねがいします。
回答: ご提示いただいた情報だけでは確たることは言えないのですが、気になったポイントのみ指摘します。 (1)ファイル名の付け替えはしているか? たとえば、利用者が foo.php.png というファイル名で画像ファイルをアップロードした場合に、サーバー上のファイル名が foo.php.png のままというケースでは、このファイルがPHPスクリプトとして認識される可能性があります。詳しくは以下の記事をお読みください。 Apacheの多重拡張子にご用心 対策は上記記事に書いています。 (2)画像ファイルによるXSS 画像の拡張子を検証しているということですが、Content-Typeは大丈夫でしょうか?Content-Typeが間違っていると、画像ファイルがtext/htmlと認識されて、画像ファイル中のJavaScriptが動いてしまうことはあり得ます。 IE7までですと、対策が結構めんどうだったのですが、IE7以前はサポートしない前提なら、以下のレスポンスヘッダを出しておくと、安全性が高まります。Content-Typeは正しいというのが前提です。 ``` X-Content-Type-Options: nosniff ``` サイトの脆弱性診断をしたわけではないので、「安全です」とか「問題ありません」とは言えません。心配ならば、専門家の診断を受けることをお勧めします。画像のアップロードは脆弱性が入り込みやすい箇所です。