Funktion für ein Array
Onkel Schnitzel
- php
0 wahsaga0 Frank0 Onkel Schnitzel0 Tom
0 dedlfix
Hallo,
ich versuche gerade eine Funktion hinzubekommen, mit der ich die Sicherheits-backslashes entfernen kann. Schreib ich die Funktion stripslashes direkt vor mein Array, werden die backslashes entfernt.
".htmlentities(stripslashes($auslesen['name']))."
Ich will das aber mit einer eigenen Funktion machen, weil ja auch zusätzlich eine Abfrage (zu magic_quotes) enthalten sein soll, außerdem soll da auch htmlentities mit rein.
function strip($var) {
if(get_magic_quotes_gpc()) {
foreach($var AS $key) {
strip($var[$key]);
}
}
}
".htmlentities(strip($auslesen['name']))."
Doch leider funktioniert das mit der Zuordnung im array wohl nicht. Der Browser gibt mir diese Fehlermeldung: "Warning: Invalid argument supplied for foreach()..." Ich dachte eigentlich, daß es mit der Funktion geht. Für jeden vorhandenen Schlüssel werden die slashes entfernt, oder nicht???
Gruß,
Onkel Schnitzel
hi,
function strip($var) {
if(get_magic_quotes_gpc()) {
foreach($var AS $key) {
"Warning: Invalid argument supplied for foreach()..."
dann ist $var wohl kein array.
hast du das vorher mal geprüft? (is_array, var_dump)
gruß,
wahsaga
Hallo wahsaga,
dann ist $var wohl kein array.
hast du das vorher mal geprüft? (is_array, var_dump)
Ich ging eigentlich davon aus, daß das ein Array ist. Diese Funktion hier erzeugt doch ein Array ($auslesen), oder? -
"while($auslesen = mysql_fetch_assoc($anfrage2))...."
Ich hab mal testweise das hier in mein Script geschrieben:
"<pre>\n".print_r($auslesen)."</pre>"
Dabei kam das hier heraus:
Array ( [ID] => 52 [name] => Tester [ort] => Testhausen [mail] => test@test.de [Datum] => 11.04.05 [Zeit] => 15:38 [tag_ind] => 1 [text] => Hallo Gästebuch, ich gebe jetzt mal einen text ein.
Das heißt doch, daß $auslesen ein Array ist, mit String-Keys (ID, name, ort, mail, text) und dazugehörigen Werten. Oder liege ich jetzt völlig daneben?
Grüße,
Onkel Schnitzel
Hi Schnitzel,
strip($var[$key]);
Versuch mal strip($key) ...
Gruss, Frank
Hallo Frank
Versuch mal strip($key) ...
ich hatte ja außerdem noch einen Fehler drin. Es müßte ja wenn, dann heißen
stripslashes($key);
Aber auch das funktioniert nicht. Es kommt die gleiche Fehlermeldung.
Gruß,
Onkel Schnitzel
Hello,
strip($var[$key]);
Versuch mal strip($key) ...
Die Funktion strip() stammt aber z.B. aus meiner Sammlung und die muss man auf das Array insgesamt anwenden also:
$_POST = strip($_POST);
Dann werden die Maslkierungen entfernt, wenn PHP sie gesetzt hat.
http://forum.de.selfhtml.org/archiv/2004/1/t68384/#m392313
Harzliche Grüße aus http://www.annerschbarrich.de
Tom
echo $begrueszung;
foreach($var AS $key) {
strip($var[$key]);
Die Syntax für foreach lautet entweder so:
foreach ($var as $key => $value)
oder so:
foreach ($var as $value)
Wenn du den Key haben willst, musst du die erste Syntax nehmen. Den $value lässt du dann einfach im weiteren Verlauf unbeachtet, wen du den nicht brauchst.
Alternativ ginge auch ein
foreach (array_keys($var) as $key)
Das zeigt zwar etwas deutlicher, dass du es nur auf die Keys abgesehen hast, aber dazu muss erst ein neues Array mit den Keys von $var angelegt werden, und das verbraucht unnötig Ressourcen.
ich versuche gerade eine Funktion hinzubekommen, mit der ich die Sicherheits-backslashes entfernen kann.
Du hast aber ein generelles Ablauf-Problem. Du müsstest die Slahes gleich bei der Eingabe der Daten wegwerfen und sie nicht erst bis zur Datenbank gelangen lassen.
Wenn du (oder dein Provider) später mal die magic_quotes_gpc-Einstellung in der Konfiguration (endlich) ausschalte(s)t, dann hast du geslashte Daten in der DB und die neuen Daten kommen ohne. Das wird dann schwer, zu unterscheiden, wann du dann bei der Ausgabe stripslahes anwenden musst und wann nicht.
Sag jetzt nicht, dass man das herausbekommt, wenn man ein Timestamp-Feld des Datensatzes mit einem Stichtag vergleicht. Das geht zwar, ist aber eine Teufel-mit-Belzebub-Austreib-Methode. :-)
Und get_magic_quotes_gpc() sagt dir auch nur, wie die aktuelle Konfigurationseinstellung momentan ist, nicht wie sie damals beim Dateneinlesen war.
echo "$verabschiedung $name";
Hallo dedl,
Du hast aber ein generelles Ablauf-Problem. Du müsstest die Slahes gleich bei der Eingabe der Daten wegwerfen und sie nicht erst bis zur Datenbank gelangen lassen.
Das ist ja der Punkt- das wollte ich eigentlich, aber da wurde es richtig "verrückt". Ich versuchs mal kurz zu machen.
Das ist die Funktion in der Formulardatei:
function array_stripslashes(&$var) {
if(is_string($var)) {
$var = stripslashes($var);
}
else {
if(is_array($var)) {
foreach($var AS $key => $value) {
array_stripslashes($var[$key]);
}
}
}
}
if(get_magic_quotes_gpc()) {
array_stripslashes($_REQUEST);
}
Das ist das Formularfeld:
name="name" value="<?php if (isset($_POST['name'])) echo htmlentities($_REQUEST['name']); ?>"
Dann folgen diverse Abfragen und der Eintrag in die Datenbank:
$send = "";
if(isset($_POST['send'])) {
$send = key($_POST['send']);
}
switch ($send) {
case 'ok': if (isset($_POST["name"])) {
$namski = $_POST["name"];
Das funktioniert soweit. Dies slashes werden im formularfeld auch gestript, nur nicht beim Eintrag in die Datenbank. Dazu wollte ich die Funktion so ergänzen:
if(get_magic_quotes_gpc()) {
array_stripslashes($_REQUEST);
array_stripslashes($_POST);
}
Aber dann wird meine switch-Schleife plötzlich nicht mehr durchlaufen. Ich hab schon alle möglichen Varianten probiert, aber mit diesem Zusatz von $_POST in der Funktion wills irgendwie nicht funktionuckeln.
Gruß,
Onkel Schnitzel
Ich hab die Übertragungsart in der Abfrage auf $_REQUEST gesetzt.
switch ($send) {
case 'ok': if (isset($_POST["name"])) {
$namski = $_REQUEST["name"];
if(strlen($namski) >= 2) {
if(!(@trim($_REQUEST['mail'])) == ""){.....
Aber jetzt frage ich mich, ob es wirklich so gut ist, die slashes schon vor dem Eintrag in die Datenbank zu entfernen. Haben die magic_quotes nicht auch die Aufgabe, die Datenbank zu schützen?
Gruß,
Onkel Schnitzel
Ich hab die Übertragungsart in der Abfrage auf $_REQUEST gesetzt.
Das hab ich vergessen, dazu zu schreiben- so funktioniert es.
re Onkel
Aber jetzt frage ich mich, ob es wirklich so gut ist, die slashes schon vor dem Eintrag in die Datenbank zu entfernen. Haben die magic_quotes nicht auch die Aufgabe, die Datenbank zu schützen?
Ja, dafür waren sie jedenfalls gedacht. Das tun sie aber nur halbherzig [1], und manchmal richten sie mehr Unsinn an, als sie nützen. Die Eingabedaten werden ja oft nicht nur in einer DB versenkt, sondern auch mal zur Kontrolle "auf dem Bildschirm" ausgegeben, und da gehören die Slashes nicht hin.
Mit dem Thema und dem Für und Wider beschäftigt sich auch das PHP-Handbuch in einem eigenen Kapitel. Mittlerweile wird auch empfohlen, diese Funktionalität auszuschalten.
dedlfix
[1] Es muss ja nicht für jede Datensenke gelten, dass bestimmte Zeichen mit Backslash zu maskieren sind. Teilweise gibt's da ja auch bessere Verfahren (z.B. mysql_real_escape_string())
[1] Es muss ja nicht für jede Datensenke gelten, dass bestimmte Zeichen mit Backslash zu maskieren sind. Teilweise gibt's da ja auch bessere Verfahren (z.B. mysql_real_escape_string())
Ja, dieses mysql_real_escape_string() wende ich vor dem Eintrag in die Datenbank an. Wenn das die Funktion von magic_quotes mit übernimmt und darüber hinaus noch mehr, dann bin ich ja schon zufrieden.
Danke auch für Deine andere ausführliche Antwort- sehr aufschlußreich. Ich werde versuchen, das anzuwenden und auch Deine Fehlerfunktion zu verstehen.
Mit besten Grüßen,
Onkel Schnitzel
echo $begrueszung;
Danke auch für Deine andere ausführliche Antwort- sehr aufschlußreich. Ich werde versuchen, das anzuwenden und auch Deine Fehlerfunktion zu verstehen.
Nenn sie lieber "Kontroll-Funktion", das beschreibt sie besser, weil man mit ihr den Inhalt (und Typ) von Variablen "kontrollieren" kann.
Einen weiteren Schritt zum "ordentlichen Programmierer" hast du getan, wenn du statt: "Es funktioniert" sagen kannst: "Es funktioniert, und ich weiß auch, warum" :-)
echo "$verabschiedung $name";
nochmal re
Du hast aber ein generelles Ablauf-Problem. Du müsstest die Slahes gleich bei der Eingabe der Daten wegwerfen und sie nicht erst bis zur Datenbank gelangen lassen.
Das ist ja der Punkt- das wollte ich eigentlich, aber da wurde es richtig "verrückt". Ich versuchs mal kurz zu machen.
Das ist die Funktion in der Formulardatei:
function array_stripslashes(&$var) {
Die kommt mir bekannt vor :-)
name="name" value="<?php if (isset($_POST['name'])) echo htmlentities($_REQUEST['name']); ?>"
Mix doch mal nicht $_POST und $_REQUEST. Nimm nur eines von beiden. Wenn du weißt, dass deine Daten immer mit der $_POST kommen, nimm dies. Wenn sie mal so und mal mit $_GET kommen, nimm $_REQUEST.
Aber dann wird meine switch-Schleife plötzlich nicht mehr durchlaufen. Ich hab schon alle möglichen Varianten probiert, aber mit diesem Zusatz von $_POST in der Funktion wills irgendwie nicht funktionuckeln.
Nach einem Probier-Schritt ist wichtig, zu ergründen, warum hat das jetzt geklappt oder warum zum Kuckuck ging das eben nicht. Dabei helfen Kontroll-Ausgaben von Variablen und deren Werten.
Ich hab mir dazu diese Funktion geschrieben:
/**
* returns debug presentation of $what
*
* @param mixed $what the delinquent
* @param boolean $vardump use var_dump instaed of print_r
* @param boolean $noPre don't use <pre> surrounding output
* @param boolean $htmlchars convert special html chars to entities
* @return string
*/
function dbg($what, $vardump = false, $noPre = false, $htmlchars = false) {
ob_start();
if ($vardump)
var_dump($what);
else
print_r($what);
$ob = ob_get_contents();
ob_end_clean();
$result = $htmlchars ? htmlspecialchars($ob) : $ob;
if (!$noPre)
$result = "<pre>\n$result</pre>\n";
echo $result;
} //dbg
Die beiden wichtigsten Aufruf-Varianten sind.
// Ausgabe der Variable mit print_r innerhalb von <pre> </pre>
dbg($variable);
// Ausgabe mit var_dump() statt print_r()
dbg($variable, 1);
Die zweite Variante hat den Vorteil, dass der Typ der Variable angezeigt wird, ist aber bei Array- und Objekt-Ausgaben etwas unübersichtlicher anzusehen als print_r()
Dann folgen diverse Abfragen und der Eintrag in die Datenbank:
$send = "";
if(isset($_POST['send'])) {
$send = key($_POST['send']);
}
ein Aufruf von
dbg($_POST['send'], 1);
würde dir beispielsweise zeigen, was mit $_POST['send'] genau los ist. Welchen Typ hat es, welchen Wert hat es. Wenn du das weißt, und einen zusätzlichen Blick ins PHP-Handbuch in die Parameterliste von key() wirfst, weißt du auch schon, ob du die Funktion key() hier mit dem richtigen Parameter (ein Array) gefüttert hast oder nicht.
Und dann kannst du weitere Schritte einleiten...
dedlfix