Avatar billede ReneDahl Praktikant
02. november 2011 - 20:46 Der er 14 kommentarer

Kryptering af en querlystring, Men hvordan?

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 :)
Avatar billede Syska Mester
02. november 2011 - 20:56 #1
Man er vel logget ind som en bruger ... og derfor har man et bruger id.

Kan du ikke tjekke op mod brugerid og mailid og se om man ejer den mail, og dermed har lov til at se den?
Avatar billede arne_v Ekspert
02. november 2011 - 20:56 #2
Du boer kode saaledes at du eksplicit soerger for kun at vise email til den bruger der har modtager email.

Security by obscurity holder ikke.
Avatar billede arne_v Ekspert
02. november 2011 - 20:58 #3
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.
Avatar billede ReneDahl Praktikant
02. november 2011 - 21:12 #4
#1

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..
Avatar billede Syska Mester
02. november 2011 - 21:23 #5
Lyder som om du henter alle mails ud .... og derefter sortere fra, håber jeg ikke. I hvert fald bør du gøre det før.


userid som kommer fra session til at hente liste med mails.

Når du skal hente en mail skal du så bruge userid og mailid. mailid fra query string og userid fra session.

mvh
Avatar billede arne_v Ekspert
02. november 2011 - 22:53 #6
En ganske simpel WHERE naar der hentes ud af databasen.
Avatar billede ReneDahl Praktikant
02. november 2011 - 23:45 #7
Ja men den kan godt finde de forskellige mails med den her sql:

select * from tblindbakke where fldid

Men ud skriver det hele via en foreach..

eks:

foreach (DataRow row in MailFac.ReadMail(ID).Rows)

Der kan den godt finde de forskellige mails, pga ID'et

Men putter jeg så mit UserUD fra min session så kan den ikke vise mine mails

eks:

Convert.ToInt32(Session["UserID"])
Avatar billede Syska Mester
02. november 2011 - 23:55 #8
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"] ?
Avatar billede Thomas_E Nybegynder
03. november 2011 - 10:02 #9
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 :

  private static Encoding utf = new UTF8Encoding();
    private static Rijndael aes = new RijndaelManaged();
    private static byte[] iv = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 };

  public string EncryptText(string plain, string key)
    {

        ICryptoTransform encrypt = aes.CreateEncryptor(utf.GetBytes(key), iv);
        return Convert.ToBase64String(encrypt.TransformFinalBlock(utf.GetBytes(plain), 0, utf.GetByteCount(plain)));

    }

    public string DecryptText(string cipher, string key)
    {

        ICryptoTransform decrypt = aes.CreateDecryptor(utf.GetBytes(key), iv);
        byte[] b = Convert.FromBase64String(cipher);
        return utf.GetString(decrypt.TransformFinalBlock(b, 0, b.Length));

    }
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
Avatar billede ReneDahl Praktikant
03. november 2011 - 15:46 #10
jeg har en where med  í min sql.

Mit UserID er bare det almindelige bruger ID.

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..



            foreach (DataRow row in MailFac.ReadMail(_ID1).Rows)
            {
                litReadMail.Text += row["fldEmne"] + "<br/>";
                litReadMail.Text += row["fldBesked"] + "<br/>";

               
            }

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.
Avatar billede Syska Mester
03. november 2011 - 16:03 #11
_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.
Avatar billede ReneDahl Praktikant
03. november 2011 - 16:05 #12
mhm ja skal nok lige prøve at forklare mig bedre næste gang :)
Avatar billede Thomas_E Nybegynder
28. september 2012 - 08:41 #13
lukker
Avatar billede arne_v Ekspert
28. september 2012 - 19:42 #14
????
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester