Willkommen in der Webstatt Zum Webstatt Blog und Stories
Rebel4s Rebel4s am 14.05.07 19:16

Hallo,
was kann man machen, um einen Login möglichst sicher zu machen.
Also wie kann man verhindern, dass z.B. durch die Usereingaben was manipuliert wird.
Also allgemein, dass man sich nicht reinhacken kann. Dazu gehört auch die Sicherheit der Sessions und wie man dann die geschützten Seiten auch am besten sichern kann.

Ich glaube das ist ein wichtiges Thema. Wir können hier ja mal Ideen sammeln.

netcup.de Warum gibt es hier Werbung?
Wasili am 14.05.07 19:25

Usereingaben sicher machen?
Geht ganz einfach mit der mysqli-Erweiterung ung "mysqli_prepare()", "mysqli_bind_param()" und "mysqli_execute()". :)

der_nic der_nic am 14.05.07 19:38

oder MySQL mysql_real_escape_string() verwenden. Dann kannst du Injections ausschliessen.
Grundsätzlich solltest du dich daran gewöhnen, sämtliche Eingaben vom User zu überprüfen.

Rebel4s Rebel4s am 14.05.07 19:40

bringt eigentlich mysql_real_escape_string() das gleiche wie addslashes()?
Gibt es die mysqli-Erweiterungen auch für die normalen mysql abfragen?

der_nic der_nic am 14.05.07 19:43

Du solltest eher mysql_real_escape_string() nehmen, weil diese Funktion explizit für die Verwendung mit MySQL-Datenbanken existiert. Und ich glaube gelesen zu haben, dass addslashes() nicht alle gefährliches Zeichen escaped

Wasili am 14.05.07 20:14

mysql_real_escape string maskiert auch noch \0 und manch andere Zeichen. (\r, \n, Ctrl+Z... ka was das ist)

Rebel4s Rebel4s am 14.05.07 20:50

braucht man das auch wenn magic quotes an sind?

abu am 14.05.07 21:02

Quote
Original von Rebel4s
braucht man das auch wenn magic quotes an sind?


Naja sichern kann man wohl nie genug. Hier mein Sicherung Code:

<?php

// Unset GETs
foreach ($_GET as $key => $value) {

unset($$key);

}

foreach ($_POST as $key => $value) {

// wenn man die quote option nicht gesetzt hat
$_POST[$key] = addslashes($value);

}

# Security Check QUERY_STRING *********************************************************************
$security_query = $_SERVER['QUERY_STRING'];
$security_bad_words = array(
'chr(', 'wget', 'cmd=', 'rush=',
'union', 'UNION', 'echr(', 'esystem(',
'cp%20', 'mdir%20', 'mcd%20', 'mrd%20',
'rm%20', 'mv%20', 'rmdir%20', 'chmod(',
'chmod%20', 'chown%20', 'chgrp%20', 'locate%20',
'grep%20', 'diff%20', 'kill%20', 'kill(',
'killall', 'passwd%20', 'telnet%20', 'vi(',
'vi%20', 'INSERT%20INTO','SELECT%20', 'alert(document',
'DELETE%20', 'UPDATE%20', 'JOIN%20'
);
$security_result = str_replace($security_bad_words, '*', $security_query);
if ($security_result != $security_query) {
die( "Hacking attempt" );
}
#**************************************************************************************************

?>

Franky Franky am 14.05.07 21:25

mir reicht mein addslashes().. z.B.:
mysql_query('INSERT INTO user SET username = "'.addslashes($_POST['username']).'"');

sili sili am 14.05.07 21:29

Ich würde mich nicht auf die Einstellung der magic_quotes verlassen. Ein get_magic_quotes_gpc() hilft hier aber.
Allgemein verwende ich in meiner Datenbank-Klasse mysqli_real_escape_string().

mab mab am 14.05.07 22:29

wenn du ganz fortschrittlich und sicher vorgehen willst, dann kannst du die eingabeparameter einfach "binden".

das machst so:

$data1 = $_POST['data1'];
$data2 = $_POST['data2'];

$sql = 'INSERT INTO table VALUES (?, ?)
$stmt = mysqli_stmt_init($database);
...
...
mysqli_stmt_bind_param($stmt, 'si', $user, $host, $pass);

// und ausführen
mysqli_stmt_execute($stmt);



Toll daran ist, dass du eine Typisierung erzwingen kannst. du brauchst weder mysql_real_escape_string() noch intval().

Mit "si" bestimmst du dass der erste Parmater ? vom Typ String ist und der zweite Parameter ? vom Typ Integer.

