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)

codice:
'* #######################################
'* ##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
e ovviamente la pagina degli errori
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)