Registrieren  •  Login 
  
 
im Forum


 FAQ   Mitgliederliste   Benutzergruppen   Teamseite   Suchen 

PHP Sicherheit!

 
Neues Thema eröffnen   Neue Antwort erstellen
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
killerbees19
Administrator & Rennleitung
Administrator & Rennleitung



OC-Nickname: KB19
Südafrika Team South Africa

Anmeldedatum: 09.05.2006
Geschlecht: Männlich
Alter: 29 Jahre
Beiträge: 13952
Wohnort: Wien

BeitragVerfasst am: 10.12.2006, 14:14    Titel: PHP Sicherheit!

Ich habe mir gestern das Buch PHP Sicherheit gekauft.
Und nun bin ich erstaunt welche Möglichkeiten Hacker oder Cracker haben.

Habt ihr zum Beispiel gewusst, dass ein Hacker alle Daten aus der Variable $_SERVER verändern kann? Somit auch die oft verwendete Variable $_SERVER['PHP_SELF']...

In diesem Thema soll über PHP-Sicherheit gesprochen werden.
Ich hoffe, dass dieses Thema zu einer guten "Security-Sammlung" wird.
Und ich beginne gleich einmal mit folgendem Thema:


Niemals Benutzereingaben direkt in den SQL-String einfügen!
PHP-Code:
1
2
3
<?php
$sql 
"SELECT * FROM scripttabelle WHERE id='".$_GET['id']."'";
?>

Diese Methode wird leider viel zu oft verwendet ist jedoch mehr als unsicher. Um die Variable $_GET['id'] zu überprüfen, würde hier natürlich die Funktion is_numeric() in Frage kommen. Jedoch könnte man auch diese Funktion überlisten, deshalb eine bessere Methode:
PHP-Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
// Überprüfen ob Variable eine Zahl ist
function zahl($var)  
{  
  if (
preg_match("=^[0-9]+$=i",$var))
  {  
    return 
TRUE;  
  }
  else
  {  
    return 
FALSE;  
  }  
}
?>

PHP-Code:
1
2
3
4
5
6
<?php
if(!zahl($_GET['id']))
{
  die(
"Fehler mit Variable!");
}
?>

Damit ist man in diesem Fall einmal auf Nummer sicher.


MfG Christian
_________________


Dieser Beitrag wurde insgesamt 1 mal geändert. Zuletzt von killerbees19.
Nach oben
Benutzer-Profile anzeigen killerbees19 ist derzeit offline Spielerprofile bei SC:Special Bewerben anzeigen Private Nachricht senden Website dieses Benutzers besuchen
fanrpg
Mitglied
Mitglied



Anmeldedatum: 14.12.2006
Geschlecht: Keine Angabe
Beiträge: 126
Wohnort: Windeck

BeitragVerfasst am: 14.12.2006, 20:49    Titel:

Hmm... mal ne Frage, warum so kompliziert?

PHP-Code:
1
2
3
4
5
6
<?php
$id 
intval($_GET['id']);
$sql "UPDATE tabelle SET nummer = $id";
// oder auch..
$sql "UPDATE tabelle SET nummer = "intval($_GET['id']);
?>

Reicht doch an sich auch.
Oder wer auf ganz sicher gehen will, und den Benutzer nicht aufhalten will falls er ausversehen irgendwas falsch gemacht hat tuts auch folgendes:
PHP-Code:
1
2
3
4
5
6
7
8
<?php
function make_int$id )
{
    
$id preg_replace("/[^0-9\.]+/i"""$id);
    return 
intval$id );
}

$id make_int($_GET['id']);


Desweiteren ein einfacher Schutz vor register_globals Angriffen und SQL Injectionen im Allgemeinen.

PHP-Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?php

while( list($key$value) = each($_POST) )
{
    if( 
$value == $$key )
    {
        unset($
$key);
    }
    
$_POST[$key] = addslashes($_POST[$value]);
}

while( list(
$key$value) = each($_GET) )
{
    if( 
$value == $$key )
    {
        unset($
$key);
    }
    
$_GET[$key] = addslashes($_GET[$value]);
}
?>

Ja ich weiss, addslashes() ist kein Allgemeingültiger Schutz, sollte aber dennoc bei ScriptKiddies und sonstigen Möchtegernhackern vor ungewollten SQL Injectionen helfen. Der Schutz vor register_globals dürfte eigentlich immer funktionieren, sofern der Code ganz am Anfange jeder Datei steht ( oder vor der ersten Verwenung einer Variable, die nicht eigen angelegt wird oder von Super Globalen ).

