man kan sige hvis du skriver "' OR '1' = '1" eller en af de andre ting man kan skrive og får en fejl så er dit systemt ikke sikret imod sql injections...
Løsningen er at tjekke dine data. Tekst skal du bare udskifte alle ' med to. Det gøres med en simpel replace() Tal skal du bare tjekke også er tal. Det gøres med isnumeric() I dit tilfælde skal du bare gøre:
NewFileName = replace(NewFileName,"'","''") if not isnumeric(UID) then response.write "Skal være et tal" response.end '<-- stopper kode afvikling end if Connect.Execute("UPDATE Users SET `Picture` = '"& NewFileName &"' WHERE `id` = "& UID)
Så længe du tjekker alle dine ASP variabler, der bruges i SQL-sætningen, med det tilhørerende tjek jeg har lavet, skulle du gerne være 100% sikret mod sql-injections. Datoer skal selvfølgelig også tjekkes, men da de gerne skal formateres rigtigt, gør jeg det nå jeg kører dem igennem min formaterings rutine.
Jeg bruger denne (til MS-SQL formatet yyyymmdd). Den vil kun godtage dd-mm-yyyy formatet som indput, ellers indsættes en default værdi, og jeg ved så at returværdien ikke kan skabe en sql-injections. Kræver også at serveren kører med DK format (session.LCID = 1030)
Function ConvertToSqlDate(dato) dim SQLYear,SQLMonth,SQLDay if MyIsDate(dato) then SQLYear = Year(dato) SQLMonth = Month(dato) SQLDay = Day(dato) if SQLDay<10 then SQLDay = 0&SQLDay end if if SQLMonth<10 then SQLMonth = 0&SQLMonth end if ConvertToSqlDate = SQLYear&SQLMonth&SQLDay else 'Default værdi "1 jan 1900" ConvertToSqlDate = "19000101" end if End Function
function MyIsDate(dato) dim returVal returVal = false if len(dato) = 10 then if isnumeric(left(dato,2)) then if cint(left(dato,2)) >= 1 and cint(left(dato,2)) <= 31 then if isnumeric(mid(dato,4,2)) then if cint(mid(dato,4,2)) >= 1 and cint(mid(dato,4,2)) <= 12 then if isnumeric(right(dato,4)) then if mid(dato,3,1) = "-" and mid(dato,6,1) = "-" then if isDate(dato) then returVal = true end if end if end if end if end if end if end if end if MyIsDate = returVal end function
Der skal mange ting til at tjekke om en dato er rigtig. Det skal jo være en gyldig dato. Man kommer dog et vis stykke med den indbyggede IsDate() funktion, men den har en fejl: isDate("01-31-2004") isDate("31-01-2004") Returnere nemlig begge true, fordi den arbejder med mm-dd-yyyy og dd-mm-yyyy formaterne. Derfor har jeg lavet min egen MyIsDate() funktion.
MyIsDate er altså til at tjekke om datoen er gyldig og ConvertToSqlDate() omdanner dd-mm-yyyy formatet til yyyymmdd med 19000101 som default/error returværdi.
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.