Отключить прямой доступ к изображениям - PullRequest
8 голосов
/ 03 января 2012

Я делаю небольшой семейный фотоальбом с намерением, возможно, открыть его другим людям для последующего хранения изображений.

Я загружаю изображения в ~ \ images \, а затем изменяю их размер 3 раза (Обычныйпросмотреть ... миниатюру и миниатюрную версию) и переместить их в ~ \ images \ thumbs, ~ \ images \ normal, ~ \ images \ tiny и затем переместить оригинал в ~ \ images \ original.

ЕслиПользователь знает имя файла, он может просто перейти к http://mysite.com/images/normal/filename.jpg для прямого доступа.

Я бы предпочел, чтобы он не был им доступен.

Итак, есть ли способ изменить ImageUrl элемента управления asp: Image на чтение из недоступной папки?И будет ли это ударом по производительности?Я имею в виду что-то вроде (не уверен, если это возможно) чтения изображения в s Steam и каким-то образом установить ImageUrl или что-либо еще для чтения из потока?

Надеюсь, вы поможете.

Ответы [ 2 ]

9 голосов
/ 03 января 2012

Ответ - да. Вы можете использовать специальный формат img src, который будет вставлять изображение прямо на страницу.

Вместо URL вы должны использовать следующий формат:

<img src="data:image/png;base64,..." />

где data указывает тип mime вашего изображения, а ... после base64 - содержимое изображения в кодировке base64.

Это поведение определяется этим RFC .

Вот пример:

В HTML:

<img id="MyPicture" runat="server" border="0" />

В коде позади:

    protected void Page_Load(object sender, EventArgs e)
    {
        MyPicture.Src = @"data:image/gif;base64," + EncodeFile(Server.MapPath(@"/images/test.gif"));
    }

    private string EncodeFile(string fileName)
    {
        return Convert.ToBase64String(File.ReadAllBytes(fileName));
    }
0 голосов
/ 03 января 2012

Могу ли я предложить рассмотреть что-то вроде:

  1. Сохранение изображений в папку, например "siteroot / images / userid /".
  2. При успешном входе в систему установите переменную сеанса, чтобы другие страницы знали, что текущий пользователь вошел в систему. Session["user"] = youruser; Любой объект, который вы храните в переменной сеанса, содержит действительный идентификатор youruser.userID, который извлекается из базы данных.
  3. В вашем файле Global.asax в корне вашего сайта добавьте что-то вроде:

(непроверенный код)

void Begin_Request(object sender, EventArgs e)
{
    //Protect /images/ folder for all requests
    if (Request.FilePath.Contains("images"))
    {
        YourUser user = Session["user"];

        if(user == null) {
            Server.Transfer("404.aspx"); //Folder not public
        }

        if (!Request.FilePath.Contains("images/" + user.userID.toString())){
            Server.Transfer("404.aspx"); //This is not current user's image folder
        }

    }
}

это должно фактически запретить доступ всем, кроме правильного пользователя их соответствующей папки "images", даже если они выясняют прямой путь к файлам изображений.

Если у кого-то есть какие-либо способы улучшить этот метод, не стесняйтесь комментировать, поскольку я скоро буду реализовывать эту идею на сайте, и всегда приветствуются вторые мнения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...