Profil | Mitglieder | Registrieren | Start | Suche


PHP-Support.de » Programmierung » PHP & MySQL » Codeschnipsel » Sicherheitscode    » Hallo Gast [Login | Registrieren]

Neues Thema | Antworten   

Autor Beitrag
Andavos
Administrator
Foren-Gott


Dabei seit: 30.11.2003
Herkunft:
Posts: 6298
     Sicherheitscode Zitat | Bearbeiten

Dieser Script stellt ein Bild mit einem Sicherheitscode dar.

Damit ein Spambot nicht tausend mal ein Formular absendet, verwendet man bei Formularen oft einen 'Sicherheitscode'.
Dies ist eine Grafik mit einem Text/Code, den der User dann in ein Formularfeld eingeben muss.
Der Server überprüft dann nach dem Absenden ob der Sicherheitscode korekt war.

Dies kann man eigentlich relativ einfach in PHP realisieren.

Hier wird ein sechs Zeichen langer Sicherheitscode verwendet.

Zuerst brauchen wir wieder die Funktion für ein zufälligen String:
 PHP 
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
<?php
function rand_string($lng)
   {
   
mt_srand(crc32(microtime()));

   
//Welche Buchstaben benutzt werden sollen (Charset)
   
$buchstaben "abcdefghijklmnpqrstuvwxyz";
   
   
$str_lng strlen($buchstaben)-1;
   
$rand"";

   for(
$i=0;$i<$lng;$i++)        
      
$rand.= $buchstaben{mt_rand(0$str_lng)};
      

   return 
$rand;
   }
?>


Die Seite mit dem Formular zu registieren muss dann in etwa so aussehen:
 PHP 
1:
2:
3:
4:
5:
6:
7:
8:
9:
<?php
session_start
();
$_SESSION['scode'] = rand_string(6); 
?>

<form ....>
<!-- Hier das Bild mit dem Sicherheitscode -->
<img src="scode.php?<?php echo time(); ?>&<?php echo strip_tags(SID); ?>" alt="Sicherheitscode">
<input type="text" name="scode" maxlength="6">


Hier wird zuerst in die Session scode unser zufälliger Sicherheitscode gespeichert.
Danach wird das Bild scode.php ausgegeben, und als GET Variable wird die Zeit angehängt.
Dies verhindert, dass das Bild aus dem Browser-Cache geladen wird.
Zum Schluss ist dort noch ein Eingabefeld für den Sicherheitscode.

Jetzt kommen wir zu der Seite, die die Eingabe, und somit den Sicherheitscode überprüft.
Diese ist in etwas so aufgebaut:
 PHP 
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
<?php
session_start
();
$scode_form $_POST['scode'];
$scode_ses $_SESSION['scode'];

//Wichtig: Sicherheitscode in der Session überschreiben
$_SESSION['scode'] = rand_string(6); 

if(
$scode_form == $scode_ses)
   
//Sicherheitscode ist richtig, Daten werden gespeichert
else
   
//Falschen Sicherheitscode angegeben
?>


Hier werden die beiden Sicherheitscodes, also der aus der Session und der aus dem Eingabefeld, überprüft.
Wenn diese identisch sind, dann werden die Daten gespeichert.
Ganz wichtig ist, dass der Sicherheitscode in der Session zufällig überschrieben wird, egal ob der Code jetzt richtig oder falsch war.


So jetzt kommen wir zu dem letzten, und wichtigstem Script.
Dieser Script stellt den Sicherheitscode als Grafik dar.


scode.php
 PHP 
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
<?php
session_start
();
mt_srand(crc32(microtime()));

//Abfrage des Sicherheitscodes
$string $_SESSION['scode'];

if(empty(
$string))
   die(
"Es wurde kein Sicherheitscode übertragen");

if(!
extension_loaded("gd"))
   die(
"Keine Grafik-Unterstützung vorhanden");

$image imagecreate(100,35) OR die("Fehler beim Erstellen des Bildes");


$farbe_body=imagecolorallocate($image,0x00,0x00,0x5F);
$farbe_text imagecolorallocate($image,0xFF,0xFF,0xFF);





