Jeg har lavet et login system, og ville høre hvor sikkert det egenligt er. Det fungere således: En bruger logger ind ved at taster informationer i en formular. Der bliver herefter tjekket op på om de indtastede informationer findes i en database. Hvis de gør, bliver der sat ind autogenereret kode på 15 cifre som gemmes i en session variable. Herefter kan jeg beskytte mine sider med denne variable.
Men hvor sikkert er det? Hvordan hacker man det? Hvordan kan man evt. lave et mere sikkert login?
Jeg har lige kigget i nogle log filer, og der tyder det på at den sidste der er logget ind, er mig i fredag. Så det kunne godt se ud som om de ikke er logget ind via login filen. Har i nogle forslag til hvordan de så er kommet ind?
Er der nogle muligheder for at de kan have indsat denne linie <script src=--adresse--/b.js></script> via sql-injection, via det ovenstående login script, i denne tabel strSQL = "Insert into CMSLoginLog (LoginDato,Ipadresse,UserId,Adresse) values('" & Dato & "', '" & Request("REMOTE_ADDR") & "', '" & UserId & "', '" & Adresse & "')" conn.execute(strSQL)
Forøvrigt c-lund - hvad med at lukke dit site helt, så længe det er inficeret. Du linker direkte til at andre kan blive inficeret - det er squ ikke særlig flinkt.
Der blev lagt en back-up af sitet ud i morges, og hele back-end delen samt login muligheder er blevet fjernet. så sitet fejler på nuværende tidspunkt ikke noget.
Ok, men det er som sagt slet ikke sikkert, at det er via loginsiden, det er sket. Men også ting fra Request.ServerVariables bør selvfølgelig behandles rigtigt inden brug i en sql-sætning, li'som i betydningen: altid.
Nej det er højst sansynligt ikke. Danm der er en del timers arbejde i at få rettet koden, så det ikke kan lade sig gøre. I har vel ikke nogle link, der på dansk fortæller, hvordan man sikre sig i mod SQL-injection.
Ok, indrømmet, det er måske svært at finde på Google. Forklaringen er måske, at der ikke er nogen, der bruger gammeldags ASP i dag, og dem, der alligevel gør det, bruger bare det de lærte for 10 år siden, fra de elendige lærebøger.
Men det er noget i retning af (ganske utestet):
Set cmd = Server.CreateObject ("ADODB.Command") cmd.ActiveConnection = ".......connectionstring....." cmd.CommandText = "SELECT * FROM tabel WHERE navn=?" cmd.Prepared = true cmd.Parameters.Append cmd.CreateParameter("param1", 200, 1, 255, "peter") 'adVarChar Set rs = cmd.Execute
Der skulle være nogle flere ting at søge på, når du har et eksempel.
Hvorfor bruge parameters (prepared statements)? Fordi man lader systemet om at håndtere tekniske detaljer, og fordi man kan være helt sikker på ikke at få SQL-injection.
Parameters er det eneste man gør i dag - burde gøre i hvert fald. Enhver kunde bør afvise software, der ikke gør. Der burde måske endda være en lov ... ;)
Nej. Rent brugermæssigt forhindere du folk i at skrive hvad de vil, og du tager ikke hensyn til trusler du ikke kender.
Alt det er intet problem, såsnart man bruger parameters. Det er egentlig så simpelt.
Men nu skal jeg ikke blande mig i hvad du gør - er du tilfreds med din løsning, så er det ok med mig (sålænge jeg ikke har noget med dit site at gøre).
Nu fik jeg det til at virke med denne: strSQLLogin = "Select * from Live_Medlemmer where Id = ?" set cmd = Server.CreateObject("ADODB.Command") set cmd.ActiveConnection = Conn cmd.CommandText = strSQLLogin cmd.CommandType = adCmdText cmd.Parameters.Append cmd.CreateParameter("param1", 200, 1, 255, Session("MedId")) set rsLogin = cmd.Execute()
Men kunne rigtig godt tænke mig at vide, hvad denne gør cmd.Parameters.Append cmd.CreateParameter("param1", 200, 1, 255, Session("MedId"))
og om det er det samme der skal stå uanset om man laver Select, Insert into, Update, Delete
Som erikjacobsen skriver, så er tallene rent faktisk "koder" som fortæller om parametren er et tal eller en streng eller andet, samt om parametren er en input parameter, eller en output.
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.