php-resource



Zurück   PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr > Entwicklung > PHP Developer Forum
 

Login

 
eingeloggt bleiben
star Jetzt registrieren   star Passwort vergessen
 

 

 


PHP Developer Forum Hier habt ihr die Möglichkeit, eure Skriptprobleme mit anderen Anwendern zu diskutieren. Seid so fair und beantwortet auch Fragen von anderen Anwendern. Dieses Forum ist sowohl für ANFÄNGER als auch für PHP-Profis! Fragen zu Laravel, YII oder anderen PHP-Frameworks.

Antwort
 
LinkBack Themen-Optionen Thema bewerten
  #1 (permalink)  
Alt 18-03-2008, 10:56
fritzje610
 Registrierter Benutzer
Links : Onlinestatus : fritzje610 ist offline
Registriert seit: Mar 2004
Ort: Nahe der schönen Loreley
Beiträge: 318
fritzje610 ist zur Zeit noch ein unbeschriebenes Blatt
Standard Sicherheit des Skripts

Hallo,

nachdem nun das nötigste soweit läuft wie es soll geht es darum das Ganze sicher zu machen. Ein großes Thema sind ja die SQL-Injections.
Das erste Skript, das ich draufhin mal überarbeitet habe ist dieses hier:

PHP-Code:
<?php
//Passwortabfrage für Terminänderungen

echo "<div id='inhalt'>";

if(isset(
$_POST["absenden"]))
{
 if((
$_POST['name'] != "") AND ($_POST['passwort'] != ""))
 {
  
//ü im Namen in ein ue wandeln
  
$suche = array ("ü");
  
$ersatz = array ("ue");
  
$aname str_replace ($suche$ersatz$_POST['name']);

  
// Verbinden mit der Datenbank
  
require_once($root "/functions/db_connection.php");
 
  
//Prüfen ob eingegebene Daten korrekt sind 
  
$query "SELECT name, passwort FROM pws WHERE name = '" mysql_real_escape_string($aname) . "'";
  
$result mysql_query($query);
  if(!
$result)
  {
   die(
'Ungültige Abfrage: ' mysql_error());
  }
  while(
$row mysql_fetch_assoc($result))
  {
   if ((
$aname == $row['name']) AND ($_POST['passwort'] == $row['passwort']))
   {
    echo 
"<meta http-equiv='Refresh' content='0; URL=index.php?ziel=eintragen&name=" $row['name'] . "' />"
   }  
   else 
   {
    echo 
"<p><fehler>Benutzername und/oder Passwort falsch. Bitte Eingaben prüfen !</fehler><p>";
   }
  }
 }
 else 
 {
  echo 
"<p><fehler>Kein Benutzername und/oder Passwort eingetragen. Bitte eingeben.</fehler><p>";
 }

//Eingabeformular erzeugen
echo "<form action='index.php?ziel=pweintrag' method='post' enctype='multipart/form-data'>"
echo 
"<label for='vorname'>Benutzername: </label>";
echo 
"<input type='text' name='name' id='name'><br /><br />"
echo 
"<label for='passwort'>Passwort: </label>";
echo 
"<input type='password' name='passwort' id='passwort'><br /><br />"
echo 
"<input type='submit' name='absenden' value='Einloggen' />";
echo 
"</form>";
echo 
"</div>";
?>
Nun mal die Frage an euch, in wie weit ist das Skript vom SQL her sicher ist. Was sollte man noch tun um das, bzw. Skripte im allgemeinen, sicher zu machen?


Danke !


Gruß

Michael
__________________
Gruß

Michael

Mit Zitat antworten
  #2 (permalink)  
Alt 18-03-2008, 11:04
Bugbuster
 PHP Junior
Links : Onlinestatus : Bugbuster ist offline
Registriert seit: Mar 2003
Ort: Hamm
Beiträge: 658
Bugbuster ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
Was sollte man noch tun um das, bzw. Skripte im allgemeinen, sicher zu machen?
Skripte nicht posten wo sie jeder analysieren kann

mysql_real_escape_string ist natürlich schonmal eine Grundlage. Um Skripte allgemein sicher zu halten gehört viel lesen dazu. Immer täglich verfolgen ob irgendwelche Sicherheitslücken auftauchen oder ähnliches.

mfg
bugbuster
__________________
tutorial: peterkropff.de schattenbaum.de tut.php-quake.net
documentation: php.net mysql.com framework.zend.com

Die Nachtwache!
Mit Zitat antworten
  #3 (permalink)  
Alt 18-03-2008, 11:08
Schnitzel
 Newbie
Links : Onlinestatus : Schnitzel ist offline
Registriert seit: Feb 2005
Beiträge: 11
Schnitzel ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Naja ich hätte da allgemein ein paar Fragen:

1. zur Sicherheit. Wenn ich als User dieses Script ausführe und ich mich richtig eingeloggt habe, wird diese Seite geladen:

PHP-Code:
index.php?ziel=eintragen&name=Schnitzel 
Doch was passiert dann wenn ich

PHP-Code:
index.php?ziel=eintragen&name=Admin 
eingebe?

Ich würde, den Eingeloggten Usernamen in einer PHP Session speichern und dann irgendwelche Informationen über den User immer daraus holen! Sonst kann der User ja selber bestimmen wer er eigentlich ist.

2. Dann würde ich Passwörter in der Datenbank immer MD5 verschlüsselt speichern.

3. Du hast diese Abfrage drin:

PHP-Code:
($aname == $row['name']) 
Vertraust du etwa MySQL nicht, dass es dir nur Einträge sendet, bei dem der Name in der Datenbank steht? Denn genau nach dem filterst du ja.

4. Hast du dir schon mal überlegt was passiert wenn ein Username mehrmals in der Datenbank vorhanden ist? Wenn z.b. der erste User der sich in der Datenbank befindet nicht das gleiche Passwort hat wie der User in der Form eingeben hat, zeigt das Script dir ein Error an, obwohl vieleicht an einer anderen Stelle der Username mit dem eingegebenen Passwort stimmen würde.

5. Warum ersetzt du nur ü mit ue? was ist mit ä und ö?

Viele Anregungen, nicht nur wegen der Sicherheit =)

