kleines prob mit besucherumfrage
maria
- php
0 Alexander Laue0 Philipp Hasenfratz0 maria0 TomIRL0 maria
0 Philipp Hasenfratz0 TomIRL
Hi.
In meiner selbst programmierten Benutzerumfrage (PHP) kann man leider Gottes immer noch so oft anstimmen wie man will, und somit das ergebnis verfälschen. Auf welche Art und Weise kann ich das verhindern?
Und noch was. Wieso tut dieses Script nur immer zwei Kommentare (über eine Textare mit dem namen $comment) ausgeben, obwohl drei oder mehr drin sein sollten???
Quelltext:
/* Kommentar in Datei schreiben */
/* Daten so bearbeiten, dass sie nachher richtig angzeigt werden können */
echo "<h3>Kommentare:<br></h3>";
if(!empty($comment)){
$comment=strip_tags($comment); //entfernt HTML-Tags
$comment=$comment."<br><hr>\r\n"; //fügt einen Zeilenumbruch IN DIE DATEI ein und anderen SchnickSchnack
/* Wenn nicht der Admimnereich aufgerufen wurde, dann schreibe Daten in Datei */
if(!($comment==$Adminpw)){
$path_comment="db/comments.txt";
// Inhalt aus Datei holen. Dann mit eingegebenen Text verbinden
$open_comment_r=fopen($path_comment,"r");
$inhalt_der_datei=fgets($open_comment_r,9999999);
$inhalt_zusammen = $comment.$inhalt_der_datei;
fclose($open_comment_r);
// Inhalt der Datei löschen, in dem man mit "" überschreibt
$open_comment_l=fopen($path_comment,"w+");
fwrite($open_comment_l, "");
fclose($open_comment_l);
// Daten in die Datei schreiben
$open_comment_w=fopen($path_comment,"a");
fputs($open_comment_w,$inhalt_zusammen);
fclose($open_comment_w);
// Dateiinhalt ausgeben
require("db/comments.txt");
Ich freue mich schon auf eure antworten
Hi,
In meiner selbst programmierten Benutzerumfrage (PHP) kann man leider Gottes immer noch so oft anstimmen wie man will, und somit das ergebnis verfälschen. Auf welche Art und Weise kann ich das verhindern?
Das einfachste ist wohl eine IP-Sperre. Wenn jemand seine Stimme abgegeben hat, wird seine IP solange gesperrt, bis ein anderer mit einer anderen IP angestimmt hat. Das verhindert zwar nicht, dass sich jemand immer neu einwählen kann (uns so immer eine neue IP bekommt), aber diesen Aufwand wird wohl niemand treiben, wenn es sich nicht um eine wirkölich wichtige Abstimmung handelt. Ein weiteres Problem sind Haushalte/Büros, die sich eine IP teilen (Stichwort: NAT). Hier kann dann immer nur einer abstimmen, ein zweiter muss warten, bis ein völlig Unbeteiligter seine Stimme abgegeben hat.
Das sicherste ist aber wohl eine Benutzeranmeldung. Ohne Anmeldung kann man seine Stimme nicht abgeben. Bei der Anmeldung kannst du dann ausführlich prüfen, ob sich ein Benutzer nicht mehrfach angemeldet hat. Sobald der Benutzer dann seine Stimme abgegeben hat, wird er für die Abgabe weitere Stimmen gesperrt.
Viele Grüße...
Alex :)
Halihallo maria
In meiner selbst programmierten Benutzerumfrage (PHP) kann man leider Gottes immer noch so oft anstimmen wie man will, und somit das ergebnis verfälschen. Auf welche Art und Weise kann ich das verhindern?
Neben den von Alexander vorgeschlagenen Lösungen, wollte ich noch
Cookies anfügen. Bei jedem User der sich bei der Umfrage beteiligt
hat, wird ein Cookie gesetzt (sieh mal in der PHP-Doku unter
set_cookie). Falls dieser bei der Umfrage bereits gesetzt war, wird
der User ausgeschlossen. Wie bei der IP-Sperre, hast du auch hier
absolut keine 100% möglichkeit Missbrauch zu unterbinden. Die
sicherste Möglichkeit ist - wie Alexander bereits sagte - eine
Anmeldung.
Und noch was. Wieso tut dieses Script nur immer zwei Kommentare (über eine Textare mit dem namen $comment) ausgeben, obwohl drei oder mehr drin sein sollten???
keine Ahnung.
Quelltext:
// Inhalt aus Datei holen. Dann mit eingegebenen Text verbinden
$open_comment_r=fopen($path_comment,"r");
$inhalt_der_datei=fgets($open_comment_r,9999999);
$inhalt_zusammen = $comment.$inhalt_der_datei;
fclose($open_comment_r);
Was passiert, wenn du mal mehr als 9.9kb Kommentare hast?
// Inhalt der Datei löschen, in dem man mit "" überschreibt
$open_comment_l=fopen($path_comment,"w+");
fwrite($open_comment_l, "");
fclose($open_comment_l);
Schrecklich! - Lies bei PHP schnell nach, was der Modus "w+" macht
und sage dann, warum dieser ganze Block *nicht* nötig ist.
// Daten in die Datei schreiben
$open_comment_w=fopen($path_comment,"a");
fputs($open_comment_w,$inhalt_zusammen);
fclose($open_comment_w);
Öffne die Datei einfach mit "w+"!
require("db/comments.txt");
Schrecklich! Was meinst du was ein <? /* böser Code */ ?> in einem
Kommentar für Konsequenzen hat, wenn du mal aus versehen strip_tags
nicht mehr im Script stehen hast? - Lies die Datei um Himmels Willen
über Dateioperationen ein und gib den Inhalt über echo aus. Verwende
require *ausschliesslich nur genau dann*, wenn du dem Inhalt der
inkludierten Datei 100% vertrauen kannst!
Viele Grüsse
Philipp
Halihallo maria
tach auch
// Inhalt aus Datei holen. Dann mit eingegebenen Text verbinden
$open_comment_r=fopen($path_comment,"r");
$inhalt_der_datei=fgets($open_comment_r,9999999);
$inhalt_zusammen = $comment.$inhalt_der_datei;
fclose($open_comment_r);Was passiert, wenn du mal mehr als 9.9kb Kommentare hast?
Wie wieviel kb akzeptiert fgets? Und was ist, wenn ich dann mehr als die akzeptierten kb hab?
// Inhalt der Datei löschen, in dem man mit "" überschreibt
$open_comment_l=fopen($path_comment,"w+");
fwrite($open_comment_l, "");
fclose($open_comment_l);Schrecklich! - Lies bei PHP schnell nach, was der Modus "w+" macht
und sage dann, warum dieser ganze Block *nicht* nötig ist.
Ein Freund von mir hatte mir das geraten. Ich habe mich nicht so darum gekümmert, wenn ich ehrlich bin. Aber jetzt weiß ichs. w+ überschreibt alles was sich in der Datei befindet. Deshalb kann ich diesen Block weglassen und den unteren mit w+ öffnen.
// Daten in die Datei schreiben
$open_comment_w=fopen($path_comment,"a");
fputs($open_comment_w,$inhalt_zusammen);
fclose($open_comment_w);Öffne die Datei einfach mit "w+"!
Siehe oben...
require("db/comments.txt");
Schrecklich! Was meinst du was ein <? /* böser Code */ ?> in einem
Kommentar für Konsequenzen hat, wenn du mal aus versehen strip_tags
nicht mehr im Script stehen hast?
Was macht echo anders? er gibt auch den Dateiinhalt aus. Dann hat ein böser Code auch die gleichen Konsequenzen. Oder liege ich da falsch?
Viele Grüsse
Dir auch
Philipp
maria
Was macht echo anders? er gibt auch den Dateiinhalt aus. Dann hat ein böser Code auch die gleichen Konsequenzen. Oder liege ich da falsch?
Nein Du liegts da nicht falsch, nur hast Du das Problem nicht erkannt.
Man sollte die Ausgabe vor bösem Code schützen
Sprich bevor Du die Daten ausgibst mit stripslash besser noch htmlentities () behandeln.
TomIRL
... stripslash ...
das heißt stripslashes :-) . Trotzdem danke für den Tip.
Halihallo maria
Was passiert, wenn du mal mehr als 9.9kb Kommentare hast?
Wie wieviel kb akzeptiert fgets? Und was ist, wenn ich dann mehr als die akzeptierten kb hab?
Allgemein der falsche Ansatz. Eine grosse Datei wird stückweise
verarbeitet:
$fhw=fopen($path_comment_neu, 'w+');
$fh=fopen($path_comment, 'r');
fputs($fhw,$comment); // neuer
while ( $s = fgets($fh,4096) ) {
fputs($fhw,$s);
}
unlink($path_comment);
rename($path_comment_neu,$path_comment);
So kommst du ohne Speicherung der gesamten Datei aus, man verwendet
nur einen Buffer von 4096 Bytes und ein paar Strings. Das kostet
weniger RAM-Speicher als eine 2MB Datei in den Speicher zu laden ;)
Schrecklich! - Lies bei PHP schnell nach, was der Modus "w+" macht
und sage dann, warum dieser ganze Block *nicht* nötig ist.Ein Freund von mir hatte mir das geraten. Ich habe mich nicht so darum gekümmert, wenn ich ehrlich bin. Aber jetzt weiß ichs. w+ überschreibt alles was sich in der Datei befindet. Deshalb kann ich diesen Block weglassen und den unteren mit w+ öffnen.
Richtig, gut.
require("db/comments.txt");
Schrecklich! Was meinst du was ein <? /* böser Code */ ?> in einem
Kommentar für Konsequenzen hat, wenn du mal aus versehen strip_tags
nicht mehr im Script stehen hast?Was macht echo anders? er gibt auch den Dateiinhalt aus. Dann hat ein böser Code auch die gleichen Konsequenzen. Oder liege ich da falsch?
Echo gibt den Dateiinhalt aus, require führt den Code aus! - Sprich,
jeder kann (ohne strip_tags oder Enkodierungsmassnahmen) PHP Code
auf deinem Webserver ausführen! Das ist ein gravierender Unterschied,
insofern ja, du liegst falsch.
Allgemein gilt der Grundsatz: require nur bei PHP-Dateien denen man
100%-ig vertrauen kann. Für alles andere gibt es normale
Dateioperationen (z.B. fpassthru).
@TomIRL: Dein Hinweis ist natürlich richtig. Mir ginge es aber um die
unmittelbare Gefahr von require und ausführbarem Code.
Viele Grüsse
Philipp
@TomIRL: Dein Hinweis ist natürlich richtig. Mir ginge es aber um die
unmittelbare Gefahr von require und ausführbarem Code.
Da hast Du natürlich Recht...
Den Part hab Ich Dir auch zur Beantwortung überlassen :-)
ICh habe lediglich die Frage beantwortet, den wenn Sie echo äquivalent zu require verwendet macht es tatsächlich keinen Unterschied.
Der böse Cod wird trotzdem dargestellt.
TomIRL