php.de

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

 
 
LinkBack Themen-Optionen Thema bewerten
Alt 30.07.2007, 17:20  
Benutzer
 
Registriert seit: 18.09.2005
Beiträge: 47
Maho88
Standard Variablen in Query automatisch escapen

Hallo,
bis jetzt musste ich um einen Query zu senden immer folgendes schreiben:
Code:
$sql = "SELECT 
				* 
			FROM 
				users
			WHERE
				Name = " . escape_var($_POST['name']);
	
	$db->send_query($sql);
Also jede Variable im Query muss mit der Funktion "escape_var()" behandelt werden.

Gibt es auch eine möglich das meine DB-Klasse automatisch alle Variablen im Query herausfiltert und vor dem senden mit mysql_real_escape_string() escaped?

MfG
Alexander
Maho88 ist offline  
Sponsor Mitteilung
PHP Code Flüsterer

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

Alt 30.07.2007, 19:09  
Erfahrener Benutzer
 
Registriert seit: 21.05.2008
Beiträge: 9.937
Zergling-new wird schon bald berühmt werden
Standard

Hallo, naja du kannst dir ein sprintf() "nachprogrammieren".
Falls du (s)(v)print(f) nicht kennst oder für die, die es nicht kennen:

PHP-Code:
<?php
// print
print "dieses Forum ist blau und ist fast 5 Jahre alt";
// funktioniert (fast) genauso wie "echo"


// printf
$name "Board";
$farbe "gelb";
$alter 18;
printf("dieses %s ist %s und ist fast %d Jahre alt"$name$farbe$alter);
// variable Anzahl Parameter möglich, muss jedoch mit der Anzahl Platzhalter übereinstimmen, Ausgabe: sofort


// sprintf
$ausgabe sprintf("dieses Forum ist nicht %d Jahre alt"$alter);
// Ausgabe wird per return zurückgeworfen, aber nicht in den Ausgabepuffer geschrieben wie bei printf (ohne s)
echo $ausgabe// jetzt aber


// vprintf
vprintf("dieses %s ist %s und etwa %d Jahre alt", array($forum$farbe$alter));
// Ausgabe direkt in den Ausgabepuffer, 2. Parameter ist ein Array, dessen Elemente der Reihenfolge der Platzhalter im Text eingesetzt werden)


// vsprintf
// schwer zu erraten, das gleiche in lila
$ausgabe vsprintf("dieses %s ist %d Jahre alt und manchmal %s", array($forum$alter$farbe));
echo 
$ausgabe// Ausgabe erfolgt erst jetzt
?>
Außerdem gibt es die Funktion
http://de.php.net/func_get_args
.. die auch für Methoden funktioniert.
Deine MySQL-Klasse könnte also nun folgende Methode besitzen, die beispielsweise einen Query ausführt und die Treffer als Array zurückliefert:

PHP-Code:
<?php
class MyMySqlClass
{
  
// ..
  
public function fetchAll($sql/*[, mixed arg1[, ..]]*/)
  {
    
$argv func_get_args();
    if (
count($argv) > 1) { // offenbar wurde mehr als nur der erste Parameter $sql übergeben
      
array_shift($argv); // $sql wird von func_get_args() natürlich mitgeliefert, schmeißen wir es weg
      
$sql vsprintf($sqlarray_map('escape_var'$argv));
    }
    
$res mysql_query($sql$this->connection);
    
$hits = array();
    while (
$dat mysql_fetch_assoc($res$this->fetchType)) {
      
$hits[] = $dat;
    }
    return 
$dat;
  }
  
// ..
}
?>
Verwendung:
PHP-Code:
<?php
$db 
= new MyMySqlClass(..);
foreach (
$db->execute("SELECT * FROM %s WHERE name = '%s'"$table$nickname) as $hits) {
  echo 
$hits['firstname'], '
'
;
}
?>
Welche Funktionen haben wir also verwendet?
http://de.php.net/func_get_args
Zitat:
Liefert Funktionsargumente als Array
http://de.php.net/vsprintf
kanntest du ja bereits

http://de.php.net/array_map
Zitat:
Wendet eine Callback-Funktion auf die Elemente von Arrays an
Einfach erklärt, wird als 1. Parameter ein Funktion erwartet:
Entweder als String, dann wird dieser Name als Funktionsname verwendet, dessen erstes und einziges Argument jeweils der Reihe nach die Elemente des Arrays sind, der als 2. Argument an array_map übergeben wird.
PHP-Code:
<?php
$cleaned 
array_map('trim'$_POST); // wendet auf alle Elemente des $_POST Array die Funktion trim() an.
?>
Zudem kannst du create_function() hier einsetzen, um eine temporäre Funktion zu erstellen. Das macht Sinn, wenn du die Funktion sonst nicht mehr brauchst und sie nicht allzu komplex ist.
Mehr dazu unter
http://de.php.net/create_function
Weiter kannst du array_map auch als 1. Argument einen Array übergeben, dessen 1. Element ein Objekt (zB $this) oder ein String sein muss.
Als 2. Element dieses Arrays muss ein String übergeben werden. Dieses Konstrukt wird so interpretiert: array($object, $method) bzw. array($class, $method).
Ersteres ruft die Methode $method des Objekts $object auf, zweiteres ruft die statische Methode $method der Klasse $class auf.
Somit wäre für mein oberes Beispiel also
PHP-Code:
<?php
array_map
(array($this'escapeVar'), $argv);
?>
denkbar, sollte meine MyMySqlClass die Methode escapeVar implementiert haben.

http://de.php.net/array_shift
Zitat:
array_shift() liefert den ersten Wert von array, verschiebt die anderen Werte hinunter, und verkürzt array um ein Element.
Deine escape_var() Funktion sollte übrigens über get_magic_quotes_gpc() den Status des Flags magic_quotes_gpc abfragen, der veranlaßt, ob User-Input Variablen automatisch mit addslashes() abgesichert werden.
Liefert dir get_magic_quotes_gpc() also TRUE, solltest du auf den Value ein stripslashes() anwenden, um addslashes() wieder rückgängig zu machen. Es ist nämlich nicht ausreichend und deckt nicht alle Zeichen ab, die für MySQL escaped werden sollten.
Nach bedingtem stripslashes() also dann mysql_real_escape_string($value, $this->connection) aufrufen!
http://de.php.net/mysql_real_escape_string
Zitat:
Maskiert spezielle Zeichen im unescaped_string unter Berücksichtigung des aktuellen Zeichensatzes der Verbindung, so dass das Ergebnis ohne Probleme in mysql_query() verwendet werden kann. Wenn Sie Binärdaten einfügen wollen, müssen Sie die Funktion auf jeden Fall verwenden.

