2008-10-08 5 views

Odpowiedz

110

Wszelkie tagi skryptów napisanych w formularzu internetowym ASP.NET spowoduje witryny rzucać i nieobsługiwany wyjątek.

Możesz użyć walidatora regex asp, aby potwierdzić wejście, wystarczy upewnić się, że owinąłeś swój kod za pomocą klauzuli if (IsValid) na wypadek, gdyby Twój javascript został ominięty. Jeśli Twój kliencki javascript jest pomijany, a znaczniki skryptu są wysyłane do formularza asp.net, asp.net wygeneruje nieobsługiwany wyjątek.

Można użyć coś takiego:

<asp:RegularExpressionValidator ID="regexEmailValid" runat="server" ValidationExpression="\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*" ControlToValidate="tbEmail" ErrorMessage="Invalid Email Format"></asp:RegularExpressionValidator> 
+0

Powiedział, że to ASP.NET 1.1, czy kontrole sprawdzania poprawności są obsługiwane w tej wersji? – Shimmy

+0

RegularExpressionValidators są dostępne w ASP.NET 1.1 http://msdn.microsoft.com/en-us/library/eahwtc9e%28v=VS.71%29.aspx – Diskdrive

+1

Używam tego wyrażenia, ale dziwnie wydaje się dopuszczać puste e-maile ......? Musiałem również dodać wymagany walidator pól. – UmaN

4

Zapobieganie XSS jest inny problem z sprawdzanie poprawności wprowadzonych danych.

Jeśli chodzi o XSS: Nie powinieneś próbować sprawdzać wejścia dla XSS lub pokrewnych exploitów. Powinieneś zapobiegać exploitom XSS, iniekcjom SQL itd., Uciekając poprawnie podczas wstawiania napisów do innego języka, gdzie niektóre znaki są "magiczne", np. Podczas wstawiania napisów w HTML lub SQL. Na przykład nazwa taka jak O'Reilly jest całkowicie poprawnym wprowadzeniem, ale może spowodować awarię lub, co gorsza, wstawienie z powrotem do kodu SQL. Nie można zapobiec tego rodzaju problemom, sprawdzając poprawność danych wejściowych.

Walidacja danych wprowadzanych przez użytkownika ma sens, aby zapobiec brakowi lub zniekształceniu danych, np. użytkownik piszący "asdf" w polu zip-code i tak dalej. Wrt. adresy e-mail, składnia jest tak skomplikowana, że ​​nie zapewnia wiele korzyści do sprawdzenia poprawności za pomocą wyrażenia regularnego. Sprawdź, czy zawiera znak "@".

7

Można użyć walidatora RegularExpression. Właściwość ValidationExpression ma przycisk, który można nacisnąć w panelu właściwości programu Visual Studio, który otrzymuje listę wielu użytecznych wyrażeń. Jedna ich używać adresów e-mail to:

\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)* 
+2

Należy pamiętać, że nie obejmuje to niektórych ważnych adresów e-mail. – Sam

5

Members, że jest to prawdziwy adres e-mail jest znacznie trudniejsze.

Wyrażenie regularne w celu potwierdzenia poprawności składni może być bardzo długie (patrz np. http://www.regular-expressions.info/email.html). Najlepszym sposobem potwierdzenia adresu e-mail jest wysłanie wiadomości e-mail do użytkownika i poproszenie użytkownika o odpowiedź, klikając łącze, aby potwierdzić otrzymanie wiadomości e-mail (sposób działania większości systemów rejestracji).

5

W naszym kodzie mamy konkretny walidator odziedziczony po klasie BaseValidator.

Klasa ta ma następujące brzmienie:

  1. Sprawdza adres e-mail przed wyrażeniem regularnym.
  2. Dokonuje wyszukiwania w rekordzie MX domeny, aby upewnić się, że jest co najmniej serwer do dostarczenia.

To jest najbliższy weryfikator bez faktycznego wysłania wiadomości e-mail z potwierdzeniem.

+4

Jak to działa w praktyce? Nie uważasz, że wyszukiwanie DNS jest wolne? –

18

Oto podstawowy weryfikator wiadomości e-mail, który właśnie utworzyłem w oparciu o pomysł Simona Johnsona. Wymaga tylko dodatkowej funkcjonalności wyszukiwania DNS, jeśli jest wymagana.

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Web.UI.WebControls; 
using System.Text.RegularExpressions; 
using System.Web.UI; 

namespace CompanyName.Library.Web.Controls 
{ 
    [ToolboxData("<{0}:EmailValidator runat=server></{0}:EmailValidator>")] 
    public class EmailValidator : BaseValidator 
    { 

     protected override bool EvaluateIsValid() 
     { 
      string val = this.GetControlValidationValue(this.ControlToValidate); 
      string pattern = @"^[a-z][a-z|0-9|]*([_][a-z|0-9]+)*([.][a-z|0-9]+([_][a-z|0-9]+)*)[email protected][a-z][a-z|0-9|]*\.([a-z][a-z|0-9]*(\.[a-z][a-z|0-9]*)?)$"; 
      Match match = Regex.Match(val.Trim(), pattern, RegexOptions.IgnoreCase); 

      if (match.Success) 
       return true; 
      else 
       return false; 
     } 

    } 
} 
+4

Należy pamiętać, że nie obejmuje to niektórych ważnych adresów e-mail. – Sam

+2

'|' w klasie znaków '[a-z | 0-9 |]' wydaje się błędne. Czy wiesz, że to będzie pasowało do znaku '|' i nie działa jako alternatywa? Poza tym nie powiodło mi się to na mój adres e-mail (test z adresem [email protected] lub [email protected]), więc jest to oczywiście błędne. – ygoe

2

Zawsze powinieneś również wykonać walidację po stronie serwera.

public bool IsValidEmailAddress(string email) 
{ 
    try 
    { 
     var emailChecked = new System.Net.Mail.MailAddress(email); 
     return true; 
    } 
    catch 
    { 
     return false; 
    } 
}