امنيت برنامه های وب ( بخش چهارم )
اين مطلب از طريق سايت شرکت سخاروش در اختيار شما گذاشته شده است .

امنيت برنامه های وب ( بخش چهارم )

امنيت برنامه های وب ( بخش چهارم )

 آنچه تاکنون گفته شده است :

همانگونه که در بخش سوم اين مقاله اشاره گرديد ، به منظور استفاده از روش Forms  Authentication ، می بايست مراحل زير را دنبال نمود :

در بخش سوم اين مقاله به بررسی اولين مرحله ( مقداردهی  Authentication mode در فايل Web.config به Forms  ) ، اشاره گرديد . در ادامه به بررسی ساير مراحل لازم به منظور استفاده از روش Forms  Authentication ، خواهيم پرداخت .

Web.Config setting for Forms Authentication

 <authentication mode="Forms">
 
   <forms loginUrl =" Login.aspx" >
           <credentials passwordFormat = "SHA1" >
              <user name = "Srco.ir"              Password ="110" />
              <user name = "SakhaRavesh" Password ="111" />
        </credentials>
   </forms>
</authentication>

ايجاد يک فرم وب Logon
به منظور تائيد کاربران بر اساس روش Forms Authentication ، نيازمند استفاده از يک فرم وب بوده که با استفاده از آن امکان Logon کاربران ، فراهم گردد. فرم وب با استفاده از عنصر <forms> در فايل Web.Config ، مشخص شده و می تواند صرفا" شامل دو Text box و يک Button  و يا شامل فيلدهای اطلاعاتی بيشتری  به منظور اخذ اطلاعات کاربران باشد .

Login.aspx

 <%@ Page Language="vb"  Codebehind="Login.aspx.vb" Inherits="Web1.Login" codePage="65001" %>
<HTML>
 <HEAD>
     <title>صفحه تائيد کاربران برنامه</title>
     <meta name="vs_showGrid" content="True">
     <META http-equiv="Content-Type" content="text/html; charset=utf-8">
 </HEAD>
<BODY bgColor="#ffffff">
.   ...
 <asp:Button id="btnSingIn" runat="server" Text="Sign in"></asp:Button>
<asp:TextBox id="txtUserName" runat="server" Width="99px"></asp:TextBox>
<asp:TextBox id="txtPassword" runat="server" Width="100px" TextMode="Password"></asp:TextBox>
   ...

Login.aspx.vb
Imports System.Web.Security
Public Class Login
  ...
Private Sub btnSingIn_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSingOn.Click

   If  FormsAuthentication.Authenticate(txtUserName.Text, txtPassword.Text) Then
       
 FormsAuthentication.RedirectFromLoginPage(txtUserName.Text, True)
   Else
       txtPassword.Text = ""
       If CInt(ViewState("Tries")) >
1 Then
           Response.Redirect("Denied.htm")
       Else
           ViewState("Tries") = CInt(ViewState("Tries")) + 1
     End If
  End If
End Sub
 ...
ٍEnd Class

توضيحات

در مثال فوق ، صفحه شروع  برنامه Webform1.aspx ( در بخش دوم اين مقاله ) در نظر گرفته شده است . پس از Logon موفقيت آميز، کاربر به صفحه فوق هدايت خواهد شد . زمانيکه کاربر بر روی دکمه sign in کليک می نمايد ، تائيد کاربر بر اساس نام و رمز عبور انجام و برای وی  يک مجوز صادر خواهد شد. بدين ترتيب، کاربر امکان دستيابی به بخش های متفاوت برنامه را بدست می آورد .ماحصل اجرای صفحه فوق ، به صورت زير است :

از کلاس FormsAuthentication به منظور Sign out ، و يا حذف کوکی Authentication از روی ماشين کاربر استفاده می گردد.کد زير دستيابی کاربر به برنامه را خاتمه داده و استفاده مجدد از برنامه توسط وی را ملزم به  Login مجدد ، می نمايد .

End User's access to an application

 Imports System.Web.Security
Private Sub butSignOut_Click ( ByVal sender As System.Object , ByVal e As System.EventArgs ) Handles butSignOut.Click
    FormsAuthentication.SignOut ( )
    Response.Redirect( "UserInfo.aspx")
