Rails | ファイル名をサニタイズする方法

Railsでファイル名をサニタイズする方法

Railsでアップロードされたファイルのファイル名を安全に扱うためには、サニタイズ(文字列を無害化する)する必要があります。ファイル名には、不正な文字や記号が含まれることがあるため、そのまま扱うとセキュリティ上のリスクにつながる可能性があります。

Railsでは、ActiveStorageを使ってアップロードされたファイルを扱うことができます。ActiveStorage::Filename.newメソッドを使うことで、ファイル名を扱いやすい形式に変換することができます。そして、sanitizedメソッドを使うことで、ファイル名をサニタイズすることができます。

ActiveStorage::Filename.newメソッド

ActiveStorage::Filename.newメソッドを使うことで、アップロードされたファイルのファイル名を扱いやすい形式に変換することができます。ファイル名の変換は、ASCII文字列に変換されます。

Ruby
filename = ActiveStorage::Filename.new("ファイル名")
puts filename #=> #<ActiveStorage::Filename:0x00007f98aa011858 @name="ファイル名", @extension=nil>

このように、ActiveStorage::Filename.newメソッドを使うことで、ファイル名を扱いやすい形式に変換することができます。この変換されたファイル名に対して、sanitizedメソッドを適用することで、ファイル名をサニタイズすることができます。

sanitizedメソッド

sanitizedメソッドを使うことで、ファイル名をサニタイズすることができます。このメソッドを適用することで、ファイル名に含まれる不正な文字や記号を置換することができます。

Ruby
filename = ActiveStorage::Filename.new("不正な/ファイル名?です")
sanitized_filename = filename.sanitized
puts sanitized_filename #=> "不正な_ファイル名_です"

このように、ファイル名に含まれる不正な文字や記号が”_(アンダースコア)”に置換され、無害化されます。

実際の使用例

実際の使用例として、ActiveStorageを使ってファイルをアップロードする際は下記のようになります。

Ruby
class UserController < ApplicationController def create # アップロードされたファイルから、ファイル名を取得 filename = params[:user][:avatar].original_filename # ファイル名をActiveStorage::Filename.newメソッドを使って扱いやすい形式に変換 active_storage_filename = ActiveStorage::Filename.new(filename) # ファイル名をサニタイズ sanitized_filename = active_storage_filename.sanitized # ユーザー情報を保存 @user = User.new(user_params) @user.avatar.attach(io: params[:user][:avatar].tempfile, filename: sanitized_filename) if @user.save redirect_to @user else render :new end end private def user_params params.require(:user).permit(:name, :email) end
end

上記のコードでは、アップロードされたファイルからファイル名を取得し、ActiveStorage::Filename.newメソッドを使ってファイル名を扱いやすい形式に変換しています。そして、sanitizedメソッドを適用してファイル名をサニタイズしています。

最後に、Active Storageを使ってファイルを保存する際に、サニタイズされたファイル名を指定しています。

正規表現を使ったサニタイズ

ActiveStorage::Filename.new(“ファイル名”).sanitizedメソッドを使ってファイル名をサニタイズする方法以外にも、正規表現を使ってサニタイズする方法もあります。正規表現を使った場合、どの文字を置換するかを自由に設定できるため、より柔軟なサニタイズが可能です。

例えば、次のような正規表現を使って、ファイル名から”?”や”#”を除外することができます。

Ruby
filename = "不正な/ファイル名?です#"
sanitized_filename = filename.gsub(/[?#]/, '_')
puts sanitized_filename #=> "不正な/ファイル名_です_"

このように、gsubメソッドを使って正規表現にマッチする文字列を置換することができます。

まとめ

Railsでファイル名をサニタイズする方法について、ActiveStorage::Filename.new(“ファイル名”).sanitizedメソッドを使った方法を説明しました。また、正規表現を使った方法についても説明しました。ファイル名をサニタイズすることで、アプリケーションのセキュリティを強化することができます。