wo und wie spalte überprüfen

rernanded

Erfahrenes Mitglied
Hallo,
ich will Doppelabstimmungen an einem Tag verhindern.
Erster Schritt: Wo und wie baue ich hier am besten eine Überprüfung der Spalte ip ein (ob User-IP schon vorhanden ist) und ein "Sorry, Sie haben heute schon einmal abgestimmt." ausgebe?
MONI

PHP:
<form action="votingwithip.php" method="post">
<input name="number" size="12" maxlength="12" type="text">
<input type="submit" value="vote">
</form>
<br />
<?php
  error_reporting(E_ALL);
 
  ini_set('display_errors', true);

  if (isset($_POST['number']))
  {
     $number = $_POST['number'];  
    
    $datum_zeit = date("d.m.Y H:i:s");
    $ip = $_SERVER["REMOTE_ADDR"];
    $site = $_SERVER['REQUEST_URI'];
    $browser = $_SERVER["HTTP_USER_AGENT"];

$servername = "localhost:3306";
$username = "";
$password = "";
$dbname = "";
    
     $connection = new mysqli($servername, $username, $password, $dbname);
    
if ($connection->connect_error) {
     die("Connection failed: " . $connection->connect_error);
}

if (ctype_digit($number)) {

$sql = "INSERT INTO votingwithip (number,datum_zeit,ip,site,browser) VALUES ('$number','$datum_zeit','$ip','$site','$browser')";

$result = $connection->query($sql);


                        
echo "Alles klar, Ihre Stimme wurde gezählt. Danke.";

} else {
        echo "Die Eingabe darf nur Zahlen enhalten.";
    }
$connection->close();
}

?>
 

m.scatello

Erfahrenes Mitglied
Wo und wie baue ich hier am besten eine Überprüfung der Spalte ip ein
Wo solltest du doch bei deinem eigenen Script besser wissen als jeder andere.

Logischerweise muss das vor dem Insert passieren, in dem du überprüfst, ob es schon einen Eintrag mit dieser IP-Adresse gibt. Allerdings sperrst du damit jeden aus, der sich in einem internen Netzwerk befindet und schon jemand aus diesem Netzwerk abgestimmt hat.

Nachtrag: weißt du, was in $_SERVER['REQUEST_URI'] steht? Anscheinend nicht, denn dann wüsstest du, dass es Quatsch ist, diesen Wert zu speichern.
 
Zuletzt bearbeitet:

rernanded

Erfahrenes Mitglied
Ich würde wohl kaum fragen wenn ich es wüsste. Naja, die wo-Frage hätte ich lassen können. Das wie ist aber immer noch nicht geklärt.
Dass mit der IP ist schon klar. Auch dass man die technisch wechseln kann/könnte.
Wofür URI steht weiß ich, ist momentan noch egal. Mach Dir nicht meinen Kopf!
 

Zvoni

Erfahrenes Mitglied
Unabhängig von verwendeter Sprache (Hier PHP) und dem Thema lokales Netzwerk:

Schon daran gedacht, einen composite Primary Key aus IP und Datum zu verwenden?

In dem Fall würde ein INSERT für IP und Datum, deren Kombination bereits existiert, einen Fehler erzeugen, welchen man abfangen kann
 

Zvoni

Erfahrenes Mitglied
Falls das mit dem Composite PK nicht gehen sollte (warum auch immer), kann man als Workaround eine zusätzliche Spalte mit Type Text anlegen, welche mit dem kombinierten Wert aus IP und Datum befüllt wird. Diese Spalte sollte das Attribut UNIQUE haben.

Auch in dem Fall erzeugt ein INSERT auf eine bestehende Kombination einen Fehler, den man abfangen kann
 

rernanded

Erfahrenes Mitglied
@Zvoni Danke.

Ich baue mir einen Cronjob und leere immer um 0 Uhr die IP-Spalte.
Das ändert aber nichts daran, dass trotzdem alle anderen im selben Netzwerk mit der selben IP bis 0 Uhr gesperrt sind. D.h. max. sind sie 23 Std. und 59 Sekunden und min. 1 Sekunde gesperrt.

Ich würde noch die Kombination aus IP und Browser einsetzen sowie ein Kriterium im Zusammenhang mit IP und datum_zeit, z.B. in Form einer Zeitsperre zw. einer und drei Stunden (per Zufall) ab datum_zeit. Oder durch minütliche Zeitfenster(blockiert/nicht blockiert) zwischen datum_zeit und 0 Uhr.

Zuerst hatte ich überlegt mehrere URIs einzusetzen und die mit den IPs zu kombinieren. Das macht aber keinen Sinn.

Und ich kann für alle weiteren User mit der selben IP einen Hinweis anzeigen, dass gerade ein User im Netzwerk abstimmt.

Mal sehen.

MONI
 
Zuletzt bearbeitet:

Zvoni

Erfahrenes Mitglied
Ist das ein Public voting oder innerhalb eines lokalen Netzwerks (Firmennetzwerk)?
Weil das "gleiche IP"-Problem kann eigentlich nur bei einem "public" Voting (=Im Internet) entstehen, wenn mehrere Leute aus einem Lokalen Netzwerk abstimmen wollen, weil ja dann nur die "public" IP-Adresse des Routers bekannt ist.

Im Falle des lokalen Netzwerks hätte ich eher den Versuch gestartet, den Host/PC-Namen zusätzlich zur IP und Datum abzufragen, da in einem lokalen Netzwerk ein Hostname nur einmal vorkommen kann.
Client-Hostname in PHP auslesen | code-bude.net

Die Frage, die sich mir dann aber stellt, ob das rechtlich überhaupt vereinbar ist (Datenschutz? Was würde dich der Hostname meines Rechners angehen?)
 

Sempervivum

Erfahrenes Mitglied
Speichern im Localstorage wäre eigentlich optimal aber leicht zu manipulieren. Ich fürchte, wenn man keine Benutzerverwaltung hat, gibt es keine Möglichkeit, einen Benutzer sicher zu identifizieren.