Dubbel inloggen blokkeren
Jasper Schellekens op 30/03/2015 18:04:40:
Beste scripters!
Ik ben beginnend met PHP.
Ik wil dus op mijn website een blokkade maken voor dubbel login.
Hoe wil ik dit doen?
In de tabel users heb ik online en online2.
online registreert wanneer de klant inlogt( tijdstip datum etc.)
Bij online2 komt na het inloggen inplaats van nee, ja te staan.
Op het moment dat een klant inlogt op mijn website verandert dit.
Nu wil ik zorgen dat de klant niet met een tweede scherm kan inloggen (dubbel login)
Hoe maak ik bij het inloggen iets dat controleert of online2 op ja of nee staat?
Staat die op ja? dan wil ik de foutmelding 'u bent al ingelogd' laten zien.
Staat er nee? dan kan er ingelogd worden.
Hoe kan ik dit doen?
De bestanden mocht het nodig zijn:
login.php
inlogger.php
loggedin.php
<table width="100%">
<tr>
<td align="center">
<br><br><br><br>
<table class="div_popup" align="center">
<tr>
<td>
Je bent ingelogd in het systeem en zal over enkele ogenblikken door worden gestuurd. </td>
</tr>
<tr>
<td>
<br><br>
<a href="/v3/index.php?a=news" class="msg_ok">Klik hier indien je niet automatisch verder gaat.</a>
</td>
</tr>
</table>
</td>
</tr>
</table>
<script language="javascript">
setTimeout("document.location.href='/v3/index.php?a=news'",(1000*2));
</script>
</div>
</td>
</tr>
</table>
</td>
Alvast bedankt!
Toevoeging op 30/03/2015 18:08:41:
Kleine edit: De foutmelding is niet nodig die zit er al bij.
Hij moet alleen het dubbel inloggen blokkeren
Ik ben beginnend met PHP.
Ik wil dus op mijn website een blokkade maken voor dubbel login.
Hoe wil ik dit doen?
In de tabel users heb ik online en online2.
online registreert wanneer de klant inlogt( tijdstip datum etc.)
Bij online2 komt na het inloggen inplaats van nee, ja te staan.
Op het moment dat een klant inlogt op mijn website verandert dit.
Nu wil ik zorgen dat de klant niet met een tweede scherm kan inloggen (dubbel login)
Hoe maak ik bij het inloggen iets dat controleert of online2 op ja of nee staat?
Staat die op ja? dan wil ik de foutmelding 'u bent al ingelogd' laten zien.
Staat er nee? dan kan er ingelogd worden.
Hoe kan ik dit doen?
De bestanden mocht het nodig zijn:
login.php
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 /* ------------------------- */
include("config.php");
if(isset($_POST['login'])) {
$dbres = mysql_query("SELECT * FROM `users` WHERE `login`='{$_POST['login']}' AND `pass`=MD5('{$_POST['pass']}')");
$num = mysql_num_rows($dbres);
if($num > 0) {
$naam = $_POST['login'];
$_POST['login'] = $naam;
$pass = $_POST['pass'];
$_POST['pass'] = $pass;
setcookie("login",'',time()-24*60*60,"/","");
setcookie("validate",'',time()-24*60*60,"/","");
$_SESSION['IP'] = $_SERVER['REMOTE_ADDR'];
$dbres = mysql_query("SELECT *,UNIX_TIMESTAMP(`signup`) AS `signup` FROM `users` WHERE `login`='{$_SESSION['login']}'");
$_SESSION['data'] = mysql_fetch_object($dbres);
if($data->vakantie > 0){
header("Location: $sitelink/index.php?vakantie");
exit;
}
header("Location: inlogger.php?x={$_POST['login']}&pass={$_POST['pass']}");
}
else{
header("Location: $sitelink/index.php?error");
}
}
else if($_GET['x'] == "logout") {
mysql_query("UPDATE `[users]` SET `online`='0000-00-00 00:00:00' WHERE `login`='{$data->login}'");
mysql_query("DELETE FROM `[online]` WHERE `login`='{$_COOKIE['login']}' AND `validate`='{$_COOKIE['validate']}' AND `IP`='{$_SERVER['REMOTE_ADDR']}'");
setcookie("login",'',time()-24*60*60,"/","");
setcookie("validate",'',time()-24*60*60,"/","");
session_destroy();
header("Location: $sitelink/index.php");
}
/* ------------------------- */ ?>
include("config.php");
if(isset($_POST['login'])) {
$dbres = mysql_query("SELECT * FROM `users` WHERE `login`='{$_POST['login']}' AND `pass`=MD5('{$_POST['pass']}')");
$num = mysql_num_rows($dbres);
if($num > 0) {
$naam = $_POST['login'];
$_POST['login'] = $naam;
$pass = $_POST['pass'];
$_POST['pass'] = $pass;
setcookie("login",'',time()-24*60*60,"/","");
setcookie("validate",'',time()-24*60*60,"/","");
$_SESSION['IP'] = $_SERVER['REMOTE_ADDR'];
$dbres = mysql_query("SELECT *,UNIX_TIMESTAMP(`signup`) AS `signup` FROM `users` WHERE `login`='{$_SESSION['login']}'");
$_SESSION['data'] = mysql_fetch_object($dbres);
if($data->vakantie > 0){
header("Location: $sitelink/index.php?vakantie");
exit;
}
header("Location: inlogger.php?x={$_POST['login']}&pass={$_POST['pass']}");
}
else{
header("Location: $sitelink/index.php?error");
}
}
else if($_GET['x'] == "logout") {
mysql_query("UPDATE `[users]` SET `online`='0000-00-00 00:00:00' WHERE `login`='{$data->login}'");
mysql_query("DELETE FROM `[online]` WHERE `login`='{$_COOKIE['login']}' AND `validate`='{$_COOKIE['validate']}' AND `IP`='{$_SERVER['REMOTE_ADDR']}'");
setcookie("login",'',time()-24*60*60,"/","");
setcookie("validate",'',time()-24*60*60,"/","");
session_destroy();
header("Location: $sitelink/index.php");
}
/* ------------------------- */ ?>
inlogger.php
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
<?
include("config.php");
$user1 = mysql_query("SELECT * FROM `users` WHERE `activationcode`='0' AND `login`='{$_GET['x']}' AND `pass`=MD5('{$_GET['pass']}')");
$user = mysql_num_rows($user1);
if($user > 0){
$_SESSION['login'] = $_GET['x'];
$data->login = $_GET['x'];
header("Location: index.php?a=loggedin");
}
else{
header("Location: $sitelink/index.php?error");
}
?>
include("config.php");
$user1 = mysql_query("SELECT * FROM `users` WHERE `activationcode`='0' AND `login`='{$_GET['x']}' AND `pass`=MD5('{$_GET['pass']}')");
$user = mysql_num_rows($user1);
if($user > 0){
$_SESSION['login'] = $_GET['x'];
$data->login = $_GET['x'];
header("Location: index.php?a=loggedin");
}
else{
header("Location: $sitelink/index.php?error");
}
?>
loggedin.php
<table width="100%">
<tr>
<td align="center">
<br><br><br><br>
<table class="div_popup" align="center">
<tr>
<td>
Je bent ingelogd in het systeem en zal over enkele ogenblikken door worden gestuurd. </td>
</tr>
<tr>
<td>
<br><br>
<a href="/v3/index.php?a=news" class="msg_ok">Klik hier indien je niet automatisch verder gaat.</a>
</td>
</tr>
</table>
</td>
</tr>
</table>
<script language="javascript">
setTimeout("document.location.href='/v3/index.php?a=news'",(1000*2));
</script>
</div>
</td>
</tr>
</table>
</td>
Alvast bedankt!
Toevoeging op 30/03/2015 18:08:41:
Kleine edit: De foutmelding is niet nodig die zit er al bij.
Hij moet alleen het dubbel inloggen blokkeren
Toevoeging op 30/03/2015 18:42:12:
Jasper Schellekens op 30/03/2015 18:40:40:
Jasper Schellekens op 30/03/2015 18:04:40:
Beste scripters!
Ik ben beginnend met PHP.
Ik wil dus op mijn website een blokkade maken voor dubbel login.
Hoe wil ik dit doen?
In de tabel users heb ik online en online2.
online registreert wanneer de klant inlogt( tijdstip datum etc.)
Bij online2 komt na het inloggen inplaats van nee, ja te staan.
Op het moment dat een klant inlogt op mijn website verandert dit.
Nu wil ik zorgen dat de klant niet met een tweede scherm kan inloggen (dubbel login)
Hoe maak ik bij het inloggen iets dat controleert of online2 op ja of nee staat?
Staat die op ja? dan wil ik de foutmelding 'u bent al ingelogd' laten zien.
Staat er nee? dan kan er ingelogd worden.
Hoe kan ik dit doen?
Ik heb het hiermee geprobeert maar helaas werkte dit niet:
De bestanden mocht het nodig zijn:
login.php
inlogger.php
loggedin.php
<table width="100%">
<tr>
<td align="center">
<br><br><br><br>
<table class="div_popup" align="center">
<tr>
<td>
Je bent ingelogd in het systeem en zal over enkele ogenblikken door worden gestuurd. </td>
</tr>
<tr>
<td>
<br><br>
<a href="/v3/index.php?a=news" class="msg_ok">Klik hier indien je niet automatisch verder gaat.</a>
</td>
</tr>
</table>
</td>
</tr>
</table>
<script language="javascript">
setTimeout("document.location.href='/v3/index.php?a=news'",(1000*2));
</script>
</div>
</td>
</tr>
</table>
</td>
Alvast bedankt!
Toevoeging op 30/03/2015 18:08:41:
Kleine edit: De foutmelding is niet nodig die zit er al bij.
Hij moet alleen het dubbel inloggen blokkeren
Ik ben beginnend met PHP.
Ik wil dus op mijn website een blokkade maken voor dubbel login.
Hoe wil ik dit doen?
In de tabel users heb ik online en online2.
online registreert wanneer de klant inlogt( tijdstip datum etc.)
Bij online2 komt na het inloggen inplaats van nee, ja te staan.
Op het moment dat een klant inlogt op mijn website verandert dit.
Nu wil ik zorgen dat de klant niet met een tweede scherm kan inloggen (dubbel login)
Hoe maak ik bij het inloggen iets dat controleert of online2 op ja of nee staat?
Staat die op ja? dan wil ik de foutmelding 'u bent al ingelogd' laten zien.
Staat er nee? dan kan er ingelogd worden.
Hoe kan ik dit doen?
Ik heb het hiermee geprobeert maar helaas werkte dit niet:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
<?
include("config.php");
$user1 = mysql_query("SELECT * FROM `users` WHERE `online2`='nee' AND `login`='{$_GET['x']}' AND `pass`=MD5('{$_GET['pass']}')");
$user = mysql_num_rows($user1);
if($user > 0){
$_SESSION['login'] = $_GET['x'];
$data->login = $_GET['x'];
header("Location: index.php?a=loggedin");
}
else{
header("Location: $sitelink/index.php?error");
}
?>
include("config.php");
$user1 = mysql_query("SELECT * FROM `users` WHERE `online2`='nee' AND `login`='{$_GET['x']}' AND `pass`=MD5('{$_GET['pass']}')");
$user = mysql_num_rows($user1);
if($user > 0){
$_SESSION['login'] = $_GET['x'];
$data->login = $_GET['x'];
header("Location: index.php?a=loggedin");
}
else{
header("Location: $sitelink/index.php?error");
}
?>
De bestanden mocht het nodig zijn:
login.php
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 /* ------------------------- */
include("config.php");
if(isset($_POST['login'])) {
$dbres = mysql_query("SELECT * FROM `users` WHERE `login`='{$_POST['login']}' AND `pass`=MD5('{$_POST['pass']}')");
$num = mysql_num_rows($dbres);
if($num > 0) {
$naam = $_POST['login'];
$_POST['login'] = $naam;
$pass = $_POST['pass'];
$_POST['pass'] = $pass;
setcookie("login",'',time()-24*60*60,"/","");
setcookie("validate",'',time()-24*60*60,"/","");
$_SESSION['IP'] = $_SERVER['REMOTE_ADDR'];
$dbres = mysql_query("SELECT *,UNIX_TIMESTAMP(`signup`) AS `signup` FROM `users` WHERE `login`='{$_SESSION['login']}'");
$_SESSION['data'] = mysql_fetch_object($dbres);
if($data->vakantie > 0){
header("Location: $sitelink/index.php?vakantie");
exit;
}
header("Location: inlogger.php?x={$_POST['login']}&pass={$_POST['pass']}");
}
else{
header("Location: $sitelink/index.php?error");
}
}
else if($_GET['x'] == "logout") {
mysql_query("UPDATE `[users]` SET `online`='0000-00-00 00:00:00' WHERE `login`='{$data->login}'");
mysql_query("DELETE FROM `[online]` WHERE `login`='{$_COOKIE['login']}' AND `validate`='{$_COOKIE['validate']}' AND `IP`='{$_SERVER['REMOTE_ADDR']}'");
setcookie("login",'',time()-24*60*60,"/","");
setcookie("validate",'',time()-24*60*60,"/","");
session_destroy();
header("Location: $sitelink/index.php");
}
/* ------------------------- */ ?>
include("config.php");
if(isset($_POST['login'])) {
$dbres = mysql_query("SELECT * FROM `users` WHERE `login`='{$_POST['login']}' AND `pass`=MD5('{$_POST['pass']}')");
$num = mysql_num_rows($dbres);
if($num > 0) {
$naam = $_POST['login'];
$_POST['login'] = $naam;
$pass = $_POST['pass'];
$_POST['pass'] = $pass;
setcookie("login",'',time()-24*60*60,"/","");
setcookie("validate",'',time()-24*60*60,"/","");
$_SESSION['IP'] = $_SERVER['REMOTE_ADDR'];
$dbres = mysql_query("SELECT *,UNIX_TIMESTAMP(`signup`) AS `signup` FROM `users` WHERE `login`='{$_SESSION['login']}'");
$_SESSION['data'] = mysql_fetch_object($dbres);
if($data->vakantie > 0){
header("Location: $sitelink/index.php?vakantie");
exit;
}
header("Location: inlogger.php?x={$_POST['login']}&pass={$_POST['pass']}");
}
else{
header("Location: $sitelink/index.php?error");
}
}
else if($_GET['x'] == "logout") {
mysql_query("UPDATE `[users]` SET `online`='0000-00-00 00:00:00' WHERE `login`='{$data->login}'");
mysql_query("DELETE FROM `[online]` WHERE `login`='{$_COOKIE['login']}' AND `validate`='{$_COOKIE['validate']}' AND `IP`='{$_SERVER['REMOTE_ADDR']}'");
setcookie("login",'',time()-24*60*60,"/","");
setcookie("validate",'',time()-24*60*60,"/","");
session_destroy();
header("Location: $sitelink/index.php");
}
/* ------------------------- */ ?>
inlogger.php
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
<?
include("config.php");
$user1 = mysql_query("SELECT * FROM `users` WHERE `activationcode`='0' AND `login`='{$_GET['x']}' AND `pass`=MD5('{$_GET['pass']}')");
$user = mysql_num_rows($user1);
if($user > 0){
$_SESSION['login'] = $_GET['x'];
$data->login = $_GET['x'];
header("Location: index.php?a=loggedin");
}
else{
header("Location: $sitelink/index.php?error");
}
?>
include("config.php");
$user1 = mysql_query("SELECT * FROM `users` WHERE `activationcode`='0' AND `login`='{$_GET['x']}' AND `pass`=MD5('{$_GET['pass']}')");
$user = mysql_num_rows($user1);
if($user > 0){
$_SESSION['login'] = $_GET['x'];
$data->login = $_GET['x'];
header("Location: index.php?a=loggedin");
}
else{
header("Location: $sitelink/index.php?error");
}
?>
loggedin.php
<table width="100%">
<tr>
<td align="center">
<br><br><br><br>
<table class="div_popup" align="center">
<tr>
<td>
Je bent ingelogd in het systeem en zal over enkele ogenblikken door worden gestuurd. </td>
</tr>
<tr>
<td>
<br><br>
<a href="/v3/index.php?a=news" class="msg_ok">Klik hier indien je niet automatisch verder gaat.</a>
</td>
</tr>
</table>
</td>
</tr>
</table>
<script language="javascript">
setTimeout("document.location.href='/v3/index.php?a=news'",(1000*2));
</script>
</div>
</td>
</tr>
</table>
</td>
Alvast bedankt!
Toevoeging op 30/03/2015 18:08:41:
Kleine edit: De foutmelding is niet nodig die zit er al bij.
Hij moet alleen het dubbel inloggen blokkeren
Verder als ik dit script zie dan schrik ik behoorlijk en raad ik met klem aan deze direct te verwijderen als je dit publiekelijk hebt staan, de fouten zijn aanzienlijk:
- Vreemde tabelnaamgeving,w at is nou het verschil tussen online1 en online2?
- Wachtwoorden via een GET-request meegeven (!!!!!!!) (iedereen kan het wachtwoord zo achterhalen)
- SQL-injection is mogelijk, dus je bent snel gehacked.
- Er mist goede foutafhandeling op je query
- Onnodige [ ] in je tabelnamen (Ik zie het nut daar nog steeds niet van) en onnodige backticks (`).
Mijn advies: Haal het direct offline, en bouw een degelijk goed systeem aan de hand van een goede recente PHP-cursus. Dit script is zo lek als een zeef!
Gewijzigd op 30/03/2015 19:21:29 door - Ariën -
Aar C op 30/03/2015 19:19:25:
Je zou aan de hand van het IP bij kunnen houden of iemand ingelogd is, maar dat heeft meer nadelen op school en bedrijfsnetwerken waar een IP gedeeld wordt. Ik zou eigenlijk ook geen reden zien waarom je niet dubbel ingelogd mag zijn.
Verder als ik dit script zie dan schrik ik behoorlijk en raad ik met klem aan deze direct te verwijderen als je dit publiekelijk hebt staan, de fouten zijn aanzienlijk:
- Vreemde tabelnaamgeving,w at is nou het verschil tussen online1 en online2?
- Wachtwoorden via een GET-request meegeven (!!!!!!!) (iedereen kan het wachtwoord zo achterhalen)
- SQL-injection is mogelijk, dus je bent snel gehacked.
- Er mist goede foutafhandeling op je query
- Onnodige [ ] in je tabelnamen (Ik zie het nut daar nog steeds niet van) en onnodige backticks (`).
Mijn advies: Haal het direct offline, en bouw een degelijk goed systeem aan de hand van een goede recente PHP-cursus. Dit script is zo lek als een zeef!
Verder als ik dit script zie dan schrik ik behoorlijk en raad ik met klem aan deze direct te verwijderen als je dit publiekelijk hebt staan, de fouten zijn aanzienlijk:
- Vreemde tabelnaamgeving,w at is nou het verschil tussen online1 en online2?
- Wachtwoorden via een GET-request meegeven (!!!!!!!) (iedereen kan het wachtwoord zo achterhalen)
- SQL-injection is mogelijk, dus je bent snel gehacked.
- Er mist goede foutafhandeling op je query
- Onnodige [ ] in je tabelnamen (Ik zie het nut daar nog steeds niet van) en onnodige backticks (`).
Mijn advies: Haal het direct offline, en bouw een degelijk goed systeem aan de hand van een goede recente PHP-cursus. Dit script is zo lek als een zeef!
Het gaat hier om een rpg spel.
Het nadeel is dat spelers een gat hebben gevonden om zeg maar te hacken.
Als ze dubbel inloggen en snel klikken dan krijgen ze het 2/3 misschien zelfs 10 keer voor de prijs van 1.
Het verschil tussen online en online2?
Online registreert hoelaat de gebruiker online is geweest.
Online2 verandert na het inloggen de waarde van nee naar ja.
Zoals ik al zei ben ik beginnend met PHP, dat is de reden dat je hier van schrikt denk ik.
Toch wil ik hiermee doorgaan.
Dubbel inloggen blokkeren via een ip-adres wordt hem niet.
Het zou moeten werken via de waarde nee, of ja.
maar hoe?
bedankt voor je reactie.
mvg
Maar je kan de manier van het klikken toch aanpakken? Denk aan 1 maal klikken per 30 seconden.
Ik zou eerst in ieder geval met een schone lei beginnen, als ik jouw was.
Jasper Schellekens op 30/03/2015 19:36:02:
EDIT: Het is niet mogelijk om het wachtwoord te achterhalen. De gegevens staan misschien wel in de URL maar het word geforward. Als je dit wachtwoord kunt achterhalen dan ben je een goeie.
Het gaat hier om een rpg spel.
Het nadeel is dat spelers een gat hebben gevonden om zeg maar te hacken.
Als ze dubbel inloggen en snel klikken dan krijgen ze het 2/3 misschien zelfs 10 keer voor de prijs van 1.
Het verschil tussen online en online2?
Online registreert hoelaat de gebruiker online is geweest.
Online2 verandert na het inloggen de waarde van nee naar ja.
Zoals ik al zei ben ik beginnend met PHP, dat is de reden dat je hier van schrikt denk ik.
Toch wil ik hiermee doorgaan.
Dubbel inloggen blokkeren via een ip-adres wordt hem niet.
Het zou moeten werken via de waarde nee, of ja.
maar hoe?
bedankt voor je reactie.
mvg
Aar C op 30/03/2015 19:19:25:
Je zou aan de hand van het IP bij kunnen houden of iemand ingelogd is, maar dat heeft meer nadelen op school en bedrijfsnetwerken waar een IP gedeeld wordt. Ik zou eigenlijk ook geen reden zien waarom je niet dubbel ingelogd mag zijn.
Verder als ik dit script zie dan schrik ik behoorlijk en raad ik met klem aan deze direct te verwijderen als je dit publiekelijk hebt staan, de fouten zijn aanzienlijk:
- Vreemde tabelnaamgeving,w at is nou het verschil tussen online1 en online2?
- Wachtwoorden via een GET-request meegeven (!!!!!!!) (iedereen kan het wachtwoord zo achterhalen)
- SQL-injection is mogelijk, dus je bent snel gehacked.
- Er mist goede foutafhandeling op je query
- Onnodige [ ] in je tabelnamen (Ik zie het nut daar nog steeds niet van) en onnodige backticks (`).
Mijn advies: Haal het direct offline, en bouw een degelijk goed systeem aan de hand van een goede recente PHP-cursus. Dit script is zo lek als een zeef!
Verder als ik dit script zie dan schrik ik behoorlijk en raad ik met klem aan deze direct te verwijderen als je dit publiekelijk hebt staan, de fouten zijn aanzienlijk:
- Vreemde tabelnaamgeving,w at is nou het verschil tussen online1 en online2?
- Wachtwoorden via een GET-request meegeven (!!!!!!!) (iedereen kan het wachtwoord zo achterhalen)
- SQL-injection is mogelijk, dus je bent snel gehacked.
- Er mist goede foutafhandeling op je query
- Onnodige [ ] in je tabelnamen (Ik zie het nut daar nog steeds niet van) en onnodige backticks (`).
Mijn advies: Haal het direct offline, en bouw een degelijk goed systeem aan de hand van een goede recente PHP-cursus. Dit script is zo lek als een zeef!
EDIT: Het is niet mogelijk om het wachtwoord te achterhalen. De gegevens staan misschien wel in de URL maar het word geforward. Als je dit wachtwoord kunt achterhalen dan ben je een goeie.
Het gaat hier om een rpg spel.
Het nadeel is dat spelers een gat hebben gevonden om zeg maar te hacken.
Als ze dubbel inloggen en snel klikken dan krijgen ze het 2/3 misschien zelfs 10 keer voor de prijs van 1.
Het verschil tussen online en online2?
Online registreert hoelaat de gebruiker online is geweest.
Online2 verandert na het inloggen de waarde van nee naar ja.
Zoals ik al zei ben ik beginnend met PHP, dat is de reden dat je hier van schrikt denk ik.
Toch wil ik hiermee doorgaan.
Dubbel inloggen blokkeren via een ip-adres wordt hem niet.
Het zou moeten werken via de waarde nee, of ja.
maar hoe?
bedankt voor je reactie.
mvg
Dat houdt de boel beter leesbaarder.
Toch wel eigenlijk mijn eigen risico.
Maar dan nog, ook al is het een onstabiel script.
Hoe gebruik ik online2 in de database om dubbel login te blokken, en hoezo werkt dit dan niet?
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
<?
include("config.php");
$user1 = mysql_query("SELECT * FROM `users` WHERE `online2`='nee' AND `login`='{$_GET['x']}' AND `pass`=MD5('{$_GET['pass']}')");
$user = mysql_num_rows($user1);
if($user > 0){
$_SESSION['login'] = $_GET['x'];
$data->login = $_GET['x'];
header("Location: index.php?a=loggedin");
}
else{
header("Location: $sitelink/index.php?error");
}
?>
include("config.php");
$user1 = mysql_query("SELECT * FROM `users` WHERE `online2`='nee' AND `login`='{$_GET['x']}' AND `pass`=MD5('{$_GET['pass']}')");
$user = mysql_num_rows($user1);
if($user > 0){
$_SESSION['login'] = $_GET['x'];
$data->login = $_GET['x'];
header("Location: index.php?a=loggedin");
}
else{
header("Location: $sitelink/index.php?error");
}
?>
Als ik het script zo zie is het een zeer slechte scriptstijl van 12(!!!) jaar geleden.
Ik raad daarom aan om gewoon met een schone lei te beginnen in plaats van dat je met een in-plakband-aan-elkaar-hangend script verder gaat stoeien waarbij je script onveiliger wordt en zelfs onsamenhangender.
Oh ja, md5() is behoorlijk achterhaald, bcrypt is daarentegen een stuk veiliger.
Verder is niet alleen je server een gevaar, maar ook de gebruiker, doordat passworden open en bloot in hun geschiedenis staan (!!!!)
Met deze stappen zul je geheid een beter resultaat krijgen:
Stap 1: PHP beginnershandleiding
Stap 2: SQL beginnershandleiding
Stap 3: Datum- en Tijdfuncties in MySQL
Stap 4 : MySQLi - Een nieuwe manier van interactie tussen PHP en MySQL
Gewijzigd op 30/03/2015 19:52:17 door - Ariën -
Quote:
Het gaat hier om een rpg spel.
Het nadeel is dat spelers een gat hebben gevonden om zeg maar te hacken.
Als ze dubbel inloggen en snel klikken dan krijgen ze het 2/3 misschien zelfs 10 keer voor de prijs van 1.
Het nadeel is dat spelers een gat hebben gevonden om zeg maar te hacken.
Als ze dubbel inloggen en snel klikken dan krijgen ze het 2/3 misschien zelfs 10 keer voor de prijs van 1.
Wat betekent dit laatste deel?
Serieus, orden je gedachten.
Als je dit soort zaken wilt afvangen door middel van een dubbele login dan vermoed ik dat dit de verkeerde oplossing is voor het probleem (wat nergens echt omschreven is). Overigens, door het verplaatsen van dit probleem naar een dubbele login is het daarmee nog niet opgelost omdat je daar precies hetzelfde probleem hebt: het proces waarin je een zekere controle uitvoert waarna je een zekere handeling uitvoert is niet ondeelbaar. Precies hetzelfde verhaal speelt bij je dubbele login.
Wat jij waarschijnlijk nodig hebt bij het oplossen van het probleem, waarbij je dus afdwingt dat een reeks van handelingen ondeelbaar is, is gebruikmaking van transacties.
Maar goed, wellicht moet je zelf eerst goed je hoofd stoten voordat je hiervoor waardering kunt opbrengen :).
Gewijzigd op 30/03/2015 19:59:27 door Thomas van den Heuvel
Kun je me een link sturen naar een live voorbeeld? :) hhehehehehe
Het is een soort spel. op dat spel kunnen ze iets kopen in een shop.
Als ze een paar schermen te gelijk open hebben, laten we zeggen 4x, (4x ingelogd in 4 tabladen dus), dan kopen ze hetzelfde item in 4 schermen als ze snel klikken en dan hebben ze het voor de kosten van 1 product.
Dit verkopen ze weer en zo 'hacken' ze geld.
Dus alle opties hebben helemaal geen nut, een dubbel login moet gewoon geblokkeerd worden.
En zo ver ik weet moet dit prima lukken met het veld 'online2' in de tabel 'users'.
Want na het inloggen zet die het veld 'online2' op ja. Dus ik snap niet waarom dit niet werkt:
$user1 = mysql_query("SELECT * FROM `users` WHERE `online2`='nee' AND `login`='{$_GET['x']}' AND `pass`=MD5('{$_GET['pass']}')");
Een tijdslimiet is de beste oplossing. Bij de bron aanpakken dus, de login is hier de bijzaak.
Over de beveiliging:
Het wachtwoord, deze wordt plain text in de URL gezet, en is zichtbaar in je browser. Een dikke no-go dus.
Verder is er ook een berg aan SQL-injecties mogelijk, zou erg rottig zijn dat iemand hierdoor de wachtwoorden van je leden bij elkaar hackt en deze brute-forced. Dan gaan je bezoekers je opeens jouw site niet meer fijn vinden.
Mijn advies: Neem het script grondig onder de loep.
Gewijzigd op 31/03/2015 00:44:43 door - Ariën -
De passwords kunnen onmogelijk achterhaald worden omdat ze md5 encrypted zijn.
Toevoeging op 31/03/2015 00:49:50:
Je snapt niet dat het niks met cookies te maken heeft.
Het veld online2 verandert pas weer nadat er op uitloggen is geklikt.
Gebruik liever password_hash en password_verify.
En wat als iemand zijn cookies wist? Dan is hij uitgelogd en staat online2 nog op inlogd, en kan hij niet meer inloggen.
Gewijzigd op 31/03/2015 00:55:19 door - Ariën -
Hoe kan ik dit dan met de tijd doen?
Toevoeging op 31/03/2015 00:56:49:
Aar C op 31/03/2015 00:52:43:
En wat als iemand zijn cookies wist? Dan is hij uitgelogd en staat online2 nog op inlogd, en kan hij niet meer inloggen.
Inderdaad, daarom werkte dit niet:
$user1 = mysql_query("SELECT * FROM `users` WHERE `online2`='nee' AND `login`='{$_GET['x']}' AND `pass`=MD5('{$_GET['pass']}')");
Jasper Schellekens op 30/03/2015 23:56:49:
Nee het zit zo.
Het is een soort spel. op dat spel kunnen ze iets kopen in een shop.
Als ze een paar schermen te gelijk open hebben, laten we zeggen 4x, (4x ingelogd in 4 tabladen dus), dan kopen ze hetzelfde item in 4 schermen als ze snel klikken en dan hebben ze het voor de kosten van 1 product.
Dit verkopen ze weer en zo 'hacken' ze geld.
Het is een soort spel. op dat spel kunnen ze iets kopen in een shop.
Als ze een paar schermen te gelijk open hebben, laten we zeggen 4x, (4x ingelogd in 4 tabladen dus), dan kopen ze hetzelfde item in 4 schermen als ze snel klikken en dan hebben ze het voor de kosten van 1 product.
Dit verkopen ze weer en zo 'hacken' ze geld.
Dit sterkt mij in het vertrouwen dat het gebruik van transacties toch, en nog steeds, de (enige) goede oplossing is.
Tenzij je overal waarden naartoe aan het kopieren bent, je moet wel al je administratie via de database regelen... Als hier sprake van is (je kopieert vanalles overal naartoe, bijvoorbeeld een saldo dat je in je sessie zet ofzo...) dan is je code gewoon brak en kun je beter opnieuw beginnen.
Gewijzigd op 31/03/2015 01:02:21 door Thomas van den Heuvel
Alleen zit ik een beetje ermee over die sql injection waar Aar C het over had.
Zou zoiets als dit werken?
{
if(eregi($foutbezig,$locatie))
{
echo "Internet fout, ip adres doorgegeven aan domein houder.";
mail("emailadre","Mysql Injection","Mysql Injection
IP-Adres: $_SERVER[REMOTE_ADDR]","From: Company<emailadres>");
exit();
}
}
Ik kwam het tegen ergens, geen idee of het echt met sql injection te maken heeft.
T is gewoon een vraag.
En hoe kan ik anders een injection blokken?
Als je SQL-injection wilt tegengaan, kijk dan vooral naar mysqli_real_escape_string(), ervan uitgaande dat je ook de MySQLi-functies gebruikt. Als de de object-georiënteerde manier gebruikt, is het $mysqli->real_escape_string().
Zie ook: http://php.net/manual/en/mysqli.real-escape-string.php
Gewijzigd op 01/04/2015 18:43:33 door - Ariën -
Thomas van den Heuvel op 31/03/2015 00:59:09:
Dit sterkt mij in het vertrouwen dat het gebruik van transacties toch, en nog steeds, de (enige) goede oplossing is.
Dit sterkt mij in het vertrouwen dat het gebruik van transacties toch, en nog steeds, de (enige) goede oplossing is.
Wat hebben transacties in deze context voor toegevoegde waarde?
Transacties zijn database-sessie afhankelijk, verschillende tabbladen === verschillende database-sessies.
Gewijzigd op 01/04/2015 21:49:19 door Ger van Steenderen
Ger van Steenderen op 01/04/2015 20:34:12:
Wat hebben transacties in deze context voor toegevoegde waarde?
Well...
Quote:
Het nadeel is dat spelers een gat hebben gevonden om zeg maar te hacken.
Als ze dubbel inloggen en snel klikken dan krijgen ze het 2/3 misschien zelfs 10 keer voor de prijs van 1.
Als ze dubbel inloggen en snel klikken dan krijgen ze het 2/3 misschien zelfs 10 keer voor de prijs van 1.
Is dat niet haast een 1:1 schoolvoorbeeld [1] waarbij (soortgelijke) sets handelingen meerdere keren (tegelijkertijd) herhaald worden en er een zodanige verweving plaatsvindt zodat dit een ongewenst effect heeft?
Als je transacties gebruikt zorg je ervoor dat zo'n set (=één sessie) een ondeelbaar geheel wordt. Er vindt dan géén verweving plaats en je administratie blijft dan kloppen. Sure, je kunt dan nog steeds 100x tegelijkertijd een script aanroepen, maar de set wordt dan 100x na elkaar uitgevoerd (de ene set wacht tot de andere klaar is) en de toestand van het systeem zou na afloop nog steeds moeten kloppen. Of de transacties worden op den duur afgekapt omdat je gewoon blut bent, dan moet je maar niet 200x een knop spammen :). Maar dat klopt dan nog steeds, in die zin dat er niet uit het niets ineens valuta wordt gecreëerd, en een aankoop mislukt omdat je onvoldoende valuta hebt...
[1] Dit wordt min of meer beschreven in de laaste alinea van deze paragraaf.
Het verbaast mij dat ik dit (aan jou) moet uitleggen?
EDIT: sterker nog, waarschijnlijk leven de "database-sessies" alleen tijdens het uitvoeren van het script en zijn daarna weg (heeft dus niet eens iets met tabs te maken). Tenzij je wellicht persistente connecties gebruikt, geen idee hoe de situatie dan is.
Gewijzigd op 01/04/2015 22:27:59 door Thomas van den Heuvel