End Sub

تائيد کاربران با استفاده از يک بانک اطلاعاتی
در بخش قبل با  فرآيند تائيد کاربران با استفاده از ليست تعريف شده کاربران موجود در فايل Web.Config ، آشنا شديم . متد Authenticate مربوط به کلاس FormsAuthentication ، به منظور خواندن اطلاعات از فايل فوق بصورت اتوماتيک ، پيکربندی شده است . رويکردد فوق ، گزينه ای مناسب در مواردی است که مسئوليت تعريف اسامی و رمز عبور کاربران به مدير سيستم واگذار شده باشد . در صورتيکه قصد داشته باشيم ،  امکان تعريف نام و رمز عبور را در اختيار کاربران قرار دهيم ، می بايست اطلاعات مربوط به کاربران خارج از فايل Web.config ذخيره گردد. اعمال تغييرات  در فايل Web.config  در زمان اجراء ، باعث Restart شدن برنامه شده و Reset تمامی متغيرهای Session و Application استفاده شده توسط برنامه می گردد. دراين رابطه می توان ، اسامی کاربران را در هر نوع فايلی ذخيره نمود . بديهی است استفاده از يک بانک اطلاعاتی، مزايای خاص خود را بدنبال خواهد داشت  :

زمانيکه اسامی و رمز عبور کاربران در يک فايل و يا بانک اطلاعاتی ذخيره می گردد ، می توان با استفاده از متد HashPasswordeForStoringInConfigFile مربوط به کلاس FormsAuthentication ، آنان را رمز نمود. در اين رابطه از الگوريتم های SHA1 و يا MD5 به منظور رمزنگاری داده استفاده می گردد :

Encrypting User names and passwords

 Password = FormsAuthentication.HashPasswordForStoringInConfigFile ( Password , "SHA1")

افزودن کاربران به يک بانک اطلاعاتی
به منظور افزودن کاربران به يک بانک اطلاعاتی ، اطلاعات مربوط به کاربران شامل نام و رمز عبور را  از طريق دو TextBox اخذ و در ادامه با ايجاد يک Event Procedure ، آنان را به بانک اطلاعاتی اضافه نموده و در نهايت پيام مناسبی که نشاندهنده درج اطلاعات کاربر در بانک اطلاعاتی سيستم می باشد ، نمايش داده خواهد شد . روتين زير با فراخوانی تابع AddUser ،  نام و رمز عبور کاربر را به بانک اطلاعاتی اضافه می نمايد .

َAdding User to a database

 Private Sub butNewUser_Click ( ByVal sender As System.Object , ByVal e As System.EventArgs ) Handles butNewUser.Click
    If AddUser(txtName.Text, txtPassword.Text) Then
          spnNote.InnerText = "کاربر جديد به بانک اطلاعاتی کاربران اضافه گرديد "
    Else
          spnNote.InnerText = "کاربری با اين مشخصات وجود دارد "
End If"
  End If
End Sub

تابع AddUser ، که در روتين فوق استفاده شده است ، در ابتدا رمز عبور کاربر را رمز نموده و در ادامه با استفاده از دستور SQL INSERT ، نام و رمز عبور را در بانک اطلاعاتی ذخيره می نمايد .درصورتيکه رمز عبور در نظر گرفته شده توسط کاربر، قبلا" توسط کاربر ديگر تعريف و در بانک اطلاعاتی موجود باشد ، بلاک  Exeption -handling   ، خطاء را تشخيص داده و مقدار False را مبنی بر عدم افزودن اطلاعات کاربر در بانک اطلاعاتی ، برمی گرداند .

َAddUser Function

 Private Function AddUser ( Byval UserName As String , ByVal Password As String ) As Boolean
  Dim bSuccess As Boolean
  Password = FormsAuthentication.
HashPasswordForStoringInConfigFile ( Password , "SHA1")
 