Und das lässt sich auch für jede weitere Super Globale anwenden Wink
Nach oben
Benutzer-Profile anzeigen fanrpg ist derzeit offline Private Nachricht senden Website dieses Benutzers besuchen
killerbees19
Administrator & Rennleitung
Administrator & Rennleitung



OC-Nickname: KB19
Südafrika Team South Africa

Anmeldedatum: 09.05.2006
Geschlecht: Männlich
Alter: 29 Jahre
Beiträge: 13952
Wohnort: Wien

BeitragVerfasst am: 15.12.2006, 08:34    Titel:

Interessante Möglichkeit mit intval() und preg_match() Wink
Bisher habe ich die Funktion zahl() nur im Adminbereich meiner Homepage angewendet. Sie überprüfte eigentlich nur HIDDEN-Felder von Formularen. Wenn dort etwas anderes stehen sollte, ist ein Scriptabbruch wohl das Beste Laughing

Jedenfalls habe ich deine Funktion nun in meine functions-Datei integriert, damit ich sie auf der Homepage überall verwenden kann. Vielen Dank für den Tipp Very Happy


MfG Christian
_________________
Nach oben
Benutzer-Profile anzeigen killerbees19 ist derzeit offline Spielerprofile bei SC:Special Bewerben anzeigen Private Nachricht senden Website dieses Benutzers besuchen
rami
Mitglied
Mitglied



Anmeldedatum: 07.10.2006
Geschlecht: Männlich
Beiträge: 759

BeitragVerfasst am: 05.03.2007, 16:55    Titel: Re: PHP Sicherheit!

killerbees19 hat Folgendes geschrieben:
Niemals Benutzereingaben direkt in den SQL-String einfügen!


Schon klar, aber wenn es keine Zahl sein soll?
Wie sichere ich das (aus meinem Gästebuch)?
PHP-Code:
1
2
3
4
5
6
7
8
9
10
11
<?php
$Name 
nl2br(stripslashes(htmlspecialchars(addslashes($_POST['Name']))));
$Titel nl2br(stripslashes(htmlspecialchars(addslashes($_POST['Titel']))));
$Mail nl2br(stripslashes(htmlspecialchars(addslashes($_POST['Mail']))));
$hp2 nl2br(stripslashes(htmlspecialchars(addslashes($_POST['hp']))));
$Eintrag nl2br(stripslashes(htmlspecialchars(addslashes($_POST['Eintrag']))));
$hp "out.php?go=";
$hp .= $hp2;
$SQL "INSERT INTO Gaestebuch (Datum, Name, Titel, Eintrag, mail, hp) VALUES (NOW(''), '".$Name."', '".$Titel."', '".$Eintrag."', '".$Mail."', '".$hp."')";
mysql_query($SQL$DatabasePointer);
?>
Nach oben
Benutzer-Profile anzeigen rami ist derzeit offline Spielerprofile bei SC:Special Bewerben anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
killerbees19
Administrator & Rennleitung
Administrator & Rennleitung



OC-Nickname: KB19
Südafrika Team South Africa

Anmeldedatum: 09.05.2006
Geschlecht: Männlich
Alter: 29 Jahre
Beiträge: 13952
Wohnort: Wien

BeitragVerfasst am: 05.03.2007, 17:45    Titel:

Code:
nl2br(stripslashes(htmlspecialchars(addslashes($_POST['hp']))));

Das ist vollkommen falsch. Besser ist es so:
Code:
addslashes($_POST['hp']);

Die restlichen Funktionen wie htmlspecialchars() und nl2br() brauchst du erst bei der Ausgabe anzuwenden. Du musst nicht alles in HTML-Form in der Datenbank speichern Wink

Das wichtigste ist eben die Funktion addslashes, oder du verwendest statt dessen mysql_real_escape_string() Wink


MfG Christian
_________________
Nach oben
Benutzer-Profile anzeigen killerbees19 ist derzeit offline Spielerprofile bei SC:Special Bewerben anzeigen Private Nachricht senden Website dieses Benutzers besuchen
killerbees19
Administrator & Rennleitung
Administrator & Rennleitung



OC-Nickname: KB19
Südafrika Team South Africa

Anmeldedatum: 09.05.2006
Geschlecht: Männlich
Alter: 29 Jahre
Beiträge: 13952
Wohnort: Wien

BeitragVerfasst am: 12.11.2007, 16:53    Titel:

Nochmals der Hinweis an alle:

Übernehme niemals Benutzereingaben (z.B. Daten aus $_GET, $_POST oder $_COOKIE) direkt in eine Datenbankabfrage! Wende immer mysql_real_escape_string() auf Benutzerdaten an, denn sonst hast du sofort ein Sicherheitsleck in deinem PHP-Script: SQL Injenction