Ach ja:

Zitat:
Original geschrieben von Bugbuster
Skripte nicht posten wo sie jeder analysieren kann
Glaubst du etwa an Security through obscurity ?!? (http://de.wikipedia.org/wiki/Security_through_obscurity)
Das finde ich dann doch ziemlich gefährlich als Tipp für einen Beginner...
Mit Zitat antworten
  #4 (permalink)  
Alt 18-03-2008, 11:23
Bugbuster
 PHP Junior
Links : Onlinestatus : Bugbuster ist offline
Registriert seit: Mar 2003
Ort: Hamm
Beiträge: 658
Bugbuster ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Nein, ich glaube an Skriptkiddies.

Zitat:
Das finde ich dann doch ziemlich gefährlich als Tipp für einen Beginner...
Deute erstmal meinen Smilie
__________________
tutorial: peterkropff.de schattenbaum.de tut.php-quake.net
documentation: php.net mysql.com framework.zend.com

Die Nachtwache!
Mit Zitat antworten
  #5 (permalink)  
Alt 18-03-2008, 11:38
unset
  Moderator
Links : Onlinestatus : unset ist offline
Registriert seit: Jan 2007
Ort: Düsseldorf
Beiträge: 3.782
unset befindet sich auf einem aufstrebenden Ast
Standard

Auf keinen Fall als alleiniges Sicherheitsmerkmal betrachten, aber dennoch sehr nützlich: Das PHP Intrusion Detection System!

Ansonsten als Lektüre zu empfehlen: http://www.bsi.de/literat/studien/websec/WebSec.pdf

@Schnitzel: Wenn du dich an Bugbusters scherzhaften Kommentar aufhängst, solltest du auch mal deine eigene Nase abtasten: MD5 stellt keine Verschlüsselung dar. Das halte ich gegenüber Anfängern für ein noch viel größeres Missverständnis.

Geändert von unset (18-03-2008 um 11:41 Uhr)
Mit Zitat antworten
  #6 (permalink)  
Alt 18-03-2008, 11:42
fritzje610
 Registrierter Benutzer
Links : Onlinestatus : fritzje610 ist offline
Registriert seit: Mar 2004
Ort: Nahe der schönen Loreley
Beiträge: 318
fritzje610 ist zur Zeit noch ein unbeschriebenes Blatt
Standard

- Passwörter per md5 zu verschlüsseln macht durchaus Sinn

- es kann keine doppelten User geben, da der Personenkreis der sich dort anmeldet überschaubar ist. In diesem Fall.

- ($aname == $row['name']) ist doppelt gemoppelt, das stimmt. Da reicht es auch nur auf's richtige Passwort zu prüfen.

- ö und ä brauche ich in diesem Fall nicht zu ersetzen, da er nicht auftreten kann. Im Allgemeinen sollte man natürlich alle drei Fälle abdecken.

- das Thema Sessions werde ich dann als nächstes einfügen, zusammen mit den Passwörten über md5

Zumindest habe ich jetzt schon mal einen Ansatz, was noch an Lücken zu schliessen ist.


Gruß

Michael
__________________
Gruß

Michael

Mit Zitat antworten
  #7 (permalink)  
Alt 18-03-2008, 11:46
jahlives
 Master
Links : Onlinestatus : jahlives ist offline
Registriert seit: Jun 2004
Ort: Hooker in Kernel
Beiträge: 8.279
jahlives ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
- Passwörter per md5 zu verschlüsseln macht durchaus Sinn
md5 ist keine Verschlüsselungsfunktion sondern eine Hashfkt
Zitat:
- es kann keine doppelten User geben, da der Personenkreis der sich dort anmeldet überschaubar ist. In diesem Fall.
Ein UNIQUE auf die Spalte Username und die DB sorgt selber dafür, dass keine doppelten Usernamen vorkommen
Zitat:
- ö und ä brauche ich in diesem Fall nicht zu ersetzen, da er nicht auftreten kann. Im Allgemeinen sollte man natürlich alle drei Fälle abdecken.
Mit dem richtigen Zeichensatz ist es kein Problem auch Umlaute in der Tabelle zu speichern
Zitat:
- das Thema Sessions werde ich dann als nächstes einfügen...
Unbedingt solltest du das tun!

Gruss

tobi
__________________
Gutes Tutorial | PHP Manual | MySql Manual | PHP FAQ | Apache | Suchfunktion für eigene Seiten

"An error does not become truth by reason of multiplied propagation, nor does truth become error because nobody sees it."
Mohandas Karamchand Gandhi (Mahatma Gandhi) (Source)
Mit Zitat antworten
  #8 (permalink)  
Alt 18-03-2008, 12:07
fritzje610
 Registrierter Benutzer
Links : Onlinestatus : fritzje610 ist offline
Registriert seit: Mar 2004
Ort: Nahe der schönen Loreley
Beiträge: 318
fritzje610 ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Ob nun Verschlüsselung oder Hashfkt. Auf alle Fälle nicht mehr Klartext.

Ein UNIQUE auf die Spalte Username bringt's natürlich auch und ich muss nicht lange die DB befragen ob es den user schon gibt. Die FM dazu (state 1062) gibt sie dann ja automatisch zurück. Somit müsste der User, solange einen Namen für sich wählen, bis er einen findet der noch nicht in der DB steht. Machst sicherlich einfacher.

Mit welchem Zeichensatz kann ich denn Umlaute in der DB speichern?? Im phpMyAdmin gibt es ja unmengen an möglichen Zeichensätzen.
Das Sktript an sich hat utf8.

Begebe mich dann man an die Sessions.


Gruß

Michael
__________________
Gruß

Michael

Mit Zitat antworten
  #9 (permalink)  
Alt 18-03-2008, 12:29
jahlives
 Master
Links : Onlinestatus : jahlives ist offline
Registriert seit: Jun 2004
Ort: Hooker in Kernel
Beiträge: 8.279
jahlives ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
Mit welchem Zeichensatz kann ich denn Umlaute in der DB speichern??
Und wusste nix dazu? Also UTF 8 kann das bestimmt...
__________________
Gutes Tutorial | PHP Manual | MySql Manual | PHP FAQ | Apache | Suchfunktion für eigene Seiten

"An error does not become truth by reason of multiplied propagation, nor does truth become error because nobody sees it."
Mohandas Karamchand Gandhi (Mahatma Gandhi) (Source)
Mit Zitat antworten
  #10 (permalink)  
Alt 18-03-2008, 14:51
fritzje610
 Registrierter Benutzer
Links : Onlinestatus : fritzje610 ist offline
Registriert seit: Mar 2004
Ort: Nahe der schönen Loreley
Beiträge: 318
fritzje610 ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Habt ihr ein gutes nützliches Tut zum Thema Sessions? Ich hab mal gegoogelt, aber da finde ich ca. ne Million Einträge. Da dann rauszufinden was was taugt dauert drei Tage. Vielleicht könnt ihr mir ja auf nem kürzeren Weg was an dei Hand geben.


Danke !


Michael
__________________
Gruß

Michael

Mit Zitat antworten
  #11 (permalink)  
Alt 18-03-2008, 15:06
lennart
 PHP Junior
Links : Onlinestatus : lennart ist offline
Registriert seit: May 2007
Ort: Hamburg
Beiträge: 565
lennart ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
Original geschrieben von fritzje610
Habt ihr ein gutes nützliches Tut zum Thema Sessions?
http://tut.php-quake.net/sessions.html

Ich halte btw MD5 mit einem salt für eine ausreichende Verschlüsselung für Passwörter in einer Datenbank.
Mit Zitat antworten
  #12 (permalink)  
Alt 18-03-2008, 15:49
fritzje610
 Registrierter Benutzer
Links : Onlinestatus : fritzje610 ist offline
Registriert seit: Mar 2004
Ort: Nahe der schönen Loreley
Beiträge: 318
fritzje610 ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Nochmal zu den Zeichensätzen. In der Datenbank stehen Namen mit Umlauten, die von einem Skript korrekt eingetragen werden.

Wenn ich nun mit diesem Skript mir den Namen ausgeben lassen will, der den Umlaut enthält bekomme ich keine Ausgabe. Alles anderen Namen werden in der while-Schleife angezeigt.
Ich finde aber meinen Fehler nicht. Die DB nutzt

# MySQL-Zeichensatz: UTF-8 Unicode (utf8)
# Zeichensatz / Kollation der MySQL-Verbindung: utf8_general_ci

Habt ihr nen tip für mich ?!?!


Gruß

Michael


PHP-Code:
<?php
//Passwortabfrage für Terminänderungen

if(isset($_POST["absenden"]))
{
  echo 
$_POST['name'];
 
// Verbinden mit der Datenbank
 
require_once($_SERVER['DOCUMENT_ROOT']  . "/functions/db_connection.php");
 
 
//Prüfen ob eingegebene Daten korrekt sind 
 
$query "SELECT name, passwort FROM pws WHERE name = '" mysql_real_escape_string($_POST['name']) . "'";
 
$result mysql_query($query);
 if(!
$result)
 {
  die(
'Ungültige Abfrage: ' mysql_error());
 }
 while(
$row mysql_fetch_assoc($result))
 {
  echo 
$row['name'];
 } 

//Eingabeformular erzeugen
#echo "<form action='index.php?ziel=pweintrag' method='post' enctype='multipart/form-data'>"; 
echo "<form action='auslesen.php' method='post' enctype='multipart/form-data'>";
echo 
"<label for='vorname'>Benutzername: </label>";
echo 
"<input type='text' name='name' id='name'><br /><br />"
echo 
"<input type='submit' name='absenden' value='Einloggen' />";
echo 
"</form>";
echo 
"</div>";
?>
__________________
Gruß

Michael

Mit Zitat antworten
  #13 (permalink)  
Alt 18-03-2008, 16:23
hhcm
 PHP Senior
Links : Onlinestatus : hhcm ist offline
Registriert seit: Jun 2005
Ort: Viersen, NRW
Beiträge: 1.833
hhcm ist zur Zeit noch ein unbeschriebenes Blatt
hhcm eine Nachricht über ICQ schicken hhcm eine Nachricht über Skype™ schicken
Standard

Versuch mal

PHP-Code:
// Verbinden mit der Datenbank
 
require_once($_SERVER['DOCUMENT_ROOT']  . "/functions/db_connection.php");
mysql_query("SET CHARACTER SET utf8");

//usw 
__________________
gruss Chris

Derjenige, der sagt: "Es geht nicht", soll den nicht stoeren, der's gerade tut."
Mit Zitat antworten
  #14 (permalink)  
Alt 18-03-2008, 20:36
fritzje610
 Registrierter Benutzer
Links : Onlinestatus : fritzje610 ist offline
Registriert seit: Mar 2004
Ort: Nahe der schönen Loreley
Beiträge: 318
fritzje610 ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Wenn ich die while Schleife um ein foreach erweitere zeigt es die Umlaut-Namen plötzlich an. Nur warum verstehe ich nicht ?

PHP-Code:
 while($row mysql_fetch_assoc($result))
 {
  foreach (
$row as $value)
  {
   echo 
$value;
  }
 } 
Warum gibt er bei dieser Ausgabe die Namen mit Umlauten raus und bei der vorigen Schleife nicht ??? Gibts da ne Erklärung für???


Danke !

__________________
Gruß

Michael


Geändert von fritzje610 (18-03-2008 um 20:41 Uhr)
Mit Zitat antworten
  #15 (permalink)  
Alt 18-03-2008, 20:43
fritzje610
 Registrierter Benutzer
Links : Onlinestatus : fritzje610 ist offline
Registriert seit: Mar 2004
Ort: Nahe der schönen Loreley
Beiträge: 318
fritzje610 ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Ich versteh jetzt gar nichts mehr. Ich habs nochmal zurückgeändert auf die while-Schleife alleine und plötzlich gehts. Ich raffs net. Kann man sowas erklären ???


Danke !
__________________
Gruß

Michael

Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 

Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an


PHP News

ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlicht
ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlichtDie bekannte Marktplatzsoftware ebiz-trader ist in der Version 7.5.0 veröffentlicht worden.

28.05.2018 | Berni

Wissensbestand in Unternehmen
Wissensbestand in UnternehmenLebenslanges Lernen und Weiterbilden sichert Wissensbestand in Unternehmen

25.05.2018 | Berni


 

Aktuelle PHP Scripte

PHP Server Monitor

PHP Server Monitor ist ein Skript, das prüft, ob Ihre Websites und Server betriebsbereit sind.

11.09.2018 Berni | Kategorie: PHP/ Security
PHP WEB STATISTIK ansehen PHP WEB STATISTIK

Die PHP Web Statistik bietet Ihnen ein einfach zu konfigurierendes Script zur Aufzeichnung und grafischen und textuellen Auswertung der Besuchern Ihrer Webseite. Folgende zeitlichen Module sind verfügbar: Jahr, Monat, Tag, Wochentag, Stunde Folgende son

28.08.2018 phpwebstat | Kategorie: PHP/ Counter
Affilinator - Affilinet XML Produktlisten Skript

Die Affilinator Affilinet XML Edition ist ein vollautomatisches Skript zum einlesen und darstellen der Affili.net (Partnerprogramm Netzwerk) Produktlisten und Produktdaten. Im Grunde gibt der Webmaster seine Affilinet PartnerID ein und hat dann unmittelb

27.08.2018 freefrank@ | Kategorie: PHP/ Partnerprogramme
 Alle PHP Scripte anzeigen

Alle Zeitangaben in WEZ +2. Es ist jetzt 14:25 Uhr.