Konst_One писал(а):в это время возможно от имени этой незварешенной сессии что-либо сделать
'top.asp во всех страничках
<OBJECT runat="server" progid="MyDll.System" id="objSys" VIEWASTEXT></OBJECT>
<%
Sub AccessSession()
UID = Coalesce(StrToVar(vbLong, Session("UID")), 0)
If UID = 0 Then
Server.Execute "include\session-authorize.asp"
UID = Coalesce(StrToVar(vbLong, Session("UID")), 0)
End If
End Sub
Sub BasePage_Load()
Dim objSiteMapNode, IsAccessGranted, PageRoles
PageURL = GetURLFileName(Request.ServerVariables("PATH_INFO"))
Call AccessSession()
Set objSiteMapNode = GetSiteMap().selectSingleNode("//siteMapNode[@url='" & PageURL & "']")
If Not objSiteMapNode Is Nothing Then
PageTitle = objSiteMapNode.getAttribute("title")
PageRoles = objSiteMapNode.getAttribute("roles")
IsAccessGranted = (InStr(1, PageRoles, Session("Role")) > 0) Or (PageRoles = "*")
End If
If IsAccessGranted <> True Then
Server.Transfer "include\session-denied.asp"
End If
If PageURL = "main.asp" Then
If InStr(Request.ServerVariables("HTTP_REFERER"), PageURL) = 0 Then
Session.Contents.Remove("post:" & PageURL)
End If
Else
If Request.Form.Count > 0 Then
Call Page_Post()
ElseIf InStr(Request.ServerVariables("HTTP_REFERER"), PageURL) = 0 Then
Session.Contents.Remove("post:" & PageURL)
End If
End If
Call Page_Load()
End Sub
%>
'session-authorize.asp
<%
Call Authorization()
Sub Authorization()
Dim Login, UID
' authorization
Login = "" & Request.ServerVariables("AUTH_USER")
' Force user to authenticate if they aren't already
If Len(Login) = 0 Then
Response.Status = "401 Unauthorized"
Response.End
Else
'здесь проверка логина и запись в сессию нужных параметров клиента
'objSys
UID = objSys.UserLogin(Login)
If UID > 0 Then
Dim rsUser: Set rsUser = objSys.UserGet(UID, UID)
Session("UID") = UID
Session("UserLogin") = rsUser("Login")
Session("UserName") = rsUser("Name")
Session("UserRoleID") = rsUser("RoleID")
Session("UserRole") = rsUser("Role")
Session("Role") = rsUser("RoleID")
Else
If Err.Number = 0 Then
Response.Write "<html><head>" & _
"<meta http-equiv='Content-Type' content='text/html; charset=windows-1251'>" & _
"<title>" & Application("AppName") & " - Доступ запрещен</title>" & _
"<h3>Доступ запрещен.</h3>" & _
"<p>Пользователь " & Login & " не является администратором системы.</p>" & _
"</head><body></body></html>"
Else
Response.Write "<html><head>" & _
"<meta http-equiv='Content-Type' content='text/html; charset=windows-1251'>" & _
"<title>" & Application("AppName") & " - Ошибка идентификации</title>" & _
"<h3>Ошибка идентификации.</h3>" & _
"<p>Пользователь " & Login & ".</p>Код ошибки: " & Err.Number & "<br>Описание: " & Err.Description & "<br>Источник: " & Err.Source & _
"</head><body></body></html>"
End If
Response.End
End If
end if
end sub
%>
Во-первых, что значит "адрес клиента"? Наверное SessionId? Выражайтесь тщательнее.
Читайте тщательнее.Хранить ip клиента.
А в добавок скопировать ip?Во-вторых, если уж кто-то смог подломить сессию, то скопировать из адресной строки идентификатор ему труда не составит.
И что?В-третьих, этот UIN придётся за собой таскать по всем страницам.
Session("UID") = UID
UID = Coalesce(StrToVar(vbLong, Session("UID")), 0)
If UID = 0 Then
If Session("blnIsUserGood") = False or IsNull(Session("blnIsUserGood")) = True then
Sub BeginSession()
Dim SessionID, UID, RemoteID
On Error Resume Next
RemoteID = "" & Request.ServerVariables("REMOTE_ADDR")
UID = 0
UID = objSys.ClientLogin("" & Request.Form("UNC"), "" & Request.Form("PIN"), RemoteID)
If UID > 0 Then
SessionID = objSys.SessionBegin(UID, 1, Session.Timeout, RemoteID)
If SessionID > 0 Then
On Error Goto 0
Session("SID") = SessionID
' cache common data
Session("UNC") = Request.Form("UNC")
.....
Antonariy писал(а):Нужно проверять пару - id и ip.
Antonariy писал(а):Кроме того, можно сделать id базы не только скрытым, но и меняющимся при каждом запросе
Можно, а зачем? Если я открою ссылку со страницы в новом окне (например, в одном клиенты, в другом - договоры), а потом попробую перемещаться поочерёдно в обоих окнах, то при таком алгоритме у меня это не получится.
Konst_One писал(а):вобщем похоже , что так, но дполнительные проверки значительно увеличивают стойкость системы
Konst_One писал(а):, к тому же обычно при значимых действиях (ввод данных и тп) мы еще раз проверяем валидность прав пользователя на такие действия
Konst_One писал(а):надо еще учесть , что на каждой странице у нас выключен Cashe и установлен наименьший из возможного timeout
Именно так.Я так понимаю, что IP - какой-нибудь идентификатор, например SessionId или Id пользователя из БД, а IP - IP-адрес, т.е. Request.ServerVariables("REMOTE_ADDR"). Правильно? Или снова не так? Я прошу тщательнее выражаться чтобы потом не перспрашивать, это же не устный разговор где сразу пояснить можно.
Как раз за тем, что мы тут обсуждаем. А открытие дополнительных окон в подобном приложении имхо дурной тон. Я стараюсь вообще не пользоваться тегом <a>, чтобы исключить подобные ситуации.Можно, а зачем?
Konst_One писал(а):все должно быть в одном окне
Абсолютно монописуально где его проверять. Просто если проверка сложная, луче запихнуть в dll, потому как быстрее.А что по поводу проверки пароля в DLL?
Да ради бога, хоть в трех. Должно - слишком сильно сказано. Но желательно, чтобы только одно из них было функциональным.А почему должно? За что меня так наказывать?
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 21