Dieser Fehler wird leider sehr oft gemacht.


MfG Christian
_________________
Nach oben
Benutzer-Profile anzeigen killerbees19 ist derzeit offline Spielerprofile bei SC:Special Bewerben anzeigen Private Nachricht senden Website dieses Benutzers besuchen
lupus
Mitglied
Mitglied



Anmeldedatum: 30.09.2007
Geschlecht: Männlich
Beiträge: 85
Wohnort: Karlsruhe

BeitragVerfasst am: 12.11.2007, 17:53    Titel:

...genau: und extra dafür gibts ne funktion Wink

nennt sich mysql_real_escape_string() Smile

außerdem: bei id's in der datenbank könnt ihr auch is_int benutzen, weil eine id schon mal rein logisch kein float sein kann. (hat sich aber ja mit mysql_real_escape_string eh erledigt)

Fiete
Nach oben
Benutzer-Profile anzeigen lupus ist derzeit offline Private Nachricht senden Website dieses Benutzers besuchen
NoMoKeTo
Ehemaliger
Ehemaliger



Anmeldedatum: 13.07.2006
Geschlecht: Männlich
Beiträge: 1019
Wohnort: NRW

BeitragVerfasst am: 12.11.2007, 18:31    Titel:

lupus hat Folgendes geschrieben:
...genau: und extra dafür gibts ne funktion Wink

nennt sich mysql_real_escape_string() Smile


Hatt killerbees schon gesagt Wink

NoMoKeTo
_________________
Ich spreche Esperanto und lerne auf diesem Weg tolle Leute kennen - weltweit!
Nach oben
Benutzer-Profile anzeigen NoMoKeTo ist derzeit offline Private Nachricht senden Website dieses Benutzers besuchen
killerbees19
Administrator & Rennleitung
Administrator & Rennleitung



OC-Nickname: KB19
Südafrika Team South Africa

Anmeldedatum: 09.05.2006
Geschlecht: Männlich
Alter: 29 Jahre
Beiträge: 13952
Wohnort: Wien

BeitragVerfasst am: 12.11.2007, 18:57    Titel:

Laughing Laughing Laughing Laughing Laughing


MfG Christian
_________________
Nach oben
Benutzer-Profile anzeigen killerbees19 ist derzeit offline Spielerprofile bei SC:Special Bewerben anzeigen Private Nachricht senden Website dieses Benutzers besuchen
lupus
Mitglied
Mitglied



Anmeldedatum: 30.09.2007
Geschlecht: Männlich
Beiträge: 85
Wohnort: Karlsruhe

BeitragVerfasst am: 12.11.2007, 22:25    Titel:

ui! direkt im Post drüber *schäm* Very Happy naja... doppelt hält besser. Und im Falle der Sicherheit ist es ja nicht weiter tragisch.

Was sicherlich lustig wird: Bei php4 und php5 sind magic_quotes standardmäßig aktiviert, d.h. es wird automatisch escaped und somit eine Injection schwer gemacht... In php6 hingegen wird es angeblich standardmäßig deaktiviert sein. Gibt sicherlich jede Menge Injections bei irgendwelchen Admins die keinen Plan von nix haben. *schadenfreu* Very Happy
Nach oben
Benutzer-Profile anzeigen lupus ist derzeit offline Private Nachricht senden Website dieses Benutzers besuchen
SteveHH
Mitglied
Mitglied



Anmeldedatum: 19.05.2007
Geschlecht: Männlich
Beiträge: 1372
Wohnort: Hamburg

BeitragVerfasst am: 04.12.2007, 14:46    Titel:

Ich habe das obige gerade mal gelesen.... die Datenbank müsste doch eigentlich, wenn man diesen Dünnsinn von Rama benutzt, unverhältnismäßig größer werden oder ?! Bzw. die ganze Abfrage dürfte auch ein wenig an Geschwindigkeit verlieren (zumindest, wenn das ganze öfters vorkommt / angesprochen wird). Wenn ich ehrlich bin weiß ich das im moment nicht wirklich Smile .. aber man hat ja einen Mund bzw. in diesem Fall Finger zum Fragen Wink
_________________
Crocodiles Hamburg - Eishockey mit Herz !

Home of the Crocodiles

Ich spreche Englisch, weil ich damit bisher viele gute Freundschaften knüpfen konnte und noch knüpfen kann - weltweit !!

Komu potrzebne jest esperanto?
Nach oben
Benutzer-Profile anzeigen SteveHH ist derzeit offline Private Nachricht senden Website dieses Benutzers besuchen
killerbees19
Administrator & Rennleitung
Administrator & Rennleitung



