PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Loginsystem mit FORM (Method POST)


WarSlash
2008-10-20, 04:18:54
Ich habe in PHP ein Loginsystem geschrieben. Wenn ich mich einloggen will, dann bleibe ich auf der vorriege Seite index.php und das Formular ist noch da.

Eigentlich sollte nach Drücken des Login Buttons das Interface verschwinden und ein nette Meldung "Eingeloggt" stehen.

Das Loginsystem ist extern entwickelt und soll hinterher in index.php includet werden.

Ich könnte action="index.php" zu action="logon.php" verändern um eine neue Seite angezeigt zu bekommen, die nicht mehr das Logininterface anzeigt. Ich will aber auf index.php bleiben und dort die obrige Änderung sehen.

Gibt es eine andere Möglichkeit ohne HEADER() und ohneMeta-Refresh, das ganze zu reloaden?

Bisher nehme ich Meta-Refresh. Das Ergebnis gefällt mir aber nicht. Die Header (paid webspace) kann ich nicht modifizieren, weil ich ja schon Daten geschickt bekommen habe...

Auf einem anderem Webserver kann die Modifizierung vornehmen. Da ist wohl was für die Headers anders eingstellt (FUNPIC).


<?php // userM_CHECK

session_start();

include("zensiert");
include("zensiert");

$sessionid = session_id();

$userdata = getUserInfo();

if (!isLoggedOn()) {

echo '<form action="index.php" method="post">

<p> Username: <input name="Username" type="text" size="50">
<p> Password: <input name="Password" type="password" size="50">

<p><input name="login" type="submit" value="Login">
</form>';

if ($_POST[login]) { login($_POST["Username"],$_POST["Password"]); echo '<meta http-equiv="refresh" content="0; URL=index.php">'; }

} else {
echo "<p>You 're logged on as User: ";
echo $userdata['Username'];

echo '<form action="index.php" method="post">
<p><input name="logout" type="submit" value="Logout">
</form>';


if ($_POST[logout]) {
logout($userdata['Username']);
echo '<meta http-equiv="refresh" content="0; URL=index.php">';

}
}
?>

Kinman
2008-10-20, 08:16:39
Zeig mal deine login() sowie isLoggedOn() Funktion, sonst kann ich Dir nicht weiterhelfen.

mfg Kinman

WarSlash
2008-10-20, 17:43:16
Bitte!
function login ($getusername, $getpassword) {


$select_user = "SELECT
*
FROM
userM_USERS
WHERE
Username = '$getusername'
";

$result = mysql_query ($select_user);

if (mysql_num_rows ($result) > 0) {
$data = mysql_fetch_array ($result);

$checkpw = _mencrypt($getpassword,MD5($getpassword.$getusername));

if ( $checkpw == $data["Password"]) {
$SessionID = session_id();

$update_sessionid = "UPDATE userM_USERS SET SESSIONID = '$SessionID' WHERE Username = '$getusername'";

$result = mysql_query ($update_sessionid);
}
else {
echo 'Username or Passworld is invalid!';
}
}
else {
echo 'Username does not exist!';
}

function isLoggedOn () {

$SessionID = session_id();

$select_sessionid = "SELECT
*
FROM
userM_USERS
WHERE
SESSIONID = '$SessionID'
";

$result = mysql_query ($select_sessionid);

if (mysql_num_rows ($result) > 0) {
$data = mysql_fetch_array ($result);

return true;
}
else return false;

}


}

rotalever
2008-10-20, 17:47:42
Das ist sehr unsicher.
z.B.

"SELECT * FROM userM_USERS WHERE SESSIONID = '$SessionID'"

Was würde wohl passieren, wenn jemand $SessionID="' OR '1' = '1" übergibt?

SQL-Queries immer prepared oder parametrisiert. Das ist eine der größten Fehlerquellen.



Zu deiner Frage:
Die Funktion login() kannst du aufrufen, bevor du irgendetwas ausgibst und dann entsprechend die Ausgabe anpassen.

WarSlash
2008-10-20, 18:00:09
Das ist sehr unsicher.
z.B.

"SELECT * FROM userM_USERS WHERE SESSIONID = '$SessionID'"

Was würde wohl passieren, wenn jemand $SessionID="' OR '1' = '1" übergibt?

SQL-Queries immer prepared oder parametrisiert. Das ist eine der größten Fehlerquellen.



Zu deiner Frage:
Die Funktion login() kannst du aufrufen, bevor du irgendetwas ausgibst und dann entsprechend die Ausgabe anpassen.

Ja, SessionID-Injection..., ist ja alles noch nich fertig ^^

zu 2) Ja stimmt, aber das Interface soll ja verschwinden, ich brauch nen Refresh! EDIT: Ich habe nee Idee^^

rotalever
2008-10-20, 18:07:53
Ja, SessionID-Injection..., ist ja alles noch nich fertig ^^

zu 2) Ja stimmt, aber das Interface soll ja verschwinden, ich brauch nen Refresh! EDIT: Ich habe nee Idee^^
Wenn man auf den Button zum einloggen drückt, dann wird ja die Seite neugeladen. Dann kannst du dem Browser liefern, was dir Spaß macht. Von daher versteh ich das Problem nicht. Außer in deiner index.php gibst du vorher schon text aus. Das würde ich lassen.

WarSlash
2008-10-20, 18:33:43
Wenn man auf den Button zum einloggen drückt, dann wird ja die Seite neugeladen. Dann kannst du dem Browser liefern, was dir Spaß macht. Von daher versteh ich das Problem nicht. Außer in deiner index.php gibst du vorher schon text aus. Das würde ich lassen.