Dim oleCommand As New OleDbCommand ( "INSERT INTO Users " + "Values ( '" + UserName + '" + Password + "')",oledbUsers)
  Try
      oledbUsers.Open ( )
      If oleCommand.ExecuteNonQuery ( ) Then bSuccess = True
      oledbUsers.Close ( )
  Catch
      bSuccess =False
      oledbUsers.Close ( )
  End Try
  Return bSuccess
End Function

در زمان تائيد کاربران با استفاده از ليست مشخص شده کاربران در فايل  Web.Config ، از متد Authenticate استفاده می گردد.  در موارديکه  برای تائيد کاربران از بانک اطلاعاتی استفاده می گردد ، می بايست کد لازم به منظور يافتن و مقايسه نام و رمز عبور کاربران ، نوشته گردد . روتين زير ، از تابع  CheckPassword به منظور تائيد  نام و رمز عبور استفاده نموده و در صورتيکه صلاحيت کاربر تائيد گردد به وی امکان دستيابی به برنامه داده خواهد شد.

َAuthenticating Users from a database

 Private Sub butSignOn_Click ( ByVal sender As System.Object , ByVal e As System.EventArgs ) Handles butSignOn.Click
   If CheckPassword(txtName.Text, txtPassword.Text) Then
         FormsAuthentication.RedirectFromLoginPage(txtName.Text, True)
    Else
         spnNote.InnerText = "نام و يا رمز عبور اشتباه است ، مجددا سعی نمائيد"
         ViewState("tries") = ViewState("tries") + 1
          If   ViewState("Tries") > 3  Then
               Response.Redirect("Denied.htm")
         End If
   End If
End Sub

تابع CheckPassword ، در ابتدا رمز عبور کاربر را با استفاده از الگوريتم مشخص شده ، رمز می نمايد. در ادامه ، رکورد بانک اطلاعاتی  بر اساس نام جستجو و پس از يافتن رکورد مربوطه، مقايسه بين رمز عبور رمز شده در مقابل رمز عبور موجود در بانک اطلاعاتی ، انجام خواهد شد . دستيابی به بانک اطلاعاتی از طريق يک بلاک Exception handling انجام تا پيشگيری لازم در خصوص مسئله Locking ، انجام شود .

َCheckPassword Function

 Private Function CheckPassword ( Byval UserName As String , ByVal Password As String ) As Boolean
  Dim bSuccess As Boolean
  Password = FormsAuthentication.
HashPasswordeForStoringInConfigFile ( Password , "SHA1")
 
Dim oleCommand As New OleDbCommand ( "SELECT * FROM Users" + "WHERE UserName='" + txtName.Text + "'" , oledbUsers )
  Try
      oledbUsers.Open ( )
      Dim rdrUsers As OledbDataReader = oleCommand.ExecuteReader ( )
      While rdrUsers.Read( )
            If Password =rdrUsers.Item("Password") Then bSuccess = True
      End While

      If oleCommand.ExecuteNonQuery ( ) Then bSuccess = True
      oledbUsers.Close ( )
   Catch
      bSuccess =False
      oledbUsers.Close ( )
  End Try
  Return bSuccess
End Function

تمامی کاربران با توجه به تنظيمات انجام شده  در بخش <authentication>  فايل Web.config ،  بصورت اتوماتيک به صفحه LoginBaseDb.aspx هدايت خواهند شد .

Web.Config file setting for <authentication> element

  <authentication mode="Forms">
     <forms name="Test1Cookie" loginUrl ="LoginBaseDB.aspx" timeout="15"></forms>
</authentication>

صفحه LoginBaseDb.aspx :

در صورت درج نام و رمز عبور غيرمعتبر و فشردن دکمه "ورود به سايت " توسط کاربر ، يک پيام خطاء نمايش داده می شود ( در صورت تائيد نام و رمز عبور ، امکان دستيابی کاربر به برنامه فراهم می گردد) .

پس از درج  نام و رمز عبور و فشردن دکمه  " کاربر جديد " ، مشخصات کاربر در بانک اطلاعاتی کاربران ذخيره می گردد .

در بخش پنجم اين مقاله به بررسی روش Passport Authentication خواهيم پرداخت .


استفاده از اين مطلب  با ذکر منبع و اهداف غيرانتفاعی بلامانع است .
http://www.srco.
ir