OC-Nickname: KB19
Südafrika Team South Africa

Anmeldedatum: 09.05.2006
Geschlecht: Männlich
Alter: 29 Jahre
Beiträge: 13952
Wohnort: Wien

BeitragVerfasst am: 04.12.2007, 15:07    Titel:

Sofern du den Code von rami meinst: Ja natürlich, die Einträge werden unnötig größer und man hat bei der Ausgabe nur Probleme. nl2br() sollte man wie htmlspecialchars() erst bei der Ausgabe anwenden. phpBB speichert leider alle Einträge in der Datenbank mit htmlspecialchars() - etwas das ich sehr unnötig finde und bisher immer nur zu Problemen geführt hat...


MfG Christian
_________________


Dieser Beitrag wurde insgesamt 1 mal geändert. Zuletzt von killerbees19.
Nach oben
Benutzer-Profile anzeigen killerbees19 ist derzeit offline Spielerprofile bei SC:Special Bewerben anzeigen Private Nachricht senden Website dieses Benutzers besuchen
rami
Mitglied
Mitglied



Anmeldedatum: 07.10.2006
Geschlecht: Männlich
Beiträge: 759

BeitragVerfasst am: 04.12.2007, 16:14    Titel:

ich benutze z.Z. meist die von PHP-Sicherheit vorgeschlagenen Funktionen, also
PHP-Code:
1
<?php $foo htmlentities(addslashes(strip_tags($bar)), ENT_QUOTES); ?>

gut?
Nach oben
Benutzer-Profile anzeigen rami ist derzeit offline Spielerprofile bei SC:Special Bewerben anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
killerbees19
Administrator & Rennleitung
Administrator & Rennleitung



OC-Nickname: KB19
Südafrika Team South Africa

Anmeldedatum: 09.05.2006
Geschlecht: Männlich
Alter: 29 Jahre
Beiträge: 13952
Wohnort: Wien

BeitragVerfasst am: 04.12.2007, 17:03    Titel:

Um etwas in der Datenbank zu speichern, brauchst du nur addslashes() zu verwenden. Alles andere kannst du dann bei der Ausgabe verwenden, wobei strip_tags() unnötig ist und htmlspecialchars() vollkommen ausreicht. Maximal noch nl2br() falls Zeilenumbrüche enthalten sind, aber auch wieder bei der Ausgabe des Textes und nicht vorher!

htmlentities() statt htmlspecialchars() kannst natürlich auch verwenden Wink


MfG Christian
_________________
Nach oben
Benutzer-Profile anzeigen killerbees19 ist derzeit offline Spielerprofile bei SC:Special Bewerben anzeigen Private Nachricht senden Website dieses Benutzers besuchen
killerbees19
Administrator & Rennleitung
Administrator & Rennleitung



OC-Nickname: KB19
Südafrika Team South Africa

Anmeldedatum: 09.05.2006
Geschlecht: Männlich
Alter: 29 Jahre
Beiträge: 13952
Wohnort: Wien

BeitragVerfasst am: 14.04.2008, 14:26    Titel:

Für alle die noch nicht viel über PHP Sicherheits gelesen haben, empfehle ich einmal einen längeren Blick in diese Artikel zu werfen. Unter Publications findet man einige grundlegende Texte die für jeden interessant sind. Ich habe beim Lesen zwar kein neues Sicherheitsleck gefunden, jedoch wusste ich bisher zum Beispiel nichts über den e Modifier bei Regulären Ausdrücken, denn dieser Modifier kann zu einem extremen Problem werden (preg_quote() lässt grüßen) Laughing


MfG Christian
_________________
Nach oben
Benutzer-Profile anzeigen killerbees19 ist derzeit offline Spielerprofile bei SC:Special Bewerben anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Verschoben: 28.02.2010, 16:14 Uhr von killerbees19
Von PHP & MySQL nach Sichere Programmierung
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht teilnehmen.
Du kannst Dateien in diesem Forum nicht hochladen.
Du kannst Dateien in diesem Forum nicht herunterladen.

 

Alle Zeiten sind GMT + 2 Stunden (Sommerzeit)
Aktuelles Datum und Uhrzeit: 10.04.2020, 03:57
Nach oben
Valid HTML 4.01 Transitional
Valid CSS!
Software based on work from the phpBB-Group  •  Deutsche Übersetzung von phpBB.de

netcup - Internetdienstleistungen
 
 
[ happytec.at | forum.happytec.at | blog.happytec.at | esports.happytec.at | event.happytec.at ]