Einzelnen Beitrag anzeigen

Benutzerbild von Amargosa
Amargosa

Registriert seit: 17. Mai 2006
Ort: Offenbach
21 Beiträge
 
#1

Internet Get/Set-Cookie + RC4 = Trouble :/

  Alt 31. Mai 2006, 15:42
Hallo alle

Ich habe mir ein kleines Tool geschrieben das mit Cookies setzt und liest.
Das funktionioert soweit auch richtig.

Nachdem das funktionierte habe ich Hagens RC4 genonnem und drangehängt Danke!

Ich speichere mit den WinInet.InternetSetCookie einen Wert. Dieser Wert wird vorher durch das RC4 gejagt. Dann wird er gespeichert.

Und genau jetzt beginnt das Problem: Beim Speichern dieses verschlüsselten Wertes ändert sich dieser. Ich weiss nicht wodurch. Keine Ahnung ob es am PAnsiChar oder AnsiString liegt oder ob WinInet irgendwas damit macht. Zumindest ist ja nun klar das wenn ich den Cookie Abfrage (InternetGetCookie) der "falsche" Wert gespeichert wurde und die Decodierung durch RC4 nur Mist zur Folge haben kann.
Anbei mein Code. Wäre toll wenn mir jemand helfen könnte oder einen Vorschlag hat.

Danke und Gruß,
Ben

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, WinInet, StdCtrls, Buttons;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    BitBtn1: TBitBtn;
    procedure Button2Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  sSaved, sGet: String;

const
  cKeyCode: String = '148576298388';

implementation

{$R *.dfm}

uses RC4;

//Funktion zum stzen des Cookies
//Funktioniert einwandfrei
//Cookie wird auf Festplatte geschrieben und bleibt auch
procedure SetCookie(sValue: String);
var
  bReturn: Boolean;
  pCookiename, pURL, pValue: PAnsiChar;
  sTemp: String;

begin
  pCookiename := PAnsiChar('TestData');
  pURL := PAnsiChar('http://localhost');

  sValue := RC4Code(sValue, cKeyCode);
  sSaved := sValue;

  { //Vergleich alls String und Ansi, kein Unterschied
  sTemp := 'Normal value: ' + sValue;
  sTemp := sTemp + ' Pansi value: ' + PAnsiChar(sValue);
  ShowMessage(sTemp);
  }


  pValue := PAnsiChar(sValue + '; expires = Sat, 01-Jan-2007 00:00:00 GMT');
  bReturn := InternetSetCookie(pURL, pCookiename, pValue);
  if(not bReturn) then ShowMessage('FALSE SetCookie');
end;

function GetCookie: String;
var
  pURL, pName: PAnsiChar;
  pData: AnsiString;
  cSize, cError: Cardinal;
  bResult: Boolean;
  sString2, sString: String;
  iPos, iX: Integer;

begin
  pURL := PAnsiChar('http://localhost');
  pName := PAnsiChar('TestData');
  cSize := 255;
  pData := '';
  bResult := FALSE;

  //ShowMessage('1 try');
  try
    InternetGetCookie(pURL, pName, nil, cSize);
  except
    on E: Exception do begin
      cError := Windows.GetLastError();
      if(cError = ERROR_NO_MORE_ITEMS) then begin
        ShowMessage('ERROR_NO_MORE_ITEMS');
      end;
      if(cError = ERROR_INSUFFICIENT_BUFFER) then begin
        ShowMessage('ERROR_INSUFFICIENT_BUFFER');
      end;
      ShowMessage(E.Message+' '+IntToStr(E.HelpContext));
      exit;
    end;
  end;

  pURL := PAnsiChar('http://localhost');
  pName := PAnsiChar('TestData');
  SetLength(pData, cSize);
  //ShowMessage('2 try');
  try
    bResult := InternetGetCookie(pUrl, pName, PAnsiChar(pData), cSize);
  except
    on E: Exception do begin
      cError := Windows.GetLastError();
      if(cError = ERROR_NO_MORE_ITEMS) then begin
        ShowMessage('ERROR_NO_MORE_ITEMS');
      end;
      if(cError = ERROR_INSUFFICIENT_BUFFER) then begin
        ShowMessage('ERROR_INSUFFICIENT_BUFFER');
      end;
      ShowMessage(E.Message+' '+IntToStr(E.HelpContext));
      exit;
    end;
  end;
  if(bResult = FALSE) then begin
    ShowMessage('GET COOKIE FALSE');
    exit;
  end;
  if(bResult = TRUE) then begin
    ShowMessage('PAnsi Data: ' + pData); //Daten werden verändert gelesen
    SetLength(sString, Length(pData));
    sString := pData;
    iPos := 0;
    for iX := 0 to Length(sString) do begin
      if(sString[iX] = '=') then begin
        iPos := iX;
        break;
      end;
    end;
    if(iPos <> 0) then begin
      SetLength(sString2, (Length(sString) - iPos));
      //Alternativ benutze ich hier auch (Length(sString))-1
      sString2 := Copy(sString, (iPos+1), (Length(sString)));
      ShowMessage('sString2: ' + sString2);
      sString2 := RC4Code(sString2, cKeyCode);
      sGet := sString;
    end;
    ShowMessage('GET COOKIE TRUE - Cookie: ' + sString2);
    Result := pData;
  end;
end;


procedure TForm1.Button1Click(Sender: TObject);
begin
  SetCookie('doof22_dumm11');
end;

procedure TForm1.Button2Click(Sender: TObject);
var
 sString: String;

begin
  sString := '';
  sString := GetCookie;
  ShowMessage('Compare - Saved: ' + sSaved + ' to: ' + sGet);
end;

end.
P.S.: Hagen's RC4 ist unverändert. Daran wurde nix gemacht bis auf den RC4Seed zu ändern.
  Mit Zitat antworten Zitat