Jeg har lavet en indbakke til forskellelige brugere på et site jeg er ved at lave.. Når man sender en mail til hver enkelt bruger. bliver de sorteret rigtig nok. Men når man nu vil læse en mail og klikker på den. Så bliver den vist via en querlystring.
Så langt så godt. men ændre man så ID'et så får man en anden mail frem. og det er jo logisk nok. Men ikke sikkert at man kan se andres mails.
Men derfor vil selve querlystringen/adresse urlen, krypteres
kender i nogle guide hvordan man kan gøre det, må i gerne lige sige til :)
Det er nemt nok at bruge f.eks. SHA256 af et eller andet (eksempelvist: afsender + modtager + subject + tid) som id og det vil ikke vaere muligt at gaette. Men det er altsaa den forkerte loesning.
Ja man logger ind via et bruger ID. Når man logger ind tjekker den om Brugernavn og Pass passer sammen.
I min foreach, hvor jeg henter mine mails ind. Kommer de rigtige godt nok ind. Men det er jo os fordi den gør det via bruger session a la det her "Convert.ToInt32(Session["UserID"])).Rows"
Så tænkte jeg før den skal jo bare vise de enkelte mails på samme måde. Men det så der den fejler. Den viser samme indhold i alle mails. Derfor valgte jeg at den skulle vise mailsne. via deres id og ikke en session. Men det er jo så problemet her. man se andre mails hvis man bare ændre tallet i querlystringen.
den eneste måde jeg tænkte jeg kunne lave det sikker på. var så at krypter den querlystring når man er inde og læse den enkelte mail..
#2
Ja den burde vise mails der hører til hver bruger, når jeg i min foreach. siger at den skal tage efter bruger IDet som er logget ind..
1. Lad være med at bruge SELECT * ... skriv de columns ind du vil have. Det andet kan senere medføre mærkelige performance progroblemer.
Ja ... du skal heller ikke have mail id med i den første. Der er det korrekt og tage "ID" som jeg går ud fra er dit userid. Jeg kan kun gætte mig frem med den skrabet information du giver mig.
Dit userid fra session ? Hvad er det andet id ? Kan vi få lidt mere kontekst så vi ved hvad du snakker om ?
Hvorfor kan du ikke bruger dit Session["UserID"] ?
Det lyder mig noget risikablet at man via ændringer i url'en har se andres mails.
1. Inde i DB må de enkelte mails være linket sammen med en bruger konto. Som Buzzzz siger et userid som jeg vil gå udfra at du har liggende i en sessions variable så som Session["UserID"], så at når du laver dit sql select call tjekker om der er et match mellem den valgte mail og userid eks.
SELECT* FROM Mails WHERE Uderid = @UserId AND Id = @Id
men samtidig vil jag som du også ligger op tili din post kryptere querystring værdien. Her under er en funktion det kan krypter en string og en du kan bruge til at dekrypter den med igen :
} Den "Key" det skal bruges til at krypter og dekrypter skal være på 24 tegn f.eks. DetteErKrypteretTekst!?!
For at sikre dig mod evt. "Angrab" vi jeg hvis du ikke bruger Storeproccedures sikre at de Querystring værdier der bliver sat ind i dit SQL kald er tjekket om det er et tal og hvis der også er tekst så sikre at de enden de indsættes html encodes så der ikke er mulig hed for sql injections
Og ja jeg overvejer jo at krypter ID. Når man læser mailen så andre ikke kan tilgå andres mail.
Her er et eksempel, men jeg har lavet den Sql sætning om 100 gange.. har siger jeg selvfølge bare den skal tage efter mailID'et. Eller måske skulle lave en join. hvor den tager efter bruget ID'et og hvilen bruger der logget ind.
public DataTable ReadMail(int ID) {
_cmd = new MySqlCommand("select * from tblindbakke where fldid=" + ID); _cmd.Parameters.Add("?ID?", MySqlDbType.Int32).Value = ID;
return _objConn.GetData(_cmd); }
Men lige så snart jeg kalder på den her metode i min forach vist forneden, så går det galt. når jeg ligger UserID ind som parameter..
Men vælger jeg at sige. at den skal bruge et ID. så kan den godt finde de forskellige mails. Men som sagt går det galt hvis jeg hiver userID ind i hvor _ID1 er. UserID vist forneden..
Convert.ToInt32(Session["UserID"])
Den burde bare vise de mails UD fra UserID i min session, den ved jo hvilket ID der er logget ind.
_cmd = new MySqlCommand("select * from tblindbakke where fldid=?ID"); _cmd.Parameters.Add("?ID", MySqlDbType.Int32).Value = ID;
Er ret overbevist om din tidligere syntax er 100% forkert, prøv med overstående.
Jeg ville omdøbe dine felter, så de er nemmere for andre brugere at læse.
Det kan ikke tage mange sekunder at tilføje userid til din sql:
_cmd = new MySqlCommand("select * from tblindbakke where userid = ?UserId AND id=?Id"); _cmd.Parameters.Add("?Id", MySqlDbType.Int32).Value = ID; _cmd.Parameters.Add("?UserId", MySqlDbType.Int32).Value = UserId;
Derudover så lige tage UserId med til din Method.
Fixes and secure.
Hvad betyder "går galt" ... tager din computer på indkøb i et supermarked? Tænder den for vandet på badeværelset? Hvad er det som "går galt" ... se om du ikke kan komme med lidt mere forklaring til det som "går galt" ellers ender vi med at gætte på hvad der går galt ... og ja, der er rimelig mange muligheder for hvad der kan gå galt.
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.