Beetje hulp
Ben druk bezig met het leren van PHP en loop tegen een probleempje aan wat ik op Google niet gauw terug kan vinden (gebeurd niet vaak :) ), waarschijnlijk omdat ik niet op de juiste termen zoek. Ik heb een register/login script met activatiemail nu werkend. Op het moment dat iemand
inlogd, wordt gecheckt of het klopt en een session aangemaakt, zo dus:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
}
// bekijk of het formulier verzonden is en de gegevens juist zijn
elseif ($HTTP_POST_VARS["submit"] && $HTTP_POST_VARS["login"] && $HTTP_POST_VARS["pass"])
{
// encrypt pass om te matchen met encrypte pass in de database
$passwd = md5($HTTP_POST_VARS[pass]);
// selecteer login/pass uit de database en match ze met ingevoerde gegevens
$sql = "SELECT id FROM $table WHERE login = '$HTTP_POST_VARS[login]' AND pass = '$passwd' AND activeer IS NULL";
$res = mysql_query($sql);
// bekijk of de gegevens juist zijn
if (mysql_num_rows($res) >= 1)
{
// registreer sessie (of cookie)
$ingelogd = mysql_result($res, 0);
session_register(ingelogd);
// setcookie("ingelogd", "$ingelogd", time() + 1 * 86400);
echo "<p style=\"font-family: Arial, Helvetica, sans-serif; font-size: 13px; color: #000000;\">
U bent succesvol ingelogd.</p>";
echo "<p style=\"font-family: Arial, Helvetica, sans-serif; font-size: 13px; color: #000000;\">
Klik hier om <a href=\"home.php\">verder</a> te gaan.</p>";
}
// zo niet, geef foutmelding
else
{
// bekijk of het formulier verzonden is en de gegevens juist zijn
elseif ($HTTP_POST_VARS["submit"] && $HTTP_POST_VARS["login"] && $HTTP_POST_VARS["pass"])
{
// encrypt pass om te matchen met encrypte pass in de database
$passwd = md5($HTTP_POST_VARS[pass]);
// selecteer login/pass uit de database en match ze met ingevoerde gegevens
$sql = "SELECT id FROM $table WHERE login = '$HTTP_POST_VARS[login]' AND pass = '$passwd' AND activeer IS NULL";
$res = mysql_query($sql);
// bekijk of de gegevens juist zijn
if (mysql_num_rows($res) >= 1)
{
// registreer sessie (of cookie)
$ingelogd = mysql_result($res, 0);
session_register(ingelogd);
// setcookie("ingelogd", "$ingelogd", time() + 1 * 86400);
echo "<p style=\"font-family: Arial, Helvetica, sans-serif; font-size: 13px; color: #000000;\">
U bent succesvol ingelogd.</p>";
echo "<p style=\"font-family: Arial, Helvetica, sans-serif; font-size: 13px; color: #000000;\">
Klik hier om <a href=\"home.php\">verder</a> te gaan.</p>";
}
// zo niet, geef foutmelding
else
{
Dit script gaat nog verder, maar is niet zo van belang. Nu beveilig ik de pagina's zo:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php
session_start();
$host="localhost"; // Host name
$username=""; // Mysql username
$password=""; // Mysql password
$db_name=""; // Database name
$tbl_name="voorbeeld_gebruikers"; // Table name
// Connect to server and select databse.
mysql_connect("$host", "$username", "$password")or die("cannot connect");
mysql_select_db("$db_name")or die("cannot select DB");
if (!$HTTP_SESSION_VARS["ingelogd"])
{
header("Location: login.php");
}
?>
session_start();
$host="localhost"; // Host name
$username=""; // Mysql username
$password=""; // Mysql password
$db_name=""; // Database name
$tbl_name="voorbeeld_gebruikers"; // Table name
// Connect to server and select databse.
mysql_connect("$host", "$username", "$password")or die("cannot connect");
mysql_select_db("$db_name")or die("cannot select DB");
if (!$HTTP_SESSION_VARS["ingelogd"])
{
header("Location: login.php");
}
?>
Mijn vraag is: Ik wil op de homepage zeggen, welkom 'Naam'. Deze naam staat in dezelfde rij in de tabel als de account (bijv 64010722). Hoe roep ik deze aan? Ik wil
dus niet welkom 'Account', ik wil daadwerkelijk de naam die ze opgegeven bij het registeren.
Hopelijk (en ik twijfel er eigenlijk niet aan) weet iemand de oplossing! :)
Alvast Bedankt
Sander
Gewijzigd op 11/03/2011 15:24:09 door Sander Vanier
Gewijzigd op 11/03/2011 14:44:34 door Write Down
Staat op de schoolserver waar niet iedereen zomaar bij kan, maar ik hoor natuurlijk graag van je waar een groot gevaar schuilt. Ik weet dat er enige verouderde code inzit, maar ik het het script hiervandaan en de maker heeft het waarschijnlijk wat ouder geschreven. Ik heb het enkel aangepast naar mijn eigen situatie, wat dingen toegevoegd en wat dingen verwijderd ;)
Of nog leuker, vul is in '; DROP TABLE '$table' (of DROP TABLE users) Boem, te tabel is verwijderd ;-)
mysql_real_escape, google. Verder google ook is superglobals, pas je script aan. Dan pas is het interessant om je verder te helpen met je eigenlijke vraag.
Toevoeging op 11/03/2011 14:55:49:
PHP Beginnershandleiding
SQL Beginnershandleiding
Write Down op 11/03/2011 14:54:21:
Vul als wachtwoord een keertje 'OR1=1 in en geef alle resultaten weer. ...
Je vergist je.
het paswoord wordt door md5() gehaald. md5() geeft een resultaat weer dat 100% injection veilig is.
Dit gezegd zijnde ... er is inderdaad veel werk aan. Verouderde technologie, foute logica (bv. controleren op de post van de submit knop)...
Gewijzigd op 11/03/2011 15:15:06 door Kris Peeters
- Je moet altijd goede foutafhandeling gebruiken op de mysql_* functies.
- Kijken of een formulier gepost is doe je zo:
- Gebruik superglobals. Voor fomulieren is dat $_POST en voor sessies is dat $_SESSION
- Voeg een salt toe aan het wachtwoord.
- Variabelen moeten buiten de quotes
En haal even je gebruikersnaam + wachtwoord weg. Dit staat nu al een tijdje op internet en dus ook in de cache van google, verander dit dus.
Gewijzigd op 11/03/2011 15:16:52 door Wouter J
Sander Vanier op 11/03/2011 15:22:15:
Injection is dus niet meer aan de orde, wat betreft de superglobals...
Wow, niet te vlug he.
Wat ik zeg, is dat $passwd beveiligd is tegen injectieon omdat je de string door md5() hebt gehaald.
Met superglobals moet je juist heel erg opletten. Altijd!
Wat je initiële vraag is ...
We gaan je niet de weg wijzen door een doodlopende straat.
Smijt dat allemaal weg en begin opnieuw. Begin ook onmiddellijk met php5
uurtjes in alle code die berust op wat ik hier gepost heb en dit alles veranderen zie ik niet zitten. Mochten jullie geen antwoord willen geven op mijn vraag, dan wil ik jullie in ieder geval bedanken voor de hulp tot zover en zal ik mijn vraag ergens anders neer moeten gaan zetten. Misschien dan zonder de initiële code ;)
Sander
Je zal bijna altijd zo-iets doen:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<?php
session_start();
$host="localhost"; // Host name
$username=""; // Mysql username
$password=""; // Mysql password
$db_name=""; // Database name
if ($_SERVER['REQUEST_METHOD'] == "POST") { // nooit controleren op de waarde van de submit knop, maar op de request method zelf
// verwerking post gegevens uit formulier
$sql = "
SELECT id
FROM my_table
WHERE
login = '". mysql_real_escape_string($_POST['login']) ."'
AND pass = '". md5($_POST['paswoord']) ."'
AND activeer IS NULL
";
// ... enzovoort
// Nu is de $_POST nog actief. Om die actieve $_POST weg te halen, gaan we redirecten naar de pagina waarop we ons bevinden.
//
header('location: index.php') ;
}
else {
// toon hier je formulier
// Merk op: pas vanaf hier mag je beginnen HTML naar de gebruiker te sturen.
// Er mag niets van HTML worden verstuurd boven (in de code) de functie header(...)
echo '
<form method="post" action="">
<input .../>
<input type="submit" value="OK"/>
</form>';
}?>
session_start();
$host="localhost"; // Host name
$username=""; // Mysql username
$password=""; // Mysql password
$db_name=""; // Database name
if ($_SERVER['REQUEST_METHOD'] == "POST") { // nooit controleren op de waarde van de submit knop, maar op de request method zelf
// verwerking post gegevens uit formulier
$sql = "
SELECT id
FROM my_table
WHERE
login = '". mysql_real_escape_string($_POST['login']) ."'
AND pass = '". md5($_POST['paswoord']) ."'
AND activeer IS NULL
";
// ... enzovoort
// Nu is de $_POST nog actief. Om die actieve $_POST weg te halen, gaan we redirecten naar de pagina waarop we ons bevinden.
//
header('location: index.php') ;
}
else {
// toon hier je formulier
// Merk op: pas vanaf hier mag je beginnen HTML naar de gebruiker te sturen.
// Er mag niets van HTML worden verstuurd boven (in de code) de functie header(...)
echo '
<form method="post" action="">
<input .../>
<input type="submit" value="OK"/>
</form>';
}?>
session_register() heb je niet nodig.
Je kan direct iets doen zoals:
$_SESSION['ingelogd'] = 1;
Zoals je nu bezig bent, zal je nooit ergens geraken. Hoe vlugger je dat beseft, hoe minder je zal moeten beginnen prutsen.
Iedereen van ons heeft al code weggesmeten waar uren werk in is gekropen. Als je dat niet ziet zitten ... Tja, je ziet maar
Gewijzigd op 11/03/2011 16:15:07 door Kris Peeters