Willkommen in der Webstatt
User-1 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?
User-2 am 14.05.07 19:25

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

User-3 am 14.05.07 19:38

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

User-1 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?

User-3 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

User-2 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)

User-1 am 14.05.07 20:50

braucht man das auch wenn magic quotes an sind?

User-4 am 14.05.07 21:02

Quote
Original von xyz-177
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" );
}
#**************************************************************************************************

?>

User-5 am 14.05.07 21:25

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

User-6 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().

User-7 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_xyz-65($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.

User-6 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?

User-7 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('xyz-190', '......'),
array('franky', ....),
array('xyz-5', .......)
);

// 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_xyz-65($stmt);
}
}


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

gruß
xyz-126

User-8 am 05.06.07 12:22

Quote
Original von xyz-177
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 xyz-48k 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 xyz-5
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? xyz-48n 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 xyz-19utzung 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