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

<?
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="<? echo $sitelink;?>/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='<? echo $sitelink;?>/v3/index.php?a=news'",(1000*2));
</script>
</div>
</td>
</tr>

</table>
</td>

Alvast bedankt!

[size=xsmall]Toevoeging op 30/03/2015 18:08:41:[/size]

Kleine edit: De foutmelding is niet nodig die zit er al bij.
Hij moet alleen het dubbel inloggen blokkeren


[size=xsmall]Toevoeging op 30/03/2015 18:42:12:[/size]

Jasper Schellekens op 30/03/2015 18:40:40

[quote="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:
<?
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
<?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

<?
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="<? echo $sitelink;?>/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='<? echo $sitelink;?>/v3/index.php?a=news'",(1000*2));
</script>
</div>
</td>
</tr>

</table>
</td>

Alvast bedankt!

[size=xsmall]Toevoeging op 30/03/2015 18:08:41:[/size]

Kleine edit: De foutmelding is niet nodig die zit er al bij.
Hij moet alleen het dubbel inloggen blokkeren

[/quote]

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!
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!


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

Omdat het al te hacken is, maakt het al zorgelijk om te draaien. Niet alleen voor je eigen, maar ook andere klanten op de server bij je hosting kunnen de dupe worden met inferieure scripts.

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

[quote="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!


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


[/quote]

Je hoeft niet steeds het laatste bericht quoten, je kan onderaan het topic ook je bericht invullen.
Dat houdt de boel beter leesbaarder.
Ik host alles via appserv, maak geen gebruik van hosting.
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?

<?
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");
}
?>

Ik gok de database-structuur. Als je wilt weten of er geklikt is voor een bepaalde actie, sla dan de datum en tijd op in de database in een tabel 'voted' met daarbij het ID en de actie waarvoor er geklikt is, en vergelijk die met de huidige datum en tijd. Als deze langer dan een minuut geleden heeft plaatsgevonden, verwijder deze dan, en toon anders een foutmelding. Kan prima in een enkele tabel.

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

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 :).
Kun je me een link sturen naar een live voorbeeld? :) hhehehehehe
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.

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']}')");

Reageren