WN

WN (https://www.wn.se/forum/index.php)
-   Serversidans teknologier (https://www.wn.se/forum/forumdisplay.php?f=4)
-   -   Fel med Regular Expression (https://www.wn.se/forum/showthread.php?t=4046)

rille77 2004-10-13 21:31

Nån som kan se vad som är galet den här ASP koden.

Funktionen

Kod:

Function IsAZ09(strCheck)
  With New RegExp
  .IgnoreCase = True
  .Pattern = "^[a-z][0-9][A-Z]$"
  IsAZ09 = .Test(strCheck)
  End With
End Function

Anropet

Kod:

IF NOT IsAZ09(strUser) THEN
 userFel = "2"
 bolFel = True
END IF

Tilldelningen av strUser

Kod:

strUser = Replace(Trim(Request.Form("user")), "'", "''")
Tacksam för hjälp då jag har kört fast helt.

Mikael Simonsson 2004-10-13 22:00

Citat:

Kod:

.Pattern = "^[a-z][0-9][A-Z]$"

Jag skulle gissa på att det är här felet ligger, tyvärr har jag inte möjlighet att testa koden. Som det är skrivet nu måste användarnamnet bestå av 3 tecken, där första måste vara en liten bokstav, andra en siffra osv.

Prova att ändra till:

Kod:

.Pattern = "^[a-z0-9]+$"
Du behöver inte ha med A-Z när du använder:

Kod:

.IgnoreCase = True

Mikael Simonsson 2004-10-13 22:06

Citat:

Kod:

strUser = Replace(Trim(Request.Form("user")), "'", "''")

Kan tillägga att Replace funktionen här är helt onödig då du inte tillåter ' i IsAZ09() och för att undvika fel bör du testa mot SQL-injection när du bygger din SQL-fråga, helst inte tidigare.

rille77 2004-10-13 23:19

Citat:

QUOTE
CODE
strUser = Replace(Trim(Request.Form("user")), "'", "''")



Kan tillägga att Replace funktionen här är helt onödig då du inte tillåter ' i IsAZ09() och för att undvika fel bör du testa mot SQL-injection när du bygger din SQL-fråga, helst inte tidigare.

Stort tack för hjälpen Mikael, är inte så hemma på RegExp än.
Fråga bara, varför bär man inte testa för SQL injections före SQL frågan???

Mikael Simonsson 2004-10-16 13:20

Citat:

Originally posted by rille77@Oct 13 2004, 23:19
Fråga bara, varför bär man inte testa för SQL injections före SQL frågan???
(Ursäkta mitt lite sena svar.)

Jo, för att kunna hantera alla variabler under samma förutsättningar. Säg att du vill skriva ut det felaktiga användarnamnet eller fylla i ett formulär åt användaren, så att användaren kan rätta till sitt fel utan att behöva skriva om allt. Då måste du komma ihåg om du har bytt ut alla ' mot '' för att sen göra det motsatta när du ska skriva ut variablen.

Så en bra regel är att hantera alla variabler som "fientliga", oavsett om du hämtar data från en databas, cookies, Request objektet osv. När du bygger en SQL-fråga testar du mot SQL-injection och när du skriver ut en variabel använder du Server.HTMLEncode().

Exempel:
Kod:

strUser = Trim(Request.Form("user"))
intUserId = Request.Form("userid")

' Bygga en SQL-fråga (sträng)
strSql = "SELECT * FROM users WHERE username = '" & Replace(strUser, "'", "''") & "'"

' Bygga en SQL-fråga (tal)
strSql = "SELECT * FROM users WHERE userid = " & Int(intUserId)

' Skriva ut en variabel
Response.Write(Server.HTMLEncode(strUser))
Response.Write(Server.HTMLEncode(intUserId))


digiArt 2004-10-16 14:50

Din regexpsträng borde också kunna skrivas som
Kod:

^\w$

Mikael Simonsson 2004-10-16 15:04

Citat:

Originally posted by digiArt@Oct 16 2004, 14:50
Din regexpsträng borde också kunna skrivas som
Kod:

^\w$

Din kod fungerar bara med ett tecken och enligt dokumentationen är \w med underscore:
Citat:

\w - Matches any word character including underscore. Equivalent to "[A-Za-z0-9_]".
Sen är nog "^[a-z0-9]+$" lättare att förstå om man inte jobbar med Reg.Exp ofta.


Alla tider är GMT +2. Klockan är nu 07:20.

Programvara från: vBulletin® Version 3.8.2
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson