2013-08-07 2 views
1

Nous avons récemment totalement réécrit notre Web ASP.NET 2.0 site Web Forms et il est maintenant un site Web MVC 4.0. Nous rencontrons des problèmes avec la création de faux comptes. Lorsque je regarde dans mon journal IIS, les adresses IP proviennent principalement de la Chine. Notre site ASP.NET 2.0 Web Forms n'a jamais connu de faux comptes en cours de création, donc je me demande si j'ai fait quelque chose de mal pour en obtenir soudainement autant. Voici une coupe vers le bas version de notre page d'inscription de compte pour illustrer ce que je fais ...Prévenir la création de faux compte dans mvc

Contrôleur

<RequireHttps()> 
Function Register() As ActionResult 

    Dim ad As New AccountDetails 

    Return View("AccountDetails", ad) 

End Function 

<RequireHttps()> 
<ValidateAntiForgeryToken()> 
Function Register(model As AccountDetails) As ActionResult 

    If ModelState.IsValid Then 
     If Not String.IsNullOrEmpty(model.FormValue1) OrElse Not String.IsNullOrEmpty(model.FormValue2) Then 
      ' Add Code here to display an error 
     Else 
      Dim SerialNo As Integer = AccountDetailsRepository.InsertRecord(model) 

      If SerialNo > 0 Then 
       Dim Roles As String = "Standard" 

       FormsAuthentication.Initialize() 
       Dim fat As FormsAuthenticationTicket = New FormsAuthenticationTicket(1, model.FirstName + " " + model.Surname, DateTime.Now, DateTime.Now.AddMinutes(FormsAuthentication.Timeout.TotalMinutes), False, Roles, FormsAuthentication.FormsCookiePath) 
       Response.Cookies.Add(New HttpCookie(FormsAuthentication.FormsCookieName, FormsAuthentication.Encrypt(fat))) 

       Return RedirectToAction("Account") 
      Else 
       ' Add code here to display an account error 
      End If 
     End If 
    End If 

    Return View("AccountDetails", model) 

End Function 

Voir

@ModelType User.AccountDetails 

<div class="Account"> 
    <h1 class="PageTitle">Register</h1> 

    <div class="AccountDetails"> 
     <p class="PageHeader">Please enter your account details</p> 

     @Using Html.BeginForm() 
      @Html.AntiForgeryToken() 
      @Html.ValidationSummary(True, "Please correct the following errors:-", New With {.id = "AccountDetailsValidationSummary", .class = "TopValidationSummary"}) 

      @<div class="AccountDetailsContainer"> 
       @Html.TextBoxFor(Function(model) model.FormValue1, New With {.id = "FormValue1"}) 
       @Html.HiddenFor(Function(model) model.FormValue2, New With {.id = "FormValue2"}) 
       <fieldset id="NameGroup" class="FieldGroup"> 
        <legend>Name</legend> 

        <div class="FieldRow"> 
         <label for="FirstName" class="FieldLabel">First Name</label> 
         @Html.TextBoxFor(Function(model) model.FirstName, New With {.autocomplete = "off", .class = "Field", .id = "FirstName", .MaxLength = 25}) 
         @Html.ValidationMessageFor(Function(model) model.FirstName) 
        </div> 
        <div class="FieldRow"> 
         <label for="Surname" class="FieldLabel">Surname</label> 
         @Html.TextBoxFor(Function(model) model.Surname, New With {.autocomplete = "off", .class = "Field", .id = "Surname", .MaxLength = 25}) 
         @Html.ValidationMessageFor(Function(model) model.Surname) 
        </div> 
       </fieldset> 

       <fieldset id="AddressGroup" class="FieldGroup"> 
        <legend>Address</legend> 

        <div class="FieldRow"> 
         <label for="Address1" class="FieldLabel">Address 1</label> 
         @Html.TextBoxFor(Function(model) model.Address1, New With {.autocomplete = "off", .class = "Field", .id = "Address1", .MaxLength = 50}) 
         @Html.ValidationMessageFor(Function(model) model.Address1) 
        </div> 
        <div class="FieldRow"> 
         <label for="Address2" class="FieldLabel">Address 2</label> 
         @Html.TextBoxFor(Function(model) model.Address2, New With {.autocomplete = "off", .class = "Field", .id = "Address2", .MaxLength = 50}) 
        </div> 
        <div class="FieldRow"> 
         <label for="Address3" class="FieldLabel">City</label> 
         @Html.TextBoxFor(Function(model) model.City, New With {.autocomplete = "off", .class = "Field", .id = "Address3", .MaxLength = 35}) 
         @Html.ValidationMessageFor(Function(model) model.City) 
        </div> 
        <div class="FieldRow"> 
         <label for="Address4" class="FieldLabel DropDown">State</label> 
         @Html.TextBoxFor(Function(model) model.State, New With {.autocomplete = "off", .class = "Field", .id = "Address4", .MaxLength = 4}) 
         @Html.ValidationMessageFor(Function(model) model.State) 
        </div> 
        <div id="PostcodeContainer" @(If(Not Model.International, Html.Raw("style=""display: block;"""), Html.Raw("style=""display: none;""")))> 
         <label for="PostCode" class="FieldLabel">Zip Code</label> 
         @Html.TextBoxFor(Function(model) model.PostCode, New With {.autocomplete = "off", .class = "Field", .id = "PostCode", .MaxLength = 15}) 
         @Html.ValidationMessageFor(Function(model) model.PostCode) 
        </div> 
       </fieldset> 

       <fieldset id="ContactDetailsGroup" class="FieldGroup"> 
        <legend>Contact Details</legend> 

        <div class="FieldRow"> 
         <label for="Email" class="FieldLabel">E-mail</label> 
         @Html.TextBoxFor(Function(model) model.Email, New With {.autocomplete = "off", .class = "Field", .id = "Email", .MaxLength = 100}) 
         @Html.ValidationMessageFor(Function(model) model.Email) 
        </div> 
        <div class="FieldRow"> 
         <label for="ConfirmEmail" class="FieldLabel">Confirm E-mail</label> 
         @Html.TextBoxFor(Function(model) model.ConfirmEmail, New With {.autocomplete = "off", .class = "Field", .id = "ConfirmEmail", .MaxLength = 100}) 
         @Html.ValidationMessageFor(Function(model) model.ConfirmEmail) 
        </div> 
        <div class="FieldRow"> 
         <label for="TelNo1" class="FieldLabel">Tel No</label> 
         @Html.TextBoxFor(Function(model) model.TelNo1, New With {.autocomplete = "off", .class = "Field", .id = "TelNo1", .MaxLength = 25}) 
         @Html.ValidationMessageFor(Function(model) model.TelNo1) 
        </div> 
       </fieldset> 

       <fieldset id="PasswordGroup" class="FieldGroup"> 
        <legend>Password</legend> 

        <div class="FieldRow"> 
         <label class="FieldLabel" for="WebPassword">Password</label> 
         @Html.PasswordFor(Function(model) model.WebPassword, New With {.autocomplete = "off", .class = "Field", .id = "WebPassword", .MaxLength = 25}) 
         @Html.ValidationMessageFor(Function(model) model.WebPassword) 
        </div> 
        <div class="FieldRow"> 
         <label class="FieldLabel" for="ConfirmWebPassword">Confirm Password</label> 
         @Html.PasswordFor(Function(model) model.ConfirmWebPassword, New With {.autocomplete = "off", .class = "Field", .id = "ConfirmWebPassword", .MaxLength = 25}) 
         @Html.ValidationMessageFor(Function(model) model.ConfirmWebPassword) 
        </div> 
       </fieldset> 
      </div> 

      @<div class="ButtonBar"> 
       <input type="submit" name="SubmitValue" class="SubmitButton" value="Create Account" id="AccountDetailsSaveDetailsButton" /> 
      </div> 
     End Using 
    </div> 
