Запретите прямой доступ к файлу папки, введя URL

На IIS размещено приложение веб-формы asp.net. В папке проекта есть файлы pdf и изображения, которые называются upload.

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

Любой может получить доступ к файлам PDF и изображениям, введя URL-адрес (пример: https//myapplication.com/uploads/11%20pics.pdf) в браузере без входа в систему.

Есть ли способ ограничить URL-адрес, чтобы только зарегистрированные пользователи могли получить к ним доступ?

Я попытался запретить доступ на чтение для пользователя IUSR в папке, но он останавливает вошедших в систему пользователей для просмотра файла.

1 ответ

На самом деле, очень простой способ сделать это?

так как вы НИКОГДА не хотите, чтобы какой-либо пользователь или кто-либо ввел этот URL-адрес?

Затем просто используйте настройки безопасности в Интернете для этой папки. Помните, что код НЕ использует веб-URL-адреса, и, что БОЛЕЕ важно, не учитывает настройки безопасности URL-адресов IIS (веб-интерфейса) !!!

В коде всегда используются простые имена файлов Windows.

Вы можете попробовать возиться с правами на папку actaul, но вам это действительно не нужно.

Все, что вам нужно сделать, это «запретить» всех пользователей, используя настройки безопасности в Интернете. Вы можете легко сделать это, поместив файл веб-конфигурации в ту же папку, что и папка UpLoadFiles.

Следовательно, просто добавьте веб-конфигурацию, как вы это делаете, чтобы защитить все папки на основе, скажем, роли, и добавьте это:

        <?xml version="1.0" encoding="utf-8"?>
  <configuration>
    <system.web>
      <authorization>
        <deny users="*" />
      </authorization>
    </system.web>
  </configuration>

Итак, теперь, если кто-то попытается ввести URL-адрес, ему будет отказано в доступе к этой папке.

но ваш код НЕ заботится, НЕ использует и очевиден для URL-адреса и того файла безопасности IIS (web.config), который вы используете.

Ваш код за 100% игнорирует права входа в систему, включая членство в роли и т. Д.

Итак, в коде позади я все еще могу свободно открывать + читать и делать что угодно.

          Dim strFileURL As String = "~/UpLoadFiles/def.txt"
    Dim strInternalFile As String = Server.MapPath(strFileURL)


    Dim strbuf As String

    strbuf = File.ReadAllText(strInternalFile)

    Debug.Print(Len(strbuf))

Однако вы не упоминаете, как эти предполагаемые «ссылки» у вас есть. Поскольку, если мы защитим эту папку от всех пользователей, то, конечно, пользователи не смогут использовать гиперссылку.

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

Итак, скажем, у нас есть это:

Я не знаю, сохраняете ли вы ТОЛЬКО имя файла или полное имя пути в базе данных.

Но, скажем, простая сетка, подобная этой:

      <asp:GridView ID="Gfiles" runat="server" 
    DataKeyNames="ID" AutoGenerateColumns="False"  CssClass="table" >
    <Columns>
        <asp:BoundField  DataField="FileName" HeaderText="FileName"  />
        <asp:BoundField  DataField="Size" HeaderText="Size"  />
        <asp:BoundField  DataField="UpLoadTime" HeaderText="UpLoadTime"  />

        <asp:TemplateField HeaderText ="Download" ItemStyle-HorizontalAlign="Center">
            <ItemTemplate>
                <asp:Button ID="cmdDownLoad" runat="server" 
                    Text="Download" CssClass="btn"
                    OnClick="cmdDownLoad_Click"
                    />
            </ItemTemplate>
        </asp:TemplateField>
    </Columns>
</asp:GridView>

И скажите загрузить вот так:

      Protected Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

    Dim strSQL As String = "SELECT * FROM MyUpLoadFiles ORDER BY UpLoadTime"
    Dim cmdSQL As New SqlCommand(strSQL)

    Gfiles.DataSource = MyRstP(cmdSQL)
    Gfiles.DataBind()
    ' hide up-loader
    AjaxFileUpload1.Visible = False

End Sub

Public Function MyRstP(cmdSQL As SqlCommand) As DataTable

    Dim rstData As New DataTable
    Using cmdSQL
        Using conn = New SqlConnection(My.Settings.TEST4)
            cmdSQL.Connection = conn
            conn.Open()
            rstData.Load(cmdSQL.ExecuteReader)
        End Using
    End Using
    Return rstData

End Function

И теперь у нас есть это:

Таким образом, мы НЕ используем гиперссылку для загрузки.

Мы извлекаем имя файла из этой базы данных.

Скажем, как это событие нажатия кнопки для строки представления сетки

      Protected Sub cmdDownLoad_Click(sender As Object, e As EventArgs)

    Dim btn As Button = sender
    Dim gRow As GridViewRow = btn.NamingContainer

    Dim sFile As String = gRow.Cells(0).Text

    Dim sInternalFile = Server.MapPath("~/UpLoadFiles/" & sFile)
    ' now stream file down to browser
    If File.Exists(sInternalFile) Then

        Dim strConType As String = MimeMapping.GetMimeMapping(sInternalFile)

        Dim binFile As Byte() = File.ReadAllBytes(sInternalFile)
        Response.ContentType = strConType
        Response.AppendHeader("Content-Disposition", "attachment; filename=" + sFile)
        Response.BinaryWrite(binFile)
        Response.End()

    End If

End Sub

Итак, теперь мы предотвращаем URL-адреса и фактически НИКОГДА не должны даже раскрывать, где мы спрятали файлы. Мы всегда отображаем только имя файла, но имя пути и папку? Никогда не выставлялся.

Конечно, вы загрузите сетку файлов на основе «идентификатора пользователя» или чего-то подобного.

И обратите внимание, что вам НЕОБХОДИМО включить тип отображения «мой». Для этого требуется .net 4.5 или более поздняя версия. (или вы можете сохранить тип шахты в столбце базы данных).

Другие вопросы по тегам