php.de

Zurück   php.de > Webentwicklung > PHP Einsteiger > PHP Tipps 2007

 
 
LinkBack Themen-Optionen Thema bewerten
Alt 24.07.2007, 16:09  
Benutzer
 
Registriert seit: 26.01.2005
Beiträge: 30
hans.karl2
Standard SQL Injections

Hallo

Ich programmiere gerade an einer Homepage, die u.A. auch Daten aus einer Datenbank liest bzw. auch gelegentlich Daten in die DB schreibt. Ich verwende dazu die Funktion mysql_query. Auf der DB habe ich einen Benutzer angelegt, der nur Rechte für die Datenbank hat, auf der meine Daten liegen (auf meinem Webaccount kann ich leider keine Benutzer selbst anlegen, d.h. ich habe einen Benutzer auf der DB, der alle Rechte auf die ihm zur Verfügung stehenden Datenbank hat; Ich würde sonst einen Benutzer anlegen, der nur Leserechte hat und dann einen Benutzer, der nur Schreibrechte hat und den geringen Teil im Quellcode, der auf die DB schreibt, besonders absichern).

Ich habe nun von den Sicherheitsproblemen gehört, die auftreten, wenn man von Script zu Script Benutzereingaben überträgt (ich muss gew. Daten übertragen). Zwar kann ein potentieller Hacker keine Benutzerberechtigungen in der DB verändern und sich somit Zugang zum DB-Server verschaffen (ich arbeite wie oben erwähnt mit einem normalen Benutzer), er kann aber meine Daten in der DB doch einigermaßen verändern, was mich ebenfalls stören würde. Ich habe nun probiert, an einen per GET übertragenen Wert mittels "; INSERT INTO usw" ein zweites Statement anzuhängen, was nicht funktionierte (es lieferte auch keine Fehlermeldung). Kann man mit der Funktion "mysql_query" immer nur ein SQL Statement ausführen? Ich habe mir auch gedacht, dass ich jeden übergebenen Parameter (auch Integer und Date Werte) in Hochkomma setze (im WHERE Zweig), denn dann werden die veränderten Befehle wenigstens nur als Inhalte interpretiert und ein Hackversuch endet in einem SQL Fehler. Sind diese Maßnahmen ausreichend oder fällt jemandem noch ein Sicherheitsloch auf?

Wie verhindert ihr in euren Scripten SQL Injections?
hans.karl2 ist offline  
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 24.07.2007, 16:16  
Erfahrener Benutzer
 
Registriert seit: 13.08.2007
Beiträge: 1.976
KingCrunch befindet sich auf einem aufstrebenden Ast
KingCrunch eine Nachricht über ICQ schicken KingCrunch eine Nachricht über AIM schicken KingCrunch eine Nachricht über MSN schicken KingCrunch eine Nachricht über Yahoo! schicken
Standard

Das was du suchst?
__________________
Nicht jeder Fehler ist ein Bug.
KingCrunch ist offline  
Alt 24.07.2007, 16:16  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 35.987
PHP-Kenntnisse:
Fortgeschritten
nikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunft
Standard

Die wohl wichtigste Maßnahme ist die Verwendung von mysql_escape_string oder die explizite Typ-Umwandlung von int Werten.
nikosch ist gerade online  
Alt 24.07.2007, 16:45  
Benutzer
 
Registriert seit: 26.01.2005
Beiträge: 30
hans.karl2
Standard

Ich habe schon an eine Überprüfung jedes Übergabeparameters gedacht, nur ist das ziemlich mühsam zumale ich sehr viele Übergabeparameter habe. In erster Linie ist mir wichtig, dass kein Hackversuch gelingt (dass meine Daten immer im Konsistenten Zustand bleiben und dass keine Daten gelöscht/hinzugefügt werden). Ob nun beim Hackversuch die Parameter richtiggestellt werden, ist mir eigentl. egal.

Ich danke für die Funktion. Laut PHP Hilfe sind damit keine Injections mehr möglich. Die Umwandlung von Int- Werten werde ich auch machen.
hans.karl2 ist offline  
Alt 24.07.2007, 17:50  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 35.987
PHP-Kenntnisse:
Fortgeschritten
nikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunft
Standard

Bleibt zu sagen: Für Sicherheitsaspekte sollte die Frage nach dem Aufwand immer weit hinten stehen.

Mit Verlaub verschoben ins Beginner Forum.
nikosch ist gerade online  
Alt 25.07.2007, 10:31  
there's only one psycho
 
Benutzerbild von PsychoEagle
 
Registriert seit: 21.08.2007
Beiträge: 1.283
PHP-Kenntnisse:
Anfänger
PsychoEagle ist ein sehr geschätzer MenschPsychoEagle ist ein sehr geschätzer MenschPsychoEagle ist ein sehr geschätzer Mensch
PsychoEagle eine Nachricht über ICQ schicken PsychoEagle eine Nachricht über Skype™ schicken
Standard

