Alt 19.01.2012, 07:47:51   #1 (permalink)
schwankend^^

ID: 215354
Lose-Remote
Reallife

Reg: 22.05.2006
Beiträge: 1.505
Gsus ist einfach richtig nettGsus ist einfach richtig nettGsus ist einfach richtig nettGsus ist einfach richtig nett
Standard Query mit IN-Klausel absichern

Hallo,

ich nutze die MySQL-Query-Funktion zum absichern meiner Querys hier aus dem Snippet-Forum. Mit leichtern Änderungen sieht diese bei mir wie folgt aus:

PHP-Code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
public function query($query) {
     
$this->_querycount++;
     
$args func_get_args();
     
$vargs = array();
     for(
$i=1$i<func_num_args(); $i++) {
         if(
get_magic_quotes_gpc()) $args[$i] = stripslashes($args[$i]);
         
$vargs[] = mysql_real_escape_string($args[$i]);
     }
     
$query vsprintf($query$vargs);
     
$result mysql_query($query);
     if(
$error mysql_error()) $this->errorlog($query$error);
     return 
$result;
     
mysql_free_result($result);

Nun habe ich das Problem, dass ich mit dieser Funktion gerne den IN-Tag in Verbindung mit einem Array-implode verwenden möchte. Dies sieht zur Zeit folgendermaßen aus:

PHP-Code:
1:
$result $mysql->query("SELECT `project_name`, `db_prefix`, `root_directory` FROM `".$mysql_data['prefix']."_projects` WHERE `project_name` IN ('%s')"implode($_POST['projects'], "', '")); 
Das Problem ist nun, dass die Funktion mir alle vom implode erzeugten ' escaped zu \', wodurch der Query nicht dem entspricht, was ich eigentlich haben möchte. Das Array muss aber abgesichert sein, da ich nicht kontrollieren kann, was da für Daten gesendet werden.

Leider fällt mir gerade nicht ein, wie ich dieses Problem lösen kann, aber vielleicht habt ihr ja eine gute Idee?!

Vielen Dank im Vorraus.
Gsus
Gsus ist offline   Mit Zitat antworten
Gesponsorte Links
Alt 19.01.2012, 07:59:38   #2 (permalink)
bekämpft die Mächte des Bösen
Benutzerbild von theHacker

ID: 69505
Lose-Remote

theHacker eine Nachricht über ICQ schicken theHacker eine Nachricht über AIM schicken theHacker eine Nachricht über MSN schicken theHacker eine Nachricht über Yahoo! schicken theHacker eine Nachricht über Skype™ schicken
Reg: 20.04.2006
Beiträge: 20.468
theHacker genießt hohes AnsehentheHacker genießt hohes AnsehentheHacker genießt hohes AnsehentheHacker genießt hohes AnsehentheHacker genießt hohes AnsehentheHacker genießt hohes AnsehentheHacker genießt hohes AnsehentheHacker genießt hohes AnsehentheHacker genießt hohes AnsehentheHacker genießt hohes AnsehentheHacker genießt hohes Ansehen
Standard

Du musst den Teil
Code:
1:
'...','...','...'
vorher von Hand zusammenbauen:
Schleife + sprintf() + mysql_real_escape_string()
theHacker ist offline   Mit Zitat antworten
Alt 19.01.2012, 08:13:44   #3 (permalink)
be forever curious
Benutzerbild von tleilax

ID: 27936
Lose-Remote

Reg: 20.04.2006
Beiträge: 2.259
tleilax genießt hohes Ansehentleilax genießt hohes Ansehentleilax genießt hohes Ansehentleilax genießt hohes Ansehentleilax genießt hohes Ansehentleilax genießt hohes Ansehentleilax genießt hohes Ansehentleilax genießt hohes Ansehentleilax genießt hohes Ansehentleilax genießt hohes Ansehentleilax genießt hohes Ansehen
Standard

Zitat:
Zitat von theHacker Beitrag anzeigen
Schleife + sprintf() + mysql_real_escape_string()
Eine weitere Schleife braucht's da eigentlich nicht:
PHP-Code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
//...
for($i=1$i<func_num_args(); $i++) {
    if (
is_array($args[$i)) {
        if(
get_magic_quotes_gpc()) {
            
$args[$i] = array_map('stripslashes'$args[$i]);
        }
        
$vargs[] = implode("','"array_map('mysql_real_escape_string'$args[$i]));
    } else {
        if(
get_magic_quotes_gpc()) {
            
$args[$i] = stripslashes($args[$i]);
        }
        
$vargs[] = mysql_real_escape_string($args[$i]);
    }
}
//... 
.lange tage und angenehme nächte, tlx
:.whatthemovie.com (Screenshots raten) | PHP ExportForce-Klasse
tleilax ist offline   Mit Zitat antworten
Alt 19.01.2012, 08:48:46   #4 (permalink)
schwankend^^

ID: 215354
Lose-Remote
Reallife

Reg: 22.05.2006
Beiträge: 1.505
Gsus ist einfach richtig nettGsus ist einfach richtig nettGsus ist einfach richtig nettGsus ist einfach richtig nett
Standard

Danke, die Lösung von tleilax funktioniert super! Die Funktion array_map() kannte ich vorher auch noch nicht, scheint aber sehr nützlich zu sein! Man lernt eben nie aus

Vielen Dank

mfg
Gsus
Gsus ist offline Threadstarter   Mit Zitat antworten
Alt 19.01.2012, 10:42:34   #5 (permalink)
XHTML|PHP|SQL|C

ID: 227795
Lose-Remote

Reg: 19.09.2006
Beiträge: 842
Darklord ist ein wunderbarer AnblickDarklord ist ein wunderbarer AnblickDarklord ist ein wunderbarer AnblickDarklord ist ein wunderbarer AnblickDarklord ist ein wunderbarer AnblickDarklord ist ein wunderbarer AnblickDarklord ist ein wunderbarer Anblick
Standard

Ich halte von der obigen Funktion nichts, weil man hier versucht mit dem Golden hammer alle Anwendungsfälle zu erschlagen.
So reicht es doch aus einen Integer auf dessen Inhalt zu überprüfen oder ggf. auf Integer zu casten.

Anmerkung: Zeile 13 wird niemals ausgeführt.
Darklord ist offline   Mit Zitat antworten
Alt 19.01.2012, 11:07:29   #6 (permalink)
return void
Benutzerbild von ice-breaker

ID: 93995
Lose-Remote

ice-breaker eine Nachricht über ICQ schicken
Reg: 27.04.2006
Beiträge: 6.026
ice-breaker genießt hohes Ansehenice-breaker genießt hohes Ansehenice-breaker genießt hohes Ansehenice-breaker genießt hohes Ansehenice-breaker genießt hohes Ansehenice-breaker genießt hohes Ansehenice-breaker genießt hohes Ansehenice-breaker genießt hohes Ansehenice-breaker genießt hohes Ansehenice-breaker genießt hohes Ansehenice-breaker genießt hohes Ansehen
Standard

und vergisst du es einmal an einer Stelle hast du gleich eine SQL-Injection...
Verwendest du jedoch konsequent die Funktion ist es nicht schlimm, dass du einmal die Prüfung vergessen hast.


"Die Wahrheit entgeht dem, der nicht mit beiden Augen sieht." -Orici
ice-breaker ist gerade online   Mit Zitat antworten
Alt 19.01.2012, 12:52:29   #7 (permalink)
schwankend^^

ID: 215354
Lose-Remote
Reallife

Reg: 22.05.2006
Beiträge: 1.505
Gsus ist einfach richtig nettGsus ist einfach richtig nettGsus ist einfach richtig nettGsus ist einfach richtig nett
Standard

Zitat:
Zitat von Darklord Beitrag anzeigen
Anmerkung: Zeile 13 wird niemals ausgeführt.
Ja, darüber habe ich mir auch bereits Gedanken gemacht, ob das einen Sinn hat oder nicht... Wenn ich diese Funktion allerdings vorher aufrufe, habe ich nichts mehr zu returnen Gibt es hierzu vielleicht auch noch Anregungen?

Ich benutze die Funktion um gegen SQL-Injections gewappnet zu sein ja.
Gsus ist offline Threadstarter   Mit Zitat antworten
Alt 19.01.2012, 19:11:12   #8 (permalink)
Woohooo!
Benutzerbild von chrissel

ID: 211634
Lose-Remote

chrissel eine Nachricht über ICQ schicken
Reg: 20.04.2006
Beiträge: 4.412
chrissel genießt hohes Ansehenchrissel genießt hohes Ansehenchrissel genießt hohes Ansehenchrissel genießt hohes Ansehenchrissel genießt hohes Ansehenchrissel genießt hohes Ansehenchrissel genießt hohes Ansehenchrissel genießt hohes Ansehenchrissel genießt hohes Ansehenchrissel genießt hohes Ansehenchrissel genießt hohes Ansehen
Standard

Zitat:
Zitat von Gsus Beitrag anzeigen
Wenn ich diese Funktion allerdings vorher aufrufe, habe ich nichts mehr zu returnen Gibt es hierzu vielleicht auch noch Anregungen?
Ich würde sagen, es ist nicht Aufgabe der query-Funktion den Speicher freizugeben. Sonst hätte man es doch standardmäßig schon bei mysql_query eingebaut, oder?
chrissel ist offline   Mit Zitat antworten
Alt 19.01.2012, 19:20:53   #9 (permalink)
schwankend^^

ID: 215354
Lose-Remote
Reallife

Reg: 22.05.2006
Beiträge: 1.505
Gsus ist einfach richtig nettGsus ist einfach richtig nettGsus ist einfach richtig nettGsus ist einfach richtig nett
Standard

Zitat:
Zitat von chrissel Beitrag anzeigen
Ich würde sagen, es ist nicht Aufgabe der query-Funktion den Speicher freizugeben. Sonst hätte man es doch standardmäßig schon bei mysql_query eingebaut, oder?
Da ist was wahres dran ja
aber es ist doch schon richtig, dass es ein besserer Codingstil ist, den belegten Speicher auch wieder freizugeben, wenn man ihn nicht mehr benötigt, oder? Also gibt es dafür keine andere möglichkeit, als die funktion jedesmal nach einer Query aufzurufen? Ich dachte, dass es da vielleicht etwas eleganter geht

mfg
Gsus
Gsus ist offline Threadstarter   Mit Zitat antworten
Alt 19.01.2012, 19:46:39   #10 (permalink)
Woohooo!
Benutzerbild von chrissel

ID: 211634
Lose-Remote

chrissel eine Nachricht über ICQ schicken
Reg: 20.04.2006
Beiträge: 4.412
chrissel genießt hohes Ansehenchrissel genießt hohes Ansehenchrissel genießt hohes Ansehenchrissel genießt hohes Ansehenchrissel genießt hohes Ansehenchrissel genießt hohes Ansehenchrissel genießt hohes Ansehenchrissel genießt hohes Ansehenchrissel genießt hohes Ansehenchrissel genießt hohes Ansehenchrissel genießt hohes Ansehen
Standard

Zitat:
Zitat von Gsus Beitrag anzeigen
Da ist was wahres dran ja
aber es ist doch schon richtig, dass es ein besserer Codingstil ist, den belegten Speicher auch wieder freizugeben, wenn man ihn nicht mehr benötigt, oder? Also gibt es dafür keine andere möglichkeit, als die funktion jedesmal nach einer Query aufzurufen? Ich dachte, dass es da vielleicht etwas eleganter geht
Naja, also du willst ja anschließend mit dem ResultSet weiterarbeiten (also der Rückgabe von mysql_query()), somit solltest du den Speicher auch erst wieder freigeben, wenn du fertig bist mit dem weiterarbeiten.
D.h. wenn du wirklich nirgendwo mehr mit der direkten Rückgabe deiner Funktion query() arbeitest.

Ich weiß gerade auch nicht wie die Speicherverwaltung bei PHP in Verbindung mit MySQL geregelt ist und ob mysql_free_result() überhaupt noch viel bringt, oder das eh automatisch gemacht wird... ich sage mal klein: Du kannst es vernachlässigen...
Da könnte vielleicht eher ice-breaker was zu sagen? Oder hat da sonst noch wer Ahnung von?
chrissel ist offline   Mit Zitat antworten
Alt 19.01.2012, 19:51:21   #11 (permalink)
be forever curious
Benutzerbild von tleilax

ID: 27936
Lose-Remote

Reg: 20.04.2006
Beiträge: 2.259
tleilax genießt hohes Ansehentleilax genießt hohes Ansehentleilax genießt hohes Ansehentleilax genießt hohes Ansehentleilax genießt hohes Ansehentleilax genießt hohes Ansehentleilax genießt hohes Ansehentleilax genießt hohes Ansehentleilax genießt hohes Ansehentleilax genießt hohes Ansehentleilax genießt hohes Ansehen
Standard

Zitat:
Zitat von chrissel Beitrag anzeigen
Ich weiß gerade auch nicht wie die Speicherverwaltung bei PHP in Verbindung mit MySQL geregelt ist und ob mysql_free_result() überhaupt noch viel bringt, oder das eh automatisch gemacht wird... ich sage mal klein: Du kannst es vernachlässigen...
So ist es auch. PHP gibt in aller Regel alle belegten Ressourcen am Skriptende automatisch frei. Würde ich demzufolge bei PHP eher als Mikrooptimierung ansehen, die man erst angehen sollte, wenn man in Speicherprobleme läuft.

Aber letztendlich ist es jedem selbst überlassen, wie er das angeht. Wer nicht überwiegend PHP spricht, wird sich vermutlich wohler fühlen, wenn er die Ressource explizit freigibt.
.lange tage und angenehme nächte, tlx
:.whatthemovie.com (Screenshots raten) | PHP ExportForce-Klasse
tleilax ist offline   Mit Zitat antworten
Antwort

Gesponsorte Links

Anzeige


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 
Themen-Optionen
Ansicht

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 sind an
Pingbacks sind an
Refbacks sind an


Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Arbeitsvertrag - Klausel cruZe Das wahre Leben 4 30.06.2011 08:56:07
[PHP] Punkteübergabe bestmöglich absichern? BartTheDevil89 Programmierung 7 17.06.2011 10:06:37
vServer absichern? m0rphin Webhosting 14 19.09.2010 17:19:47
[mysql] array in WHERE-Klausel einbauen Gsus Programmierung 4 14.08.2007 12:39:35
(S) Apache Profi(einstellen und absichern) surfmymoney Lose4Scripts (erledigt) 0 27.12.2006 20:54:49


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:18:36 Uhr.