Запретите прямой доступ к файлу папки, введя 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 или более поздняя версия. (или вы можете сохранить тип шахты в столбце базы данных).