Wenn der Button gedrückt wird und bei action="index.php" steht und die selbige Datei index.php heißt, in der Code für den Button ausgeführt wird, dann bleibt das Interface da. Es ensteht kein Refresh!

ich würde über Header() nun manipulieren können, nur erlaubt mir die tolle Servereinstellung auf meinem Space das nicht. Ich kanns auch nich ändern, weil ich kein Vollzugriff auf die php.ini habe.

Sephiroth
2008-10-20, 19:01:57
Wenn der Button gedrückt wird und bei action="index.php" steht und die selbige Datei index.php heißt, in der Code für den Button ausgeführt wird, dann bleibt das Interface da. Es ensteht kein Refresh!
Das mag so aussehen, als ob das Interface bleibt, aber in Wahrheit wird es nur wieder angezeigt. Es liegt doch nur an dem Skript (index.php), was passiert und was ausgegeben wird, wenn die Aktion ausgeführt und beendet wurde.
Möglicherweise (aber imo eher unwahrscheinlich) liegt es am Client oder Proxy, der zu aggressiv cached. Dann kannst du
session_cache_limiter('private');
verwenden, damit nicht gecached wird.

WarSlash
2008-10-20, 19:23:02
Das mag so aussehen, als ob das Interface bleibt, aber in Wahrheit wird es nur wieder angezeigt. Es liegt doch nur an dem Skript (index.php), was passiert und was ausgegeben wird, wenn die Aktion ausgeführt und beendet wurde.
Möglicherweise (aber imo eher unwahrscheinlich) liegt es am Client oder Proxy, der zu aggressiv cached. Dann kannst du
session_cache_limiter('private');
verwenden, damit nicht gecached wird.

Deshalb ist ja auch der Inhalt nach dem POST geschlöscht.

Ja, ich habe gepennt, natürlich ist die Abfrage beendet und es ist klar, dass das Interface bleibt. Würde ich nochmal dann auf Login klicken, gehste wieder am Anfang los...

Ich muss nach drücken des Buttons im Quellcode wieder zu if (!isLoggedOn()) springen.

rotalever
2008-10-20, 20:55:46
Ich muss nach drücken des Buttons im Quellcode wieder zu if (!isLoggedOn()) springen.
:confused:
Der Quellcode wird komplett neu abgearbeitet, wenn der Benutzer den Button drückt. Der Browser des Benutzers ruft nämlich die Webseite neu auf mit entsprechenden GET/POST Parametern. Du musst also lediglich dein login() vor die if-Abfrage machen und fertig.

WarSlash
2008-10-20, 21:34:04
:confused:
Der Quellcode wird komplett neu abgearbeitet, wenn der Benutzer den Button drückt. Der Browser des Benutzers ruft nämlich die Webseite neu auf mit entsprechenden GET/POST Parametern. Du musst also lediglich dein login() vor die if-Abfrage machen und fertig.

DANKE!!!

Das habe ich völlig außer Acht gelassen. Oh mann...

GEFIXT
DANKE NOCHMAL

<?php // userM_CHECK © 2008 WarSlash

session_start();

include("_config/mysql_config.php");
include("_inc/functions.php");


login($_POST["Username"],$_POST["Password"]);

$userdata = getUserInfo();

if ($_POST['logout']) logout($userdata['Username']);

unset($_POST);

if (!isLoggedOn()) {

echo '<form action="index.php" method="post">

<p> Username: <input name="Username" type="text" size="50">
<p> Password: <input name="Password" type="password" size="50">

<p><input name="login" type="submit" value="Login">
</form>';
}
else {

echo '<form action="index.php" method="post">
<p><input name="logout" type="submit" value="Logout">
<input name="logoff" type="hidden" size="50"value="logout">
</form>';

echo "<p>You 're logged on as User: "; echo $userdata['Username'];

}


?>

rotalever
2008-10-21, 18:49:38
Aber bitte dringend die Sicherheitslücken beseitigen, bevor du es online stellst.

WarSlash
2008-10-25, 21:02:25
Du sprichst von Lücken. Wo ist die zweite?

Ich habe inzwischen schon mehrere Sachen angepasst. (Doppelanmeldung mit selber SessionID, $SessionID = mysql_escape_string(session_id()); register form deaktiviert bei Login.)

Auch ohne Escapen kann ich keine SessionID Injection vornehmen. Beim Reload der Seite erhalte, wird das Cookie überschrieben mit einer neuen SessionID.

Eine theoretische direkte SQL-Injection (komplett neues Query mit SELECT, UPDATE, CREATE, etc.) kann nicht stattfinden, da ich nirgendwo direkt SQL-Befehle parsen lassen. So kann niemand direkt die SessionIDs klauen.

EDIT: Ich kann natürlich die SessionID mit eine geheimen Password verschlüsseln. Das Password steht dann in eine PHP Function. Da muss jemand erstmal ran an den FTP kommen.

Was haltet ihr von $_SESSION was bei PHP dabei ist? Mit PHP Code Injection kann man sicher das Teil schnell knacken.

rotalever
2008-10-26, 12:04:21
Du sprichst von Lücken. Wo ist die zweite?

Ich meinte damit nur, dass du generell alle SQL-Queries Prepared mit den Parametern als Argumente (geht mit mysqli gut) machst oder wenigstens alles escapes.

Ach noch was: Es ist eigentlich auch empfehlenswert nicht SELECT * zu machen, sondern explizit das aufzulisten, was man haben will. So werden beim späteren Ändern einer Tabelle (insb. beim löschen von Spalten) Fehler schneller bemerkt.

Wie das mit der PHP-Session funktioniert weiß ich nicht. Ich vertraue lieber auf meine eigene Session-Implementation und generiere meine IDs selber. Das finde ich sicherer. Außerdem kann man dann längere IDs generieren.