noto spesso come molti programmatori, anche non proprio novellini, non eseguano alcun controllo dei dati in entrata (solitamente dalle request, querystring o form che siano)
ho imparato col tempo che controllare ciò che entra nei nostri algoritmi è cosa fondamentale
non sia mai che qualche furbone trovi la gabola e mandi in palla tutto. detta papale papale
per questo mi sono sviluppato una serie di funzioni utili (ovviamente da ampliare) che vi presento qui... (sembra una televendita)
e ovviamente la pagina degli erroricodice:'* ####################################### '* ##FUNC_INT## '* @name cleanLong '* @version 1.0.0 '* @author imente '* @description '* controlla se il valore in entrata è un LONG '* e lo restituisce in tale formato '* nel caso che il valore in entrata non sia LONG '* ne di un tipo compatibile restituisce errore '* --------------------------------------- '* @params '* argValue VAR valore in entrata '* --------------------------------------- '* @return '* LONG valore in uscita '* @##################################### function cleanLong(argValue) on error resume next if argValue = "" then cleanLong = clng(0) else cleanLong = clng(trim(argValue)) end if 'overflow if err.number = 6 then response.redirect("errors.asp?code=0") 'tipo non corrispondente if err.number = 13 then response.redirect("errors.asp?code=1") on error goto 0 end function '* ####################################### '* ##FUNC_INT## '* @name cleanByte '* @version 1.0.0 '* @author imente '* @description '* controlla se il valore in entrata è un BYTE '* e lo restituisce in tale formato '* nel caso che il valore in entrata non sia BYTE '* ne di un tipo compatibile restituisce errore '* --------------------------------------- '* @params '* argValue VAR valore in entrata '* --------------------------------------- '* @return '* BYTE valore in uscita '* @##################################### function cleanByte(argValue) on error resume next if argValue = "" then cleanByte = cbyte(0) else cleanByte = cbyte(trim(argValue)) end if 'overflow if err.number = 6 then response.redirect("errors.asp?code=0") 'tipo non corrispondente if err.number = 13 then response.redirect("errors.asp?code=1") on error goto 0 end function '* ####################################### '* ##FUNC_INT## '* @name cleanLimitedByte '* @version 1.0.0 '* @author imente '* @description '* controlla se il valore in entrata è un BYTE '* e se è minore di un certo valore '* --------------------------------------- '* @params '* argValue VAR valore in entrata '* --------------------------------------- '* @return '* BYTE valore in uscita '* @##################################### function cleanLimitedByte(argValue, argMax) dim tmpvalue tmpvalue = cleanByte(argValue) if tmpvalue > cleanByte(argMax) then response.redirect("errors.asp?code=3&arg=" & argMax) cleanLimitedByte = tmpvalue end function '* ####################################### '* ##FUNC_INT## '* @name cleanString '* @version 1.0.0 '* @author imente '* @description '* controlla se il valore in entrata è un STRING '* e lo restituisce in tale formato '* nel caso che il valore in entrata non sia STRING '* ne di un tipo compatibile restituisce errore '* --------------------------------------- '* @params '* argValue VAR valore in entrata '* argSize LNG valore opzionale che indica la dimensione massima '* --------------------------------------- '* @return '* STRING valore in uscita '* @##################################### function cleanString(byval argValue,argMinSize,argMaxSize) if isnull(argValue) then argValue = "" argValue = replace(trim(argValue),"'","''") '*** SE USATE DATABASE MYSQL TOGLIETE IL COMMENTO 'argValue = replace(trim(argValue),"\","\\") if argMinSize <> 0 then if clng(len(argValue)) < clng(argMinSize) then response.redirect("errors.asp?code=5&arg=" & argMinSize) if argMaxSize <> 0 then if clng(len(argValue)) > clng(argMaxSize) then response.redirect("errors.asp?code=2&arg=" & argMaxSize) cleanString = argValue end function '* ####################################### '* ##FUNC_INT## '* @name cleanField '* @version 1.0.0 '* @author imente '* @description '* controlla che un valore sia compreso '* fra quelli indicati '* --------------------------------------- '* @params '* argValue STRING valore in entrata '* argValues STRING valori validi '* --------------------------------------- '* @return '* STRING valore in uscita '* @##################################### function cleanField(argValue, argValues) dim tmpvalue tmpvalue = normalize(argValue, argValues, "$#$FALSE$#$") if tmpvalue = "$#$FALSE$#$" then response.redirect("errors.asp?code=4") cleanField = tmpvalue end function '* ####################################### '* ##FUNC_INT## '* @name cleanBoolean '* @version 1.0.0 '* @author imente '* @description '* accetta molti formati, e restituisce 0/1 '* --------------------------------------- '* @params '* argValue VAR valore in entrata '* --------------------------------------- '* @return '* BYTE valore in uscita '* @##################################### function cleanBoolean(byval argValue) on error resume next if argValue = "1" then argValue = 1 if argValue = "0" then argValue = 0 if argValue = "True" then argValue = 1 if argValue = "False" then argValue = 0 if argValue = True then argValue = 1 if argValue = False then argValue = 0 cleanBoolean = cbyte(argValue) 'overflow if err.number = 6 then response.redirect("errors.asp?code=0") 'tipo non corrispondente if err.number = 13 then response.redirect("errors.asp?code=1") on error goto 0 end function '* ####################################### '* ##FUNC_INT## '* @name cleanDate '* @version 1.0.0 '* @author imente '* @description '* controlla se è una data, altrimenti restituisce vuoto '* --------------------------------------- '* @params '* argValue VAR valore in entrata '* --------------------------------------- '* @return '* DATE/STRING valore in uscita '* @##################################### function cleanDate(argValue) if isDate(argValue) then cleanDate = cdate(argValue) else response.redirect("errors.asp?code=1") end if end function '* ####################################### '* ##FUNC_INT## '* @name normalize '* @version 1.0.0 '* @author imente '* @description '* normalizza un valore '* --------------------------------------- '* @params '* argValue STRING valore in entrata '* argValues STRING valori validi (delimitati da "|") '* argDefault STRING valore di default '* --------------------------------------- '* @return '* STRING valore in uscita '* @##################################### function normalize(argValue, argValues, argDefault) dim valuesArray, isPresent isPresent = false valuesArray = split(argValues,"|") dim ii for ii=0 to ubound(valuesArray) if cstr(argValue) = cstr(valuesArray(ii)) then isPresent = true next if isPresent then normalize = argValue else normalize = argDefault end if end function
ERRORS.ASP
------------------------------------------------------------------------codice:<% dim skErrorCode, skArgument skErrorCode = request.QueryString("code") skArgument = request.QueryString("arg") select case skErrorCode case "0" skErrorDescription = "overflow" case "1" skErrorDescription = "tipo non corrispondente" case "2" skErrorDescription = "lunghezza eccessiva [ max: " & skArgument & " caratteri ]" case "3" skErrorDescription = "numero troppo grande [ delimitazione posta a " & skArgument & " ]" case "4" skErrorDescription = "il valore indicato non è un valore accettato" case "5" skErrorDescription = "la lunghezza minima del campo è di " & skArgument & " caratteri" case "err" skErrorDescription = skArgument case else skErrorDescription = "errore non definito" end select %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="content-type" content="text/html; charset=iso-8859-1" /> <title>errore</title> </head> <body> <div style="font-family:tahoma,helvetica,serif;font-size:0.9em;margin-top:100px;text-align:center;width:100%;"> <pERRORE <%=skErrorDescription%></p> torna indietro</p> </div> </body> </html>
vediamo di analizzarli uno per uno
cleanLong
preso un valore come unico argomento restituisce un Long.
nel caso il valore non sia numerico o sia un overflow manda alla pagina di errore
cleanByte
preso un valore come unico argomento restituisce un Byte.
nel caso il valore non sia numerico o sia un overflow manda alla pagina di errore
cleanLimitedByte
preso un valore come primo argomento e il valore massimo come secondo argomento restituisce un Byte.
nel caso il valore non sia numerico, sia un overflow o superi il valore massimo manda alla pagina di errore
cleanString
preso un valore stringa, la sua dimensione minima e massima restituisce una stringa valida per l'inserimento dentro a una query SQL.
nel caso la stringa sia più corta o più lunga delle delimitazioni indicate manda alla pagina di errore
normalize
il primo argomento è una stringa, il secondo argomento sono l'insieme delle stringhe valide delimitate da un |, il terzo argomento è il valore da assumere di default nel caso che il primo argomento non sia presente fra le stringhe valide.
es: normalize("test","pippo|pluto|topolino","paperino" ) restituisce "paperino"
es: normalize("topolino","pippo|pluto|topolino","paper ino") restituisce "topolino"
es: normalize("paperino","pippo|pluto|topolino","paper ino") restituisce "paperino"
nel caso in cui un parametro passato da pagina a pagina possa assumere solo un certo numero di valori predefiniti, questa funzione evita che l'utente cerchi di forzare il valore al di fuori dell'insieme di valori accettati
cleanField
il primo argomento è una stringa, il secondo è l'insieme delle stringhe valide delimitata da un |
il meccanismo è molto simile a NORMALIZE, la differenza è che se il valore passato non viene riconosciuto come valido si viene mandati alla pagina di errore
cleanBoolean
preso un valore come unico argomento restituisce un Byte ( di valore 0 o 1).
nel caso il valore non sia numerico o sia un overflow manda alla pagina di errore
cleanDate
controlla e rende una data conforme. se il valore in entrata non è una data o non può essere convertito a data manda alla pagina di errore
------------------------------------------------------------------------
l'utilizzo di queste funzioni è pensato sui valori in entrata (querystring o form) per un controllo immediato prima dell'utilizzo in un algoritmo, oppure per l'inserimento di valori conformi all'interno di una query SQL.
ovviamente si possono creare ampliamenti su altri tipi di variabili e problemi.
per qualsiasi dubbio o domanda sono disponibile
entro breve pubblicherò una pillolina per la gestione completa delle date (sia per visualizzazione che per inserimento in DB)


Rispondi quotando