Webstatt.org - Community seit 2006 - 2012 (2024?)

Sicherheitscode

user-128
21.06.2006 23:18

Hi Leute,
möchte gerne in meinem gbook ein sicherheitscode machen...
reicht es da nicht aus wenn ich ein bild drin lasse mit z.B. "1234" und das jeder 1234 eintippen muss? die bots können die bilder ja eh nicht auslesen... oder?
und wenn ja wie mach ich das, dass überprüft wird das wenn man im textfeld "1234"
eingetippt hat, dass es überprüft wird????
bitte um hilfe lächeln

danke euch im vorraus lächeln

Avatar user-271
22.06.2006 09:22

diese Teile nennen sich captcha bilder: http://de.wikipedia.org/wiki/Captcha

da unten steht auch ein recht guter link um diese Bilder zu generieren
http://www.deruwe.de/captcha.html

steht eigentlich alles wichtige drin


aber brb hat auch was gutes entworfen gehabt...da musste man in ein kreuz klicken..vielleicht finde ich das noch

#!/bin/bash
traurig){ neutral:& };:
Avatar user-349
22.06.2006 09:29

Original von user-271
aber brb hat auch was gutes entworfen gehabt...da musste man in ein kreuz klicken..vielleicht finde ich das noch

Das war das hier: http://www.nögel.de/mawcha/index.php

user-157
22.06.2006 10:26

machs doch so:

<?php
header("Content-type: image/png"zwinkern;
$text = rand(10000, 99999);
$im = imagecreatetruecolor(70,30);
$bg_color = ImageColorAllocate($im, 0, 0, 0);
$font_color = ImageColorAllocate($im, 255, 255, 255);
imagestring ($im, 5, 5, 7, $text, $font_color);
imagepng($im);
?>


und dann prüfste per if-bedingung, ob die eingabe mit $text übereinstimmt.

if(!($_POST['eingabe'] == $text)){
echo "Der Sicherheitscode stimmt nicht!";
}


asdf!
user-128
22.06.2006 10:26

danke schonmal, damit kann ich leider nicht viel anfangen weil ich davon nichts verstehe (php) aber es muss möglich sein wenn es nu ein bild ist wo z.B. immer nur "1234" drinsteht oder?

Avatar user-271
22.06.2006 11:54

wenn immer nur eine Zahlenfolge drinsteht...dann ist das ja blöd...dann bringt das System wieder überhaupt nichts...dann kannste gleich ein bild herstellen wo 1234 draufsteht und ne normale formulareingabe machen zwinkern diese Captchas basieren ja dadrauf, dass sie zufällig sind zwinkern

#!/bin/bash
traurig){ neutral:& };:
user-303
22.06.2006 12:31

Original von user-271
wenn immer nur eine Zahlenfolge drinsteht...dann ist das ja blöd...dann bringt das System wieder überhaupt nichts...dann kannste gleich ein bild herstellen wo 1234 draufsteht und ne normale formulareingabe machen zwinkern diese Captchas basieren ja dadrauf, dass sie zufällig sind zwinkern

das hat er doch vor Fettes Grinsen

user-137
22.06.2006 16:02

@crokked

Dein Code hat nen Fehler:

Meldung:

Die Grafik "http://localhost/captcha/1.php" kann nicht angezeigt werden, weil sie Fehler enthält.

user-157
22.06.2006 17:14

BNS das kann net sein.
auf jeden fall klappt bei mir der code einwandfrei.
hier nochmal (habs n bisschen erweitert):

<?php
header("Content-type: image/png"zwinkern;
$text = rand(10000, 99999);
$im = imagecreatetruecolor(70,30);
$bg_color = ImageColorAllocate($im, 0, 0, 0);
$font_color = ImageColorAllocate($im, 255, 255, 255);
imagestring ($im, 5, 20, 7, $text, $font_color);
imageline($im, 0, 0, 30, 30, $font_color);
imageline($im, 60, 0, 0, 60, $font_color);

imagepng($im);
?>

asdf!
user-128
23.06.2006 12:48

bei mir kommt nun folgender fehler:
Warning: Cannot modify header information - headers already sent by (output started at /home/www/nch901/html/blog/index.php:10) in /home/www/nch901/html/blog/gb.php on line 70
‰PNG 

Avatar user-182
23.06.2006 13:09

nehm die erste und die letzte zeile (bei user-157s code) weg..

Seid ihr auch schon wix'r? xD
user-128
23.06.2006 13:42

jetzt kommt kein fehler aber es wird auch nichts angezeigt...

user-157
23.06.2006 13:55

hmm... also bei mir klappts einwandfrei
demo gibts hier

asdf!
user-137
23.06.2006 15:23

Hat das vielleicht was damit zu tun das ich es auf dem localhost teste?

user-157
23.06.2006 15:37

öhm also bei mir klappts auch aufm localhost. aber probiers einfach mal auf php-space zwinkern

asdf!
user-303
23.06.2006 15:40

also besonders schwer zu knacken is das ja nich gerade

Avatar user-271
23.06.2006 17:30

das ist ja sooo easy zu knacken zwinkern aber gut...es hilft gegen ein paar bots *fg*besser als keins Fettes Grinsen

verzerr die Buchstaben noch ein bisschen...setze schatten hinter die Buchstaben (das hilft auch schon), bau einen körnigen Hintergrund ein...das sind so sachen, die du noch machen musst *fg*

#!/bin/bash
traurig){ neutral:& };:
Avatar user-182
23.06.2006 22:00

