kostenloser Webspace werbefrei: lima-city


Verbesserungsvorschläge und eure Meinungen zur Sicherheit

lima-cityForumProgrammiersprachenPHP, MySQL & .htaccess

  1. Autor dieses Themas

    wauzi

    Kostenloser Webspace von wauzi

    wauzi hat kostenlosen Webspace.

    Hallo hier bin ich mal wieder der WauZi ;-)

    Also wuste nicht so genau wie ich das neue Thema nennen sollte.

    Nun zu meinem anliegen.

    Ich möchte wenn ihr euch den folgenden code anschaut eure meinungen zur sicherheit des codes und wenn möglich verbesserungsvorschläge macht.

    <?php
    error_reporting(E_ALL);
    session_start();
    $erg_eingabe = $_POST['erg_eingabe'];
    $submit = $_POST['submit'];
    if ($submit == 'Absenden') {
    	if (!empty($erg_eingabe) and $erg_eingabe == $_SESSION['ergebnis']) {
    		echo '<p>Aufgabe richtig gelöst.</p>'."\n";
        } else {
    		echo '<p>Aufgabe falsch gelöst.</p>'."\n";
        }
    } else {
    	$zahl1 = rand(5,15);
    	$zahl2 = rand(5,15);
    	if ($zahl1 > $zahl2) {
    		$aufgabe = $zahl1.' - '.$zahl2;
    		$erg = $zahl1 - $zahl2;
    	} else {
    		$aufgabe = $zahl1.' + '.$zahl2;
        	$erg = $zahl1 + $zahl2;
    	}
    	$_SESSION['ergebnis'] = $erg;
    ?>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    <title>Spamschutz</title>
    <meta http-equiv="content-type" content="text/html; charset=windows-1252">
    <link href="default.css" rel="stylesheet" type="text/css">
    </head>
    <body>
    <form action="<?=$_SERVER['PHP_SELF']?>" method="POST">
    	<p>Aufgabe:<br><?=$aufgabe?></p>
    	<p>Ergebnis:<br>
    	<input type="text" name="erg_eingabe">
    	<input type="submit" name="submit" value="Absenden"></p>
    </form>
    </body>
    </html>
    <?php
    }
    ?>


    Danke euch schonmal mal für eure Hilfe.

    Mfg
    WauZi

    Ps: Soll ein Spamschutz sein für z.b. gästebücher oder ähnliches.

    Beitrag zuletzt geändert: 3.11.2010 2:15:35 von wauzi
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. Was die Sicherheit solcher Test angeht, würde ich nicht darauf setzen. Solche Aufgaben lassen sich relativ einfach lösen, was inzwischen auch einige Bots tun. In PHP ausgedrückt:
    <?php
    function resolve( $equation )
    {
    	$equation = '$result = ' . $equation . ';';
    	eval($equation);
    	return $result;
    }
    ?>
    Sinnvoller ist es, viele bekannte Systeme zu kombinieren. So kann man Aufgaben unkenntlich machen. Am besten geht das über Bilder. Capchas haben sich durchgesetzt, weil es recht aufwändig ist, diese maschinell zu lesen. Wobei der Capcha ansich recht lästig ist. Im Grunde reicht es, den Text mit Hilfe von Imagick oder GDLib zu generieren. Dabei ist es gar nicht so wichtig, diesen in irgendeiner Form zu "verschleiern", höchstens vielleicht mit einer eigenen Schriftart versehen. Des weiteren lässt sich viel Spam abwehren, indem man Dummy-Felder verwendet und diese beispielsweise mit einer externen CSS-Datei ausblendet. ( display:none; ) Kaum ein Bot hat die Fähigkeit ( und Zeit ) zu erkennen, was der Mensch dann am Ende sieht. Wenn also ein Dummy-Feld ausgefüllt ist, kann dieser als Bot erkannt werden.

    Zu deinem Code: Du kannst praktisch alle Zahlen durchgehen, ohne dass sich das Ergebnis ändert. Also praktisch $_POST['erg_eingabe'] ständig erhöhen, bis du das richtige Ergebnis hast. Nach spätestens 40 Versuchen bist du ein mal an der richtigen Stelle. Du solltest also die Session-Variable zerstören, nachdem die Person ( oder der Bot ) falsch geraten hat. Des weiteren solltest du überprüfen, ob die Session-Variable überhaupt gesetzt ist, ansonsten liefert der Wert immer NULL zurück, was recht problematisch werden kann.

    Wenn es darum geht, den Menschen Zeit zu kosten, damit er nicht so viele Beiträge auf ein mal hintereinander schreibt, würde ich eher darauf setzen, gleich eine Zeitsperre einzubauen. Timestamp in eine Session-Variable, überprüfen, ob die letzte Variable X Minuten her ist, fertig.
  4. Leute, sessions kann man sehr leicht umgehen... anderes Browserfenster und schon ist die session nciht mehr gültig... anderer Tab reicht nicht, weil der Tab immer noch im selben Thread läuft. da bleibht die session gültig...

    Wenn ihr meinen bescheidenen Rat hören wollt: nehmt für sowas eine Datenbank daher, fügt einen Timestamp ein und protokolliert die IP... dann kann man sowas wie eine 5 Minutensperre für die jeweilige IP angeben und e voila hast du mit einem enfachen SQL-Statement deinen Zugriffsschutz^^

    dann kann man Bropwserfenster aufmachen, wie man lustig ist... es bringt nix..
  5. sebulon schrieb:
    Leute, sessions kann man sehr leicht umgehen... anderes Browserfenster und schon ist die session nciht mehr gültig... anderer Tab reicht nicht, weil der Tab immer noch im selben Thread läuft. da bleibht die session gültig...
    Die meisten populären Browser verwenden feste Cookies, du brauchst also einen anderen Browser, was du eventuell meinen könntest. Spielt in dem Fall aber keine Rolle. Denn...

    sebulon schrieb:
    Wenn ihr meinen bescheidenen Rat hören wollt: nehmt für sowas eine Datenbank daher, fügt einen Timestamp ein und protokolliert die IP... dann kann man sowas wie eine 5 Minutensperre für die jeweilige IP angeben und e voila hast du mit einem enfachen SQL-Statement deinen Zugriffsschutz^^
    Wer sich mal mit RAW-Sockets beschäftigt hat weiß, dass auch die IP lediglich eine Variable ist, welche man im Grunde beliebig verändern kann. Auf diesem Prinzip funktionieren einige Programme, welche dann gerne dafür eingesetzt werden, um genau solche Sperren zu hintergehen.

    Man müsste also eine Benutzeranmeldung mit einem IP- und Session-Binding auf die Beine stellen. Aber jemand der Clever genug ist, einfach mal die Cookies zu löschen, kriegt es notfalls auch hin, eine IP-Sperre zu umgehen. Allgemein würde ich von den in PHP implementierten Session-Funktionen abraten. Denn: Natürlich hast du recht. Alles in eine Datenbank zu packen ist zwar um einiges Umfangreicher, dafür aber wesentlich sicherer und Umfangreicher, als sich auf das historisch gewachsene PHP zu verlassen.
  6. @sebulon: Es ist oft nicht gut sich klüger zu stellen als man ist, das solltest du doch mittlerweile gelernt haben, oder? Wenn du nicht weist, was ein Thread ist und wie Browser Threads benutzen, dann lass den Begriff doch einfach raus. Seine Beiträge mit Fachbegriffen anzureichern, die du nicht verstehst und somit falsch benutzt, ist ernsthaft kontraproduktiv, weil andere Leute denken könnten, dass du weist, was du sagst und die Begriffe mit dem selben falschen Kontext übernehmen könnten.

    @topic: Nur zwei kurze Anmerkungen zum Coding-Style vorweg: Wenn ich deinen Code jetzt im Browser sehe, dann sind da teilweise fehlerhafte Einrückungen. Das liegt daran, dass du da eine Mischung aus Whitespace, 4er Tabs und 8er Tabs benutzt. Konventionsgemäß solltest du in PHP vier Whitespaces statt Tabs benutzen ;) Die zwite Sache ist:
    $erg_eingabe = $_POST['erg_eingabe'];
    $submit = $_POST['submit'];
    if ($submit == 'Absenden') {
    	if (!empty($erg_eingabe) and $erg_eingabe == $_SESSION['ergebnis']) {
    		echo '<p>Aufgabe richtig gelöst.</p>'."\n";
        } else {
    		echo '<p>Aufgabe falsch gelöst.</p>'."\n";
        }
    }

    Der Wert von `$submit` ist hier unwichtig. Daher würde ich ihn auch nicht vergleichen. So wie du es aktuell machst würde dein Code nämlich zwei E_NOTICEs werfen (werden bei Lima nicht angezeigt), wenn das Formular nicht abgeschickt wurde. Nicht gut. Besser und kürzer wäre:
    if (isset($_POST['erg_eingabe'], $_SESSION['ergebnis']) && $_POST['erg_eingabe'] == $_SESSION['ergebnis']) {
        echo '<p>Aufgabe richtig gelöst.</p>'."\n";
    } else {
    // ...

    Dadurch umgehst du zusätzlich zwei weitere Probleme, die bereits angesprochen wurden:
    a) Wenn noch keine Zufallszahlen generiert wurden, dann geht es nicht durch einfach 0 rein zu schreiben, weil 0 == NULL.
    b) Wenn man falsch rechnet bekommt man eine neue Rechenaufbave (man kann nicht mehr einfach durchprobieren)

    Beitrag zuletzt geändert: 3.11.2010 16:21:29 von nikic
  7. Also ich finde die Idee mit den IPs auch besser und sehe da keine Probleme:

    Wer sich mal mit RAW-Sockets beschäftigt hat weiß, dass auch die IP lediglich eine Variable ist, welche man im Grunde beliebig verändern kann.

    Man kann die IP schon fälschen nur ist das Problem, dass HTTP auf TCP basiert und um eine richtige Verbindung aufzubauen, die nötig ist um mit dem Webserver zu kommunizieren, muss die richtige IP angegeben werden oder zumindest eine IP, die die Pakete dann in das Netz des Angreifers zurückleiten lässt.

    Sofern mir bekannt ist die IP bisher das einzige halbwegs sichere Mittel um Bot/Angreifer zumindest zu verlangsamen.
    Redet man hingegen von UDP ist dagegen noch kein Kraut gewachsen.
  8. Ich verstehe nicht, warum die Nutzung von IPs hier besser wäre. Sie ist insbesondere, wenn der Client eine sich schnell ändernde IP nutzt, nicht sonderlich User-Freundlich. Einen Vorteil die IP zu nutzen, sehe ich hingegen nicht.
  9. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!