你試圖在這裏實現的是一種通過默默無聞的安全性,最終不會起作用。人們可以知道來自其他來源的亂碼網址,仍然可以訪問他不應該看到的圖片。
真正的解決方案是實際控制對文件的訪問。這是一個非常常見的解決方案,這是一個很常見的問題爲了強制訪問控制,您必須在提供文件並驗證憑據之前調用Rails控制器操作,然後如果憑據有效,則爲實際文件提供服務。
這可能是這樣的控制器:
class PhotoController < ApplicationController
def photo
if user_has_access?(params[:album], params[:photo])
# be *very* careful here to ensure that user_has_access? really validates
# album and photo access, otherwise, there's a chance of you letting a malicious
# user to get any file from your system by feeding in certain params[:album]
# and params[:photo]
send_file(File.join('/path/to/albums', params[:album], "#{params[:photo]}.jpg"), type: 'image/jpeg', disposition: 'inline')
else
render(file: File.join(Rails.root, 'public/403.html'), status: 403, layout: false)
end
end
private
def user_has_access?(album, photo)
# validate that the current user has access and return true, if he does,
# and false if not
end
end
然後在你的路由文件:
get '/photos/:album/:photo.jpg' => 'photo#photo', as: album_photo
然後在你的觀點:
<%= image_tag album_photo_path('album', 'photo') %>
什麼好的send_file
是它只是在開發模式下從Rails提供文件,但在生產中它可以n被配置爲將其卸載到實際的Web服務器,以保持Rails代碼的性能最佳。
希望給出一個基本的想法,它可能是什麼,有所幫助!
谷歌的緩存可能會給你這個。但是你會將圖像存儲在(網頁)根目錄文件夾之外,對吧? – Strawberry