</div> 

Mon point de vue de la mise en page contient des scripts pour jQuery et moi utilisons également une validation discrète sur le client.

Comme vu ci-dessus j'ai essayé quelques choses: - 1. Ajout du AntiForgeryToken. 2. Ajout d'une zone de texte appelée FormValue1 que je cache avec CSS. 3. Ajout d'un champ masqué appelé FormValue2. FormValue1 et FormValue2 Je vérifie pour voir si elles ont été remplies. Comme un utilisateur ne devrait pas être capable de voir ceux-ci, s'ils ont été remplis, je suppose que c'est une sorte de hack automatique et ne pas enregistrer le compte. Je peux envisager des choses comme reCAPTCHA mais je voulais juste essayer de comprendre si je fais quelque chose de mal, d'autant plus que ce problème semble avoir commencé avec notre site MVC 4.0 et n'a pas rencontré ce problème avec ASP. Formulaires Web NET 2.0.

Tout ce que je peux faire pour améliorer cela?

Répondre

1

je doute qu'il n'a rien à voir avec quelle version de ASP.NET vous avez utilisé. Il est plus probable que votre site a gagné en popularité et donc la colère des bots chinois. Soit dit en passant, AntiForgeryToken est utilisé pour protéger contre CSRF, pas des robots qui font appel à vos pages. Et ajouter des champs cachés pour essayer de les tromper n'est guère considéré comme une mesure de sécurité.

reCAPTCHA est votre meilleur pari. À moins que ce soit un atelier chinois où les gens asservissent pour enregistrer des comptes, alors vous avez un problème complètement différent.

+0

Merci. Notre site Web est un produit que nous vendons à de nombreux utilisateurs, tous installés sur leurs propres serveurs Web. J'ai vu les journaux IIS de quelques utilisateurs et ils viennent principalement de Chine. J'ai seulement mentionné Web Forms vs MVC pour illustrer que nous n'avions jamais rencontré de problèmes auparavant, donc je me demandais s'il y avait quelque chose de spécifique dans ma mise en œuvre dans MVC que je faisais mal. Pour moi, les logs impliquent qu'il est plus automatisé que juste un humain qui l'essaie, les requêtes sont lancées à quelques secondes d'intervalle, essayant souvent des pages qui n'existent pas en premier. –

Questions connexes