//Sicherheitscode einzeichnen
$font 5;
$x mt_rand(2,35);
for(
$i=0;$i<strlen($string);$i++)
   {
   if((
$y1 $y_old-7)<2$y1 2;
   if((
$y2 $y_old+7)>15$y2 15;
   
$y mt_rand($y1,$y2);
   
imagestring ($image,$font,$x,$y$string{$i}, $farbe_text);
   
$x+=11;
   
$y_old $y;
   }


if(
function_exists("imagegif"))
   {
   
Header("Content-type: image/gif");
   
ImageGif($image);
   }
elseif (
function_exists("imagepng"))
   {
   
Header("Content-type: image/png");
   
ImagePng($image);
   }
elseif (
function_exists("imagejpeg"))
   {
   
Header("Content-type: image/jpeg");
   
ImageJpeg($image""0.5);
   }
else
   die(
"Keine Grafik-Unterst&uuml;tzung vorhanden");
?>



Damit diese Code funktioniert, muss die Erweiterung gd geladen sein, was bei so gut wie allen Servern der Fall ist.


www.php-einfach.de, PHP lernen leicht gemacht
www.webhosterwissen.de, Webhosting-Vergleich





Post wurde schon 6x editiert, das letzte mal am 23.02.2008 um 21:44 von Andavos
30.09.2005, 19:15 Profil | PM | E-Mail  
Fabse
Mitglied
Neuling


Dabei seit: 21.01.2006
Herkunft: keine Angabe
Posts: 2
      Zitat | Bearbeiten

Hi!

Bei mir wird nur "Sicherheitscode" angezeigt. Also kein Code sondern der alt Parameter!

Woran kann das liegen?

Lg
Fabse


21.01.2006, 21:51 Profil | PM | E-Mail  
Andavos
Administrator
Foren-Gott


Dabei seit: 30.11.2003
Herkunft:
Posts: 6298
      Zitat | Bearbeiten

Hallo,
entweder wird die scode.php nicht gefunden, oder du hast keine GD Unterstützung.
Hast du die scode.php schon mal direkt aufgerufen?


www.php-einfach.de, PHP lernen leicht gemacht
www.webhosterwissen.de, Webhosting-Vergleich



28.01.2006, 13:42 Profil | PM | E-Mail  
Nuela
Mitglied
Neuling


Dabei seit: 19.02.2006
Herkunft: keine Angabe
Posts: 1
      Zitat | Bearbeiten

ich habe keine grosse Ahnung von PHP und anderen Programmierungen, ich gestalte meine website sehr einfach!
Aber seit einiger Zeit habe ich immer wieder Spam Einträge in meinem Gästebuch, da habe ich dieses Script gefunden. Kann ich das einfach so ins Script von meinem GB kopieren? Wo sollte das hin? (sorry, habe wirklich nicht viel Ahnung!!;-))

danke!!!


19.02.2006, 20:49 Profil | PM | E-Mail  
taute
Mitglied
Neuling


Dabei seit: 29.07.2005
Herkunft: Hoyerswerda/Sachsen
Posts: 4
     Sicherheitscode und $_SESSION['scode'] Zitat | Bearbeiten

Also der Sicherheitscode funktioniert im IE und Netscape ausgezeichnet. Die Spamflut hat schlagartig nachgelassen.
Frage1

Aber: seit die Scripte nicht mehr im Server-Root z.B.: (www.usw.de/formular.php)sondern in einem Ordner liegen, wird beim Aufruf des Kontaktformulares das Sicherheitsfeld nicht mehr korrekt angezeigt. Es wird eine "Grafikleiche" (hoffe das versteht jeder)angezeigt.
Erst nach einer Aktualisierung der Seite (Symbol oder Drücken von F5) wird das Kontrollfeld richtig angezeigt. Der Formularbenutzer weiss ja nun aber nicht was ich weiss?!
Gibt es dazu möglichweise Erfahrungen?

Frage2

Vorgenanntes Formular beinhaltet in meinem Fall ein Feld (Updatefunktion) welches aus einer DB ausgelesen wird. Der Formularbenutzer gelangt über den Link in einer externen e-Mail zu der Formularseite mit besagtem Kontrollfeld.
also in der Art:
<a href="http://www.xyz/index.php?was=formular&id=10">Zum Formular</a>

Es wird also die Datensatz-ID mit übergeben.
Das (ausgefüllte)Updatefeld wird nach Eingabe der richtigen Zeichen aus dem Kontrollfeld in der DB gespeichert.

Nun kommt mein Problem

Das Kontrollfeld wird ja über Session gesteuert.
Der Besucher muss nicht unbedingt sofort das Formular ausfüllen. Er kann und soll noch mehrere andere Seiten besuchen.

Wenn er sich dann irgendwann entschließt das Formular auzufüllen, folgt beim Submit:
Mysql Error ... kann Datensatz nicht finden.

Logisch, denn die Datensatz-ID ist im "Nirwana"

Gibt es eine Lösung die Datensatz-ID trotz oder gerade wegen der $_SESSION['scode'] durch alle anderen (php-Seiten) zu "schleifen" ?

Um die Neugier nicht zu strapazieren, es geht hier um mein Job-Online-Bewerbungssystem. Und die anderen "geschleiften Seiten" sind Lebenslauf usw.

Ich hoffe, dass meine Fragen verständlich gestellt wurden.

index.php ist nach folgendem Schema aufgebaut

<?php
// hostname= www.deinedomain.xx
if(empty($_GET['was']) || !file_exists($_GET['was'].".php") || $_SERVER["HTTP_HOST"]!="www.deinedomain.toplevel")
{
$_GET['was']="standardseite"; // Bei fehlerhaftem URL diese Seite anzeigen
}
include("header.php"); // Meta, css etc

include($_GET['was'].".php"); // Hier Ausgabe der include

include ("footer.php");
?>

Würde mich über konstruktive Hilfe freuen






Post wurde schon 7x editiert, das letzte mal am 11.04.2006 um 09:58 von taute
10.04.2006, 22:20 Profil | PM | E-Mail  
Andavos
Administrator
Foren-Gott


Dabei seit: 30.11.2003
Herkunft:
Posts: 6298
      Zitat | Bearbeiten

Hallo,
also das kannst du selber mit Sessions lösen, der Sicherheitscode hat damit eher wenig zu tun.


Zu dem Anzeigeproblem: Evt. weiter beobachten, manche Browser machen dort zicken.
Sonst lad den Script doch zurück in den ServerRoot.

P.S. Fragen zu PHP bitte im richtigem Forum stellen.


www.php-einfach.de, PHP lernen leicht gemacht
www.webhosterwissen.de, Webhosting-Vergleich



11.04.2006, 14:51 Profil | PM | E-Mail  
Gast


      Zitat | Bearbeiten

wohin kommt dieser Code denn?
Ich habe eine PHP-Datei die über das form angesteuert wird (mit mailto und Abfrage der Formularfelder, eine htm-Datei und eine scode.php

<?php
session_start();
$scode_form = $_POST['scode'];
$scode_ses = $_SESSION['scode'];

//Wichtig: Sicherheitscode in der Session überschreiben
$_SESSION['scode'] = rand_string(6);

if($scode_form == $scode_ses)
//Sicherheitscode ist richtig, Daten werden gespeichert
else
//Falschen Sicherheitscode angegeben
?>


05.05.2006, 10:55  
Andavos
Administrator
Foren-Gott


Dabei seit: 30.11.2003
Herkunft:
Posts: 6298
      Zitat | Bearbeiten

Hallo,
auf der Seite, auf dem die Daten aus dem Formular gespeichert werden soll.


www.php-einfach.de, PHP lernen leicht gemacht
www.webhosterwissen.de, Webhosting-Vergleich



05.05.2006, 15:57 Profil | PM | E-Mail  
Gast


      Zitat | Bearbeiten

Zitat:
Orginal von taute
Frage1

Aber: seit die Scripte nicht mehr im Server-Root z.B.: (www.usw.de/formular.php)sondern in einem Ordner liegen, wird beim Aufruf des Kontaktformulares das Sicherheitsfeld nicht mehr korrekt angezeigt. Es wird eine "Grafikleiche" (hoffe das versteht jeder)angezeigt.
Erst nach einer Aktualisierung der Seite (Symbol oder Drücken von F5) wird das Kontrollfeld richtig angezeigt. Der Formularbenutzer weiss ja nun aber nicht was ich weiss?!
Gibt es dazu möglichweise Erfahrungen?


Dieses Problem hatte ich auch. Mein Problem hatte jedoch nichts mit dem Verzeichnis zu tun. Das Problem war einfach, dass ich die Funktion rand_string($lng) vor dessen Definition aufgerufen hab. Als ich "$_SESSION['scode'] = rand_string(6);" nach "function rand_string($lng)..." gesetzt hatte, hatte ich das Problem nicht mehr.

lg
Jürgen


18.05.2006, 22:55  
Gast


      Zitat | Bearbeiten

bei mir funktioniert die überprüfung des scriptes irgendwie garnich ich hab schon alles ausprobiert.. könnte den code vllt mal jemand fertig zum download als zip anbieten so wie das bei den anderen schnipseln auch ist?


24.07.2006, 11:25  
Sturm
Mitglied
Anfänger


Dabei seit: 07.07.2006
Herkunft: keine Angabe
Posts: 34
      Zitat | Bearbeiten

wäre keine schlechte Idee
Ich hab ausch ein Problem und zwar wen ich mein eintragen.php aufrufe kommt nur das: <html><body></body></html>
Mehr nicht wie kan ich den Fehler beheben?


02.08.2006, 12:37 Profil | PM | E-Mail  
Gast


      Zitat | Bearbeiten

geht das jetzt mit dem quellcode als zip oder geht das nicht? wie ich sehe bin ich ja nicht der einzige mit diesem problem und ich bräuchte es echt dringend...

mfg

ps: es funktioniert manchaml aber nicht immer lol


12.08.2006, 01:36  
fireman
Mitglied
Guter User


Dabei seit: 23.06.2005
Herkunft: Nürnberg
Posts: 400
      Zitat | Bearbeiten

bei mir zeigt er folgenden fehler an:

Fatal error: Call to undefined function: rand_string() in C:\Programme\xampp\htdocs\lille\index.php on line 3

dies bei dieser zeile:
$_SESSION['scode'] = rand_string(6);

was stimmt daran nicht?...




EDIT: entschuldigung, hat sich erledigt, hab vergessen die funktion in den quelltext zu schreiben^^


Wenn du im Leben etwas erreichen willst,
wenn du gewinnen willst, dann höre auf dein Herz
und wenn dein Herz einmal nicht antwortet,
dann schließe deine Augen und denke an deine Eltern,
so wirst du keine Angst mehr haben und alle Hindernisse überwinden,
dann kannst du alles erreichen, einfach alles!



Post wurde schon 1x editiert, das letzte mal am 12.11.2006 um 14:35 von fireman
12.11.2006, 14:33 Profil | PM | E-Mail  
Gast


      Zitat | Bearbeiten

ich brauche sowas auch aber wie man das einbaut ist nicht gut erklärt!
bitte mal einfacher!


14.02.2007, 02:02  
Valentin
Mitglied
Exzellenter User


Dabei seit: 25.10.2004
Herkunft:
Posts: 1092
      Zitat | Bearbeiten

Hallo,

ein bisschen PHP solltest du schon können

Valentin


Software ist die Lizenz zum Geld drucken.
14.02.2007, 19:47 Profil | PM | E-Mail  
Gast


      Zitat | Bearbeiten

Hallo, da muss ich meinem Vorgänger recht geben diese Seite ist ja gedacht um PHP zu lernen und in den letzetn Script war auch unten eine zusammenfassung an PHP Script was alles zusammen in eine Seite muss.

Oder man erklärt unten kurz was man wie jetzt in welche seite schreiben musss und warum...


20.02.2007, 14:11  
Gast


     sec code img Zitat | Bearbeiten

ich wollt mit fuer den code herzlich bedanken, hab ihn eingebaut und funktioniert.

falls jemands sehen moechte:

http://www.canadaroom.net/guestbook/index.php bzw.
http://www.canadaroom.net/guestbook/index.php?gb=new

einziges problem momentan ist nur das ie und opera das bild als leiche anzeigen, wird sich aber schon eine loesung finden, mit gecko engine laeufts einwandfrei, danke nochmal (:

Gruesze fOO


03.04.2007, 14:31  
noki
Mitglied
Anfänger


Dabei seit: 16.11.2005
Herkunft: 0
Posts: 87
      Zitat | Bearbeiten

bei mir kommt ein error ich weis net was ich noch machen soll

Zitat:
Parse error: syntax error, unexpected '(' in C:\xampp\htdocs\Nosoft Mini GBook\upload files\function.inc.php on line 19


so sieht die zeile 19 aus
 PHP 
1:
mt_srand(crc32(microtime()();

wenn ich die zeile so mache wie der es haben will kommt folgendes

Zitat:
Parse error: syntax error, unexpected T_VARIABLE in C:\xampp\htdocs\Nosoft Mini GBook\upload files\function.inc.php on line 21


und die zeile 21 sieht so aus
 PHP 
1:
$buchstaben = "abcdefghijklmnpqrstuvwxyz";

wobei zeile 19 jetzt so aus sieht
 PHP 
1:
mt_srand(crc32(microtime())


liegt das vllt. an PHP5 ?


moin moin
09.04.2007, 01:39 Profil | PM | E-Mail  
Prusik
Mitglied
Guter User


Dabei seit: 28.01.2007
Herkunft: Schweiz
Posts: 416
      Zitat | Bearbeiten

oder am fehlenden ; auf Zeile 19?


09.04.2007, 13:14 Profil | PM | E-Mail  
noki
Mitglied
Anfänger


Dabei seit: 16.11.2005
Herkunft: 0
Posts: 87
      Zitat | Bearbeiten

wenn ich das mache schreibt der mir das das weg muss



Parse error: syntax error, unexpected ';' in C:\xampp\htdocs\Nosoft Mini GBook\upload files\function.inc.php on line 19


moin moin

Post wurde schon 1x editiert, das letzte mal am 09.04.2007 um 13:18 von noki
09.04.2007, 13:16 Profil | PM | E-Mail  
Quietscheente
Mitglied
Sehr guter User


Dabei seit: 13.02.2005
Herkunft: Karlsruhe
Posts: 939
      Zitat | Bearbeiten

Dann geb doch mal etwas mehr an Code her, dann kann dir auch geholfen werden. Zeile 19 +/-5-10 Zeilen.


09.04.2007, 13:55 Profil | PM | E-Mail  
noki
Mitglied
Anfänger


Dabei seit: 16.11.2005
Herkunft: 0
Posts: 87
      Zitat | Bearbeiten

 PHP 
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
<?php
function rand_string($lng
   { 
   
mt_srand(crc32(microtime()) //Zeile 19

   
$buchstaben "abcdefghijklmnpqrstuvwxyz";//Zeile 21
    
   
$str_lng strlen($buchstaben)-1
   
$rand""

   for(
$i=0;$i<$lng;$i++)         
      
$rand.= $buchstaben{mt_rand(0$str_lng)}; 
       

   return 
$rand
   } 
?>


und so sieht der error aus
Zitat:
Parse error: syntax error, unexpected T_VARIABLE in C:\xampp\htdocs\Nosoft Mini GBook\upload files\function.inc.php on line 21



moin moin
09.04.2007, 14:10 Profil | PM | E-Mail  
Chacky
Mitglied
Sehr guter User


Dabei seit: 08.09.2006
Herkunft:
Posts: 561
      Zitat | Bearbeiten

Hallo noki,
wie wär es so?^^

 PHP 
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
<?php
function rand_string($lng
   { 
   
mt_srand(crc32(microtime()(); //Zeile 19

   
$buchstaben "abcdefghijklmnpqrstuvwxyz";//Zeile 21
    
   
$str_lng strlen($buchstaben)-1
   
$rand""

   for(
$i=0;$i<$lng;$i++)         
      
$rand.= $buchstaben{mt_rand(0$str_lng)}; 
       

   return 
$rand
   } 
?>



- Nicht mehr aktiv in diesem Forum -
09.04.2007, 21:18 Profil | PM | E-Mail  
noki
Mitglied
Anfänger


Dabei seit: 16.11.2005
Herkunft: 0
Posts: 87
      Zitat | Bearbeiten

Wie gesagt.......

Zitat:
Orginal von noki
bei mir kommt ein error ich weis net was ich noch machen soll

Zitat:
Parse error: syntax error, unexpected '(' in C:\xampp\htdocs\Nosoft Mini GBook\upload files\function.inc.php on line 19




das kommt wenn es so aussieht


moin moin
09.04.2007, 21:28 Profil | PM | E-Mail  
noki
Mitglied
Anfänger


Dabei seit: 16.11.2005
Herkunft: 0
Posts: 87
      Zitat | Bearbeiten

sorry für doppelpost

hab
 PHP 
1:
<?php   mt_srand(crc32(microtime()(); ?>

in
 PHP 
1:
<?php   mt_srand(crc32(microtime())); ?>

geändert doch anstatt das bild kommt nur ein [X] und Der alt tag....

und gb libary is auch ON

edit jetzt geht alles wunderbar
war ein dummer fehler von mir


moin moin

Post wurde schon 1x editiert, das letzte mal am 10.04.2007 um 00:24 von noki
10.04.2007, 00:18 Profil | PM | E-Mail  
Seiten (4):  1  2  3  4 
PHP-Support.de » Programmierung » PHP & MySQL » Codeschnipsel » Sicherheitscode   

Neues Thema | Antworten   


Powered by Command Board 1.0 - Beta 2.0 © 2004-08 PHP-Einfach | Impressum | Datenschutz