Webstatt.org - Community seit 2006 - 2012 (2024?)

Login + Sicherheit

Avatar user-287
14.05.2007 17: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.

user-343
14.05.2007 17:25

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

Avatar user-162
14.05.2007 17:38

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

Perfection is not when there’s nothing to add, but when there’s nothing to take away swisscheek.com/magazine
Avatar user-287
14.05.2007 17:40

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

Avatar user-162
14.05.2007 17: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

Perfection is not when there’s nothing to add, but when there’s nothing to take away swisscheek.com/magazine
user-343
14.05.2007 18:14

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

Avatar user-287
14.05.2007 18:50

braucht man das auch wenn magic quotes an sind?

user-115
14.05.2007 19:02

Original von user-287
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" );
}
#**************************************************************************************************

?>

Avatar user-182
14.05.2007 19:25

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

Seid ihr auch schon wix'r? xD
Avatar user-300
14.05.2007 19: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().

Avatar user-236
14.05.2007 20: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.

signature in progress
Avatar user-300
14.05.2007 20: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?

Avatar user-236
14.05.2007 20: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', '......'zwinkern,
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

signature in progress
Avatar user-194
05.06.2007 10:22

Original von user-287
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 user-158k 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.).

Original von user-115
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...).


<?php

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

Das soll wohl register_globals ruckgängig machen? user-158n 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 user-129utzung initialisiert stellt register_globals kein Sicherheitsrisiko dar und muss auch nicht rückgängig gemacht werden.

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.

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