ich lass bevor ich DB Eintr#ge mache immer über meine Werte eine Funktion laufen:

PHP-Code:
<?php
  
// SQL PROTECTION
  //
  
function sql_protect($value,$str=0) {
      
// Überflüssige Maskierungen aus der übergebenen Variablen entfernen
      
if(get_magic_quotes_gpc()) {
          
$value stripslashes($value);
      }
      
// Übergebene Variablenwert in Anführungszeichen setzen, sofern keine
      // Zahl oder ein numerischer String vorliegt
      
if(!is_numeric($value) AND $str != 1) {
          
$value "'"mysql_real_escape_string($value) ."'";
      }
      return 
$value;
  }
?>
und dann:

PHP-Code:
<?php
        $sql 
"UPDATE points_types
                SET    name = "
sql_protect($name) ."
                WHERE  `ps-tid` = "
sql_protect($id);
?>
vielleicht hilft das weiter

Grüße
Da Psy
__________________
"Weaseling out of things is important to learn. It's what separates us from the animals ... except the weasel." (Homer J. Simpson)
PsychoEagle ist offline  
Alt 25.07.2007, 10:59  
Erfahrener Benutzer
 
Registriert seit: 21.05.2008
Beiträge: 9.937
Zergling-new wird schon bald berühmt werden
Standard

Wofür ist der $str-Flag?
Zergling-new ist offline  
Alt 25.07.2007, 11:43  
there's only one psycho
 
Benutzerbild von PsychoEagle
 
Registriert seit: 21.08.2007
Beiträge: 1.283
PHP-Kenntnisse:
Anfänger
PsychoEagle ist ein sehr geschätzer MenschPsychoEagle ist ein sehr geschätzer MenschPsychoEagle ist ein sehr geschätzer Mensch
PsychoEagle eine Nachricht über ICQ schicken PsychoEagle eine Nachricht über Skype™ schicken
Standard

Zitat:
Zitat von Zergling
Wofür ist der $str-Flag?
gute Frage, nächste Frage

ne, ich glaube den kann man entfernen. Hatte dort glaub mal was versucht, aber an sich ist der unnötig.

Bei 1 soll er einfach keine einfachen Anführungszeichen und die mysql_real_escape_string function auf die $value ausführen. Is aber schwachsinnig, da würde die Funktion ihre Funktion verlieren und somit hat man wieder ein Sicherheitsrisiko mehr

Also raus damit!

EDIT:

Wobei, wenn man eine Zahl hat, welche in die DB als String soll, ist der flag vielleicht doch nicht so verkehrt, nur ein wenig anders:

PHP-Code:
<?php
  
// SQL PROTECTION
  //
  
function sql_protect($value,$str=0) {
      
// Überflüssige Maskierungen aus der übergebenen Variablen entfernen
      
if(get_magic_quotes_gpc()) {
          
$value stripslashes($value);
      }
      
// Übergebene Variablenwert in Anführungszeichen setzen, sofern keine
      // Zahl oder ein numerischer String vorliegt
      
if($str==OR !is_numeric($value)) {
          
$value "'"mysql_real_escape_string($value) ."'";
      }
      return 
$value;
  }
?>
und dann:

PHP-Code:
<?php
        $sql 
"UPDATE points_types
                SET    name = "
sql_protect($name) ."
                WHERE  `ps-tid` = "
sql_protect($id);
?>
Grüße
Da Psy
__________________
"Weaseling out of things is important to learn. It's what separates us from the animals ... except the weasel." (Homer J. Simpson)
PsychoEagle ist offline  
Alt 26.07.2007, 15:49  
Erfahrener Benutzer
 
Registriert seit: 23.08.2007
Beiträge: 1.510
M3g4Star befindet sich auf einem aufstrebenden Ast
Standard

Also ich kann immer nur wieder auf den Thread verweisen
M3g4Star ist offline  
Alt 26.07.2007, 15:57  
Erfahrener Benutzer
 
Registriert seit: 21.05.2008
Beiträge: 9.937
Zergling-new wird schon bald berühmt werden
Standard

Zitat:
Zitat von M3g4Star
Also ich kann immer nur wieder auf den Thread verweisen
Warum eigentlich?
Grade der SQL-Injection-Abschnitt ist doch schon veraltet!
Es ist nicht mehr möglich 2 Queries über einen mysql_query() Aufruf abzusetzen und mysql_real_escape_string() vermißt man gänzlich auf der Seite ^^
Zergling-new ist offline  
 


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine 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
Gehe zu

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
sql injection schreibrechte, sql-protector php, php sql injection protection

Alle Zeitangaben in WEZ +2. Es ist jetzt 16:42 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum

Creative Commons License
Dieser Inhalt ist unter einer Creative Commons-Lizenz lizenziert.