sili sili am 14.05.07 22:31

Sowas ähnliches habe ich für mein Klasse geschrieben. Aber was bringt das denn genau für einen Vorteil, wenn ich diese Befehle benutzen?

mab mab am 14.05.07 22:45

wie gesagt, erst mal entfallen mysql_real_escape_string() noch intval(). außerdem sind die statements vorgefertigt, was dir bei großen abfragen performance vorteile bringt.

sagen wir du hast ein fettes array, das per foreach durchlaufen wird:

$users = array(array('sili', '......'),
array('franky', ....),
array('abu', .......)
);

// Statement
$sql = 'INSERT INTO table VALUES (?, ?, ....);

$stmt = mysqli_stmt_init($database);

if(mysqi_stmt_prepare($stmt, $sql){

foreach($users as $users){

list($username, ......) = $user;

// bereits festgelegtes statement reinhauen
mysqli_stmt_execute($stmt);
}
}


wie du siehst liegt das statement außerhalb der schleife. das ganze ist auch sicher und muss nur einmal gebunden werden

gruß
mab

hoffie hoffie am 05.06.07 12:22

Quote
Original von Rebel4s
braucht man das auch wenn magic quotes an sind?

Magic quotes war eines der dümmsten Features in PHP, die es je gab und verschwindet Gott sei Dank mit PHP6. Das einzig richtige, was man bei magic_quotes_gpc machen kann, ist, das ganze rückgängig zu machen (stripslashes()). magic_quotes macht intern das gleiche wie addslashes(). Und addslashes() ist für die meisten Datenbankqueries schlicht und einfach falsch. Man hat immer die zum DBMS gehörende Funktion zum Escapen zu verwenden (oder Prepared Statements, wie schon erwähnt), andernfalls lässt sich das ganze in bestimmten Fällen sehr leicht umgehen (z.B. bei Multibyte-Charsets usw.).

Quote
Original von abu
Naja sichern kann man wohl nie genug. Hier mein Sicherung Code:

Das ist absoluter Unsinn. Einfach mal auf gut Glück alle erdenklichen Sicherungsmaßnahmen anwenden ist wirklich doof. Das haben schon viele Projekte versucht und sind kläglich damit gescheitert (ich hab da Webspell und phpkit im Hinterkopf...).

Quote
<?php

// Unset GETs
foreach ($_GET as $key => $value) {
unset($$key);
}

Das soll wohl register_globals ruckgängig machen? Dann ist das schonmal unvollständig und kann unschöne Folgen haben. Man denke an Sachen wie $_GET['_GET'] usw.
Sinnvoll ist das aber in keinem Fall. Wenn man brav seine Variablen vor der Benutzung initialisiert stellt register_globals kein Sicherheitsrisiko dar und muss auch nicht rückgängig gemacht werden.

Quote
foreach ($_POST as $key => $value) {
// wenn man die quote option nicht gesetzt hat
$_POST[$key] = addslashes($value);
}

Ebenfalls sinnlos (Erklärung siehe oben). Quasi magic_quotes, nur im Userspace.

Quote
# Security Check QUERY_STRING *********************************************************************
$security_query = $_SERVER['QUERY_STRING'];
$security_bad_words = array(
'chr(', 'wget', 'cmd=', 'rush=',
'union', 'UNION', 'echr(', 'esystem(',
'cp%20', 'mdir%20', 'mcd%20', 'mrd%20',
'rm%20', 'mv%20', 'rmdir%20', 'chmod(',
'chmod%20', 'chown%20', 'chgrp%20', 'locate%20',
'grep%20', 'diff%20', 'kill%20', 'kill(',
'killall', 'passwd%20', 'telnet%20', 'vi(',
'vi%20', 'INSERT%20INTO','SELECT%20', 'alert(document',
'DELETE%20', 'UPDATE%20', 'JOIN%20'
);
$security_result = str_replace($security_bad_words, '*', $security_query);
if ($security_result != $security_query) {
die( "Hacking attempt" );
}
#**************************************************************************************************

Das lässt sich sowas von leicht umgehen (Groß-/Klein-Schreibung, urlencoded, alternative Kommandos [wget -> curl, grep -> perl] usw).... schreibt sicheren Code und macht nicht so einen Unsinn.

Creative Commons Lizenzvertrag
Alle Inhalte des Webstatt-Archivs stehen unter einer Creative Commons Namensnennung - Weitergabe unter gleichen Bedingungen 3.0 Unported Lizenz.

Impressum & Kontakt