An dieser Stelle möchte ich auf brb`s mawcha hinweisen =)

Seid ihr auch schon wix'r? xD
Avatar user-271
23.06.2006 22:08

ist schonmal drauf verwiesen worden von mir und Zero ;D

#!/bin/bash
traurig){ neutral:& };:
Avatar user-182
23.06.2006 22:09

argh scheiße Fettes Grinsen

Seid ihr auch schon wix'r? xD
user-128
24.06.2006 21:05

immer noch der fehler:

Warning: Cannot modify header information - headers already sent by (output started at /home/www/nch901/html/blog/index.php:10) in /home/www/nch901/html/blog/captcha.php on line 2
‰PNG 

aber wenn ich die datei aufrufe (klick)
momentan habe ich die Datei includet dort kommt der fehler..

link zum fehler:

www.m1Ro.de

Avatar user-255
24.06.2006 21:41

Boah. Hammer. Du kannst doch nicht einfach das Bild in den HTML Code klatschen.. Ich sag nur <img>.

Those who can, do. Those who can't, teach. # Musik gehört dem Volk! # last.fm
user-128
24.06.2006 21:46

ne, habe die datei captcha.php includet..

danke übrigends nun klappt es frech

nun folgendes:
habe in der datei wo alles in die tabelle geschrieben wird folgendes eingefügt:

if(!($_POST['eingabe'] == $text)){
die(" Der Sicherheitscode stimmt nicht!"zwinkern;
}


nur es klappt nicht, es wird einfach eingetragen

user-303
24.06.2006 22:17

du musst $text auch irgendwo zwischenspeichern (session, db etc. nur nicht cookie oder hidden field!!). sonst kannste es ja nicht prüfen

Avatar user-182
24.06.2006 23:44

was dat denn?
if(!($_POST['eingabe'] == $text)){

dat muss so:
if($_POST['eingabe'] != $text){

Seid ihr auch schon wix'r? xD
user-128
25.06.2006 11:06

Original von user-303
du musst $text auch irgendwo zwischenspeichern (session, db etc. nur nicht cookie oder hidden field!!). sonst kannste es ja nicht prüfen


wie mach ich das? mit sessions habe ich mich nie richtig beschäftigt... traurig

Avatar user-255
25.06.2006 11:13

> mit sessions habe ich mich nie richtig beschäftigt... traurig
Dann tu das jetz: http://de.php.net/manual/de/ref.session.php

Those who can, do. Those who can't, teach. # Musik gehört dem Volk! # last.fm
Avatar user-118
25.06.2006 11:14

 session_start();
$_SESSION['text'] = $text; // Text entspricht dem generierten , nicht dem eingebenen Captcha


auslesen tust du den Wert für 'text' in der Session dann einfach mit

 $_SESSION['text'];


und benutzt es für den abgleich mit dem eingegeben Captcha

 if ($eingegebenerCaptcha != $_SESSION['text']) {
echo "Falscher oder kein Captcha.";
}


Müsste hinhauen, oder ?

mfg Alex

Ich brauche keine Signatur
user-128
25.06.2006 11:38

irgendwie verstehe ich nicht wo ich was einfügen muss...
habe drei dateien
- gb.php
- eintragen.php
- captcha.php

weiss net wo was rein soll traurig

Avatar user-255
25.06.2006 12:04

In der captcha.php speicherst du den Kontrollwert in der Session, den du in der eintragen.php dann
überprüfen kannst.

Those who can, do. Those who can't, teach. # Musik gehört dem Volk! # last.fm
user-128
25.06.2006 18:14

seltsam, irgendwie klappt das nicht...
so sieht meine captcha.php aus:

<?php
$text = rand(10000, 99999);
session_start();
$SESSION['text'] = $text;

header("Content-type: image/png"zwinkern;

$im = imagecreatetruecolor(70,25);
$bg_color = ImageColorAllocate($im, 0, 0, 0);
$font_color = ImageColorAllocate($im, 255, 255, 255);
imagestring ($im, 5, 20, 7, $text, $font_color);
imageline($im, 0, 0, 30, 30, $font_color);
imageline($im, 60, 0, 0, 60, $font_color);

imagepng($im);
?>


und in der eintragen.php

if ($eingegebenerCaptcha != $SESSION['text']) {
echo "Falscher oder kein Captcha.";
}


so habe ich es im gb:

<img src="captcha.php" />
input type="text" name="eingegebenerCaptcha" size="5" maxlength="25">

Avatar user-317
25.06.2006 22:26

register_globals!
Du musst statt $eingegebenerCaptcha $_POST['eingegebenerCaptcha'] benutzen.

user-128
25.06.2006 23:58

nun habe ich es in der eintragen.php geändert
so:
if ($_POST['eingegebenerCaptcha'] != $SESSION['text']) {
echo "Falscher oder kein Captcha.";
}


nur es klappt immer noch nicht wenn man kein code angibt trägt er immer noch ein...

EDIT: wenn ich nun alles ausfülle und auch captcha(einen falschen code) angebe gibt er aus
"Falscher oder kein Captcha." aber trägt trotzdem ein

Avatar user-271
26.06.2006 07:00

ja weil Session[text] wahrshceinlich leer ist;D wie sieht es mit einem session_start am anfang der datei aus ?
wenn du den Captcha leer lässt..dann sollte er nichts ausgeben ;D

imm wenn du Session Variablen verwenden willst muss du die Session in der Datei serialisieren zwinkern und dass geht nunmal über session_start

#!/bin/bash
traurig){ neutral:& };:
user-157
26.06.2006 10:43

und ich glaube, du gibts einfach nur ein echo aus, wenn der code nicht stimmt. versuchs mal mit

if ($eingegebenerCaptcha != $SESSION['text']) {
die('Der Sicherheitscode ist nicht richtig'zwinkern;
}

weil da wird das script automatisch gestoppt, also dann kann kein eintrag mehr hinzugefügt werden Fettes Grinsen
die - PHP.net Manual

asdf!
Avatar user-317
26.06.2006 11:21

Außerdem heißt es doch $_SESSION Oo

user-128
26.06.2006 12:38

hab jetzt in der eintragen.php folgendes hinzugefügt:
session_start();

nun klappt es aber immer noch net

Avatar user-118
26.06.2006 12:43

Original von user-317
Außerdem heißt es doch $_SESSION Oo


Ich wusste, dass eine Woche Klassenfahrt ohne Programmieren selbiges leiden lässt. Ich habe dummerweise den '_' vergessen. Tschuldigung.

mfg Alex

Ich brauche keine Signatur
user-128
26.06.2006 12:45

wird immer noch eingetragen nun kommt folgender fehler:
Warning: session_start(): Cannot send session cache limiter - headers already sent (output started at /home/www/nch901/html/blog/index.php:10) in /home/www/nch901/html/blog/eintragen.php on line 2


Zeile2:
session_start();

user-140
26.06.2006 12:47

Nur mal zur info weil ein paar diese fehlermeldung hatten

Warning: Cannot modify header information - headers already sent by (output started at /home/www/nch901/html/blog/index.php:10) in /home/www/nch901/html/blog/captcha.php on line 2


Es darf vorher keine Ausgabe erfolgt sein sonst kann man keinen Header mehr senden. Das wurde in den neueren PHP Version unterbunden.
Also ganz oben vor jedem Code ausführen bevor ein echo oder dergleichen erfolgt.

Nur zur Info weil keiner drauf eingegangen ist.

PS: Selbiges gilt für Sessions
Warning: session_start(): Cannot send session cache limiter - headers already sent (output started at /home/www/nch901/html/blog/index.php:10) in /home/www/nch901/html/blog/eintragen.php on line 2



MFG

user-128
26.06.2006 12:51

so sieht nun meine eintragen.php aus:

<?php session_start();
include("cfg.php"zwinkern;
if (!isset($action)) { $action=""; }
if ( !$name)
{
die(" Bitte geben Sie einen Namen an. <a href=\"javascript:back()\">zurück</a>"zwinkern;
}
if (!isset($action)) { $action=""; }
if ( !$eintrag)
{
die(" Bitte geben Sie ein Text an. <a href=\"javascript:back()\">zurück</a>"zwinkern;
}
if ($eingegebenerCaptcha != $_SESSION['text']) {
die('Der Sicherheitscode ist nicht richtig'zwinkern;
}
$q = "SELECT * FROM `guestbook`";
$s = mysql_query($q);
if (!$s) { echo "Error in your query:" .mysql_error(); };
?>
<?
$q = mysql_query("select * from guestbook where ip = '".$_SERVER['REMOTE_ADDR']."' and timestamp - now() < 300"zwinkern or die(mysql_error());
if(mysql_num_rows($q) > 0) die("<font color=\"#000000\">Spam Filter Aktiv, Versuch es sp&auml;ter nochmal!</font>"zwinkern;

$q = mysql_query("INSERT INTO `guestbook` (name, email, eintrag, www, ip, date) VALUES ('".htmlentities($_POST['name'])." ', '".htmlentities($_POST['email'])."', '".htmlentities($_POST['eintrag'])."', '".htmlentities($_POST['www'])."', '".($_POST['ip'])."', '".time()."'zwinkern "zwinkern or print mysql_error();
echo "<font color=\"#000000\">Vielen user-158k für deinen Eintrag. Du wirst Weitergeleitet</font>";
echo "<meta http-equiv=\"refresh\" content=\"1; URL=index.php?s=gb\">
";
?>



Avatar user-255
26.06.2006 15:34

Weg mit dem whitespace außerhalb der PHP tags!

Those who can, do. Those who can't, teach. # Musik gehört dem Volk! # last.fm
user-128
26.06.2006 17:09

mhh... whitespace ???
noch nie gehört was meinst du damit??

user-303
26.06.2006 17:10

leerzeichen

user-137
08.07.2006 21:20

Hab selber ma versucht was zu machen:

<?php
Header("Content-Type: image/png"zwinkern;

##################################################
function getstring() {
$getstring = " ";
$laenge=5;
$string="ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";

mt_srand((double)microtime()*1000000);

for ($i=1; $i <= $laenge; $i++) {
$getstring .= substr($string, mt_rand(0,strlen($string)-1), 1);
}

return $getstring;
}
##################################################

##################################################
$width = 80;
$height = 22;
$img = ImageCreate($width, $height);
##################################################


##################################################
$black = ImageColorAllocate($img, 0, 0, 0);
$white = ImageColorAllocate($img, 255, 255, 255);
##################################################


##################################################
ImageFill($img, 0, 0, $white);
ImageString($img, 5, 10, 3, $getstring, $black);
##################################################

ImagePNG($img);
ImageDestroy($img);
?>


Doch leider wird nichts angezeigt nur ein weißes Bild, wiso?

Avatar user-255
08.07.2006 21:28

$getstring ist leer.

Hier meine Referenzimplementierung zur Erzeugung eines Zufalls-Strings frech
<?php
randstr($len, $min = 65, $max = 90){
for ($i = 0; $i < $len; $i++)
$res .= char(mt_rand($min, $max));
return $res;
}
?>

Those who can, do. Those who can't, teach. # Musik gehört dem Volk! # last.fm
user-137
08.07.2006 21:32

wird aber gefüllt mit Zeichen aus dem $string

user-343
08.07.2006 21:40

$getstring .= substr($string, mt_rand(0,strlen($string)-1), 1);
Lässt sich übrigens Kürzer schreiben:
$getstring .=$string{mt_rand(0,strlen($string)-1)};


Das Manual schreibt zu mt_srand:
Anmerkung: Seit PHP 4.2.0 ist es nicht mehr nötig, den Zufallszahlengenerator zu initialisieren, bevor man ihn benutzt.


EDIT: Dein Fehler: Du rufst die Funktion, die du definierst, überhaupt nicht auf, wenn ich es nicht übersehen habe. Logisch dass die Variable leer ist, wie Milahu sagt.

user-137
08.07.2006 21:44

ok, auch wenn es nicht nötig ist lasse ich es zur sicherheit.

Aber trotzdem passiert nweiterhin nichts.

user-343
08.07.2006 21:55

Du hast meinen Edit gelesen, nehm ich an..? Fettes Grinsen

user-137
08.07.2006 22:03

Hab den EDIT nicht gesehen, aber so müsste es gehen, geht aber nicht:

<?php
Header("Content-Type: image/png"zwinkern;

##################################################
function getstring() {
$getstring = " ";
$laenge=5;
$string="ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";

mt_srand((double)microtime()*1000000);

for ($i=1; $i <= $laenge; $i++) {
$getstring .=$string{mt_rand(0,strlen($string)-1)};
}

return $getstring;
}
##################################################
getstring();
##################################################
$width = 80;
$height = 22;
$img = ImageCreate($width, $height);
##################################################


##################################################
$black = ImageColorAllocate($img, 0, 0, 0);
$white = ImageColorAllocate($img, 255, 255, 255);
##################################################


##################################################
ImageFill($img, 0, 0, $white);
ImageString($img, 5, 10, 3, $getstring, $black);
##################################################

ImagePNG($img);
ImageDestroy($img);
?>

user-303
08.07.2006 22:08

ersetz
getstring();

durch
$getstring = getstring();

user-137
08.07.2006 22:11

thx.

Aber noch eine Frage wenn ich da Bild einbinnde will ich auch noch die Variable $getstring übergeben, wie mache ich das?

Ich dachte das geht einfach so, geht es aber nicht..

user-128
08.07.2006 22:41

ich weiss nicht ob es was bringt aber ich würde es so machen:

$string="AbCdEfGhIjKlMnOpQrStUvWxYZ0123456789";

dann sind es nicht alles grosse buchstaben ist ein bisschen anspruchsvoller frech

Avatar user-255
09.07.2006 06:39

> Aber noch eine Frage wenn ich da Bild einbinnde will ich auch noch die Variable $getstring übergeben, wie mache ich das?

http://de3.php.net/manual/de/reserved.variables.php#reserved.variables.get

Those who can, do. Those who can't, teach. # Musik gehört dem Volk! # last.fm
user-137
09.07.2006 09:24

Und wie kann ich die Variable $getstring zu einer $_GET machen??

Also ich verstehe das nicht ganz was da steht..

user-303
09.07.2006 09:26

lol...also wenn du das per get übergiebst, bringt dir das gar nix mehr...

dann braucht der bot ja nichtmal das bild lesen, sondern du hast es ihn ja plain vorgesetzt

user-137
09.07.2006 09:28

http://de3.php.net/manual/de/reserved.va...d.variables.get

Da steht das ja das man das mit GET machen soll - aber wenn es unsicher ist (Hätte ich ja auch sofort drauf können), also wie soll ich das dan am besten übergeben??

user-303
09.07.2006 09:29

session oder db

user-137
09.07.2006 09:36

mit db will ich nicht da es mir dan zu unübersichtlich wird und mit sessions kenne ich mich nicht aus.

user-137
09.07.2006 10:33

Noch eine Frage zu:

Original von user-157
machs doch so:

<?php
header("Content-type: image/png"zwinkern;
$text = rand(10000, 99999);
$im = imagecreatetruecolor(70,30);
$bg_color = ImageColorAllocate($im, 0, 0, 0);
$font_color = ImageColorAllocate($im, 255, 255, 255);
imagestring ($im, 5, 5, 7, $text, $font_color);
imagepng($im);
?>


und dann prüfste per if-bedingung, ob die eingabe mit $text übereinstimmt.

if(!($_POST['eingabe'] == $text)){
echo "Der Sicherheitscode stimmt nicht!";
}



Hier wird ja was aus dem Bild übergeben nähmlich $text dan muss das doch auch mit $getsring gehen, oder?

Avatar user-255
09.07.2006 12:17

> Hier wird ja was aus dem Bild übergeben nähmlich $text

Das halte ich für ein Gerücht. zwinkern

Den string musst du entweder per session oder manuell irgendwo speichern.

Those who can, do. Those who can't, teach. # Musik gehört dem Volk! # last.fm
user-137
09.07.2006 12:21

Man könnte es ja mit Cookies machenaber das ist nicht so gut oder???
Oder kann mir jemand erklären wie ich das mit sessions am besten machen kann??

Avatar user-255
09.07.2006 12:25

> Man könnte es ja mit Cookies machenaber das ist nicht so gut oder???

Man könnte einen Hash des Kontrollwerts im Cookie speichern. Warum auch nicht?

> Oder kann mir jemand erklären wie ich das mit sessions am besten machen kann??

Wer lesen kann ist klar im Vorteil. http://tut.php-q.net/sessions.html

Those who can, do. Those who can't, teach. # Musik gehört dem Volk! # last.fm
user-137
09.07.2006 12:31

wie einen hash den kann man dan janicht mehr entschlüsseln, oder?
Und was soll ich dan hashen was ist der Kontrollwert??