mysql_real_escape_string() ruft die Funktion mysql_real_escape_string der MySQL-Bibliothek auf, die folgende Zeichen mit einem Backslash ('\') versieht: \x00, \n, \r, \, ', " und \x1a.
Hoffe geholfen zu haben.
Zergling-new ist offline  
Alt 30.07.2007, 19:47  
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

So fühlt es sich wohl an von Zergling mit einem Spontan Tutorial überrannt zu werden... :P
nikosch ist offline  
Alt 30.07.2007, 19:48  
Benutzer
 
Registriert seit: 18.09.2005
Beiträge: 47
Maho88
Standard

Ah, vielen Dank Zergling!
Das wäre auch eine Möglichkeit.

Das ich aber nur
Code:
$sql = "SELECT
            *
         FROM
            users
         WHERE
            Name = " . $_POST['name'];
schreibe und die Klasse dann von alleine $_POST['name'] escaped funktioniert nicht?
Maho88 ist offline  
Alt 30.07.2007, 19:54  
Erfahrener Benutzer
 
Registriert seit: 21.05.2008
Beiträge: 9.937
Zergling-new wird schon bald berühmt werden
Standard

Zwergling?

Lies dir mal mein Posting durch, speziell zu array_map. Empfehle dir aber wirklich vsprintf() und array_map() in genannter Kombination. Manchmal ist Sicherheit wichtiger als Schreibfaulheit.

Und was ist an $db->execute("SELECT * FROM tabelle WHERE nickname = %s", $_POST['nickname']) schon zu lang, dass man es nicht eingeben könnte?
Zergling-new ist offline  
Alt 30.07.2007, 19:57  
Benutzer
 
Registriert seit: 18.09.2005
Beiträge: 47
Maho88
Standard

Zitat:
Zitat von Zergling
Zwergling?
äh, sorry schon editiert^^
Maho88 ist offline  
Alt 30.07.2007, 20:02  
Benutzer
 
Registriert seit: 18.09.2005
Beiträge: 47
Maho88
Standard

laut suche bin ich aber nicht der erste der da ein "w" gelesen hat^^
Maho88 ist offline  
Alt 30.07.2007, 20:08  
Erfahrener Benutzer
 
Registriert seit: 21.05.2008
Beiträge: 9.937
Zergling-new wird schon bald berühmt werden
Standard

sieh zu dass du Land gewinnst
Zergling-new ist offline  
Alt 30.07.2007, 22:25  
Erfahrener Benutzer
 
Benutzerbild von phpdummi
 
Registriert seit: 06.06.2008
Beiträge: 1.631
PHP-Kenntnisse:
Anfänger
phpdummi ist zur Zeit noch ein unbeschriebenes Blatt
Standard

*Bookmarked*

Nein, nicht wegen Zw*, sondern wegen dieses tollen "Tutorials"!
Wirklich toll, sollte sich unser askah.. irgendwas noch bis diese Woche Samstag melden, könnte ich auch eins zu Formularen machen.
__________________
"Nobody is as smart as everybody" - Kevin Kelly
— The best things in life aren't things
phpdummi ist offline  
Alt 31.07.2007, 08:32  
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

evtl kannst du das ganze im Tutorials Forum noch posten. Fänd ich praktisch oder? die Tutorials von dir (anderen) sind eh ziemlich gut gemacht, muss man auch mal loben

PS: Zwergling is au nett
__________________
"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  
 


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

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Klasse statt globaler Variablen ecomeback PHP-Fortgeschrittene 6 15.07.2008 16:30
Übergeben von Variablen an in PHP eingebundenes Perl-Script shredder01 PHP Tipps 2008 3 04.04.2008 09:25
Datei mit Variablen so includen, dass Variablen nutzbar? BartTheDevil89 PHP Tipps 2008 6 22.01.2008 20:57
MYSQL Query Variablen Übergabe Jay0815 PHP Tipps 2008 3 03.10.2007 19:48
unerklärliches Leeren von Variablen KuShi PHP Tipps 2007 2 08.07.2007 15:19
Teil einer Variablen mit einer Variablen ersetzen ? simsalabim PHP Tipps 2007 11 20.03.2007 20:36
Variable aus Variablen zusammensetzen juhuwoorps PHP Tipps 2007 1 28.11.2005 21:50
variablen in url automatisch hinzufügen Promaetheus PHP Tipps 2007 2 26.11.2005 12:52
e-Mail automatisch versende! mit mehr variablen möglich? PHP Tipps 2005 2 28.04.2005 11:25
Variablen übergeben bzw. auslesen? PHP Tipps 2005 4 30.01.2005 03:56
[Erledigt] register globals off bei variablen Variablen... PHP Tipps 2005 4 25.01.2005 17:50
Variablen Namen zuweisen dh1sbg PHP Tipps 2004-2 3 12.11.2004 17:12
[Erledigt] Query läuft nicht Datenbanken 6 13.08.2004 21:13
Dynamisch erstellte Variablen ansprechen PHP Tipps 2004 2 08.08.2004 20:15
Variablen per adresse übergeben rocco PHP Tipps 2004 7 24.07.2004 12:03

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
php automatisch escapen, automatisch escapen, automatisch escapen php, php automatisch escape, variablen in query, mysql automatisch escapen, php escapen automatisch, string automatisch escapen php, php queries escapen, php post automatisch escapen, query variablen, http://www.php.de/php-tipps-2007/44474-variablen-query-automatisch-escapen.html, array escapen php, php sonderzeichen automatisch escapen, array escapen, array_map für object, alle variablen einer function escapen, php sql variablen escapen, < und > automatisch escapen, wert in der variable noch escapen php

Alle Zeitangaben in WEZ +2. Es ist jetzt 15:46 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.