|
| Stripslashes virker ikke Fra : Stig Holmberg |
Dato : 25-04-09 00:33 |
|
Hej
Jeg forsøger at fjerne backslashes (\) fra formfelter og variabler vha.
funktionen stripslashes()
I nedenstående har jeg indsat nogle backslashes i variablerne, og skriver
f.eks. "te\st" i input-feltet "telefon".
Jeg samler alle variablerne i arrayet $required og kører en foreach på
dette.
Det virker på de passive variabler, men ikke på form-feltet, hvad gør jeg
galt?
Mvh. Stig
<body>
<form action="strip.php" method="post">
<input name="telefon" type="text" />
<input type="submit" name="submit" value="Submit" />
</form>
<?php
if(isset($_POST['submit'])){
$firma = "Oles \Autoværk\sted";
$kontakt = "Ole \mekaniker\ Olsen";
$adresse = "B\\akken 27";
$tlf = $_POST['telefon'];
$required = array($firma,$kontakt,$adresse,$tlf);
if(get_magic_quotes_gpc()){
foreach($required as $key => $value){
$required[$key] = stripslashes($value);
}
}
print_r($required);
}
?>
</body>
| |
Birger Sørensen (25-04-2009)
| Kommentar Fra : Birger Sørensen |
Dato : 25-04-09 02:20 |
|
Stig Holmberg har bragt dette til os:
> Hej
>
> Jeg forsøger at fjerne backslashes (\) fra formfelter og variabler vha.
> funktionen stripslashes()
>
> I nedenstående har jeg indsat nogle backslashes i variablerne, og skriver
> f.eks. "te\st" i input-feltet "telefon".
>
> Jeg samler alle variablerne i arrayet $required og kører en foreach på dette.
>
> Det virker på de passive variabler, men ikke på form-feltet, hvad gør jeg
> galt?
>
> Mvh. Stig
>
> <body>
> <form action="strip.php" method="post">
> <input name="telefon" type="text" />
> <input type="submit" name="submit" value="Submit" />
> </form>
> <?php
>
> if(isset($_POST['submit'])){
> $firma = "Oles \Autoværk\sted";
> $kontakt = "Ole \mekaniker\ Olsen";
> $adresse = "B\\akken 27";
> $tlf = $_POST['telefon'];
>
> $required = array($firma,$kontakt,$adresse,$tlf);
>
> if(get_magic_quotes_gpc()){
> foreach($required as $key => $value){
> $required[$key] = stripslashes($value);
> }
> }
>
> print_r($required);
> }
> ?>
> </body>
Fra
http://dk.php.net/manual/en/control-structures.foreach.php
"
Note: Unless the array is referenced, foreach operates on a copy of the
specified array and not the array itself. foreach has some side effects
on the array pointer. Don't rely on the array pointer during or after
the foreach without resetting it.
As of PHP 5, you can easily modify array's elements by preceding $value
with &. This will assign reference instead of copying the value.
<?php
$arr = array(1, 2, 3, 4);
foreach ($arr as &$value) {
$value = $value * 2;
}
// $arr is now array(2, 4, 6, 8)
unset($value); // break the reference with the last element
?>
....
Warning
Reference of a $value and the last array element remain even after the
foreach loop. It is recommended to destroy it by unset().
"
Ved ikke om det er dit problem - men det ligner meget godt...
Birger
--
http://varmeretter.dk - billig, sund og hurtig mad
http://bbsorensen.dk
| |
Stig Holmberg (25-04-2009)
| Kommentar Fra : Stig Holmberg |
Dato : 25-04-09 02:43 |
|
"Birger Sørensen" <sdc@bbsorensen.com> skrev i meddelelsen
news:49f26555$0$90275$14726298@news.sunsite.dk...
> Stig Holmberg har bragt dette til os:
>> Hej
>>
>> Jeg forsøger at fjerne backslashes (\) fra formfelter og variabler vha.
>> funktionen stripslashes()
>>
>> I nedenstående har jeg indsat nogle backslashes i variablerne, og skriver
>> f.eks. "te\st" i input-feltet "telefon".
>>
>> Jeg samler alle variablerne i arrayet $required og kører en foreach på
>> dette.
>>
>> Det virker på de passive variabler, men ikke på form-feltet, hvad gør jeg
>> galt?
>>
>> Mvh. Stig
>>
>> <body>
>> <form action="strip.php" method="post">
>> <input name="telefon" type="text" />
>> <input type="submit" name="submit" value="Submit" />
>> </form>
>> <?php
>>
>> if(isset($_POST['submit'])){
>> $firma = "Oles \Autoværk\sted";
>> $kontakt = "Ole \mekaniker\ Olsen";
>> $adresse = "B\\akken 27";
>> $tlf = $_POST['telefon'];
>>
>> $required = array($firma,$kontakt,$adresse,$tlf);
>>
>> if(get_magic_quotes_gpc()){
>> foreach($required as $key => $value){
>> $required[$key] = stripslashes($value);
>> }
>> }
>>
>> print_r($required);
>> }
>> ?>
>> </body>
>
> Fra
> http://dk.php.net/manual/en/control-structures.foreach.php
>
> "
> Note: Unless the array is referenced, foreach operates on a copy of the
> specified array and not the array itself. foreach has some side effects on
> the array pointer. Don't rely on the array pointer during or after the
> foreach without resetting it.
>
> As of PHP 5, you can easily modify array's elements by preceding $value
> with &. This will assign reference instead of copying the value.
> <?php
> $arr = array(1, 2, 3, 4);
> foreach ($arr as &$value) {
> $value = $value * 2;
> }
> // $arr is now array(2, 4, 6, 8)
> unset($value); // break the reference with the last element
> ?>
> ...
> Warning
> Reference of a $value and the last array element remain even after the
> foreach loop. It is recommended to destroy it by unset().
> "
>
> Ved ikke om det er dit problem - men det ligner meget godt...
>
> Birger
>
Tak for dit input, jeg har prøvet at sætte & foran $value, men det gav ingen
forskel.
Jeg er ny i php, ved ikke hvilken konsekvens der er i at der arbejdes på en
kopi af arrayet?
Mvh. Stig
| |
Martin (25-04-2009)
| Kommentar Fra : Martin |
Dato : 25-04-09 02:54 |
|
Stig Holmberg wrote:
>
> "Birger Sørensen" <sdc@bbsorensen.com> skrev i meddelelsen
> news:49f26555$0$90275$14726298@news.sunsite.dk...
>> Fra
>> http://dk.php.net/manual/en/control-structures.foreach.php
>>
>> "
>> Note: Unless the array is referenced, foreach operates on a copy of
>> the specified array and not the array itself. foreach has some side
>> effects on the array pointer. Don't rely on the array pointer during
>> or after the foreach without resetting it.
>>
>> As of PHP 5, you can easily modify array's elements by preceding
>> $value with &. This will assign reference instead of copying the value.
>> <?php
>> $arr = array(1, 2, 3, 4);
>> foreach ($arr as &$value) {
>> $value = $value * 2;
>> }
>> // $arr is now array(2, 4, 6, 8)
>> unset($value); // break the reference with the last element
>> ?>
>> ...
>> Warning
>> Reference of a $value and the last array element remain even after the
>> foreach loop. It is recommended to destroy it by unset().
>> "
>>
>> Ved ikke om det er dit problem - men det ligner meget godt...
>>
>> Birger
>>
>
> Tak for dit input, jeg har prøvet at sætte & foran $value, men det gav
> ingen forskel.
Det du kan gøre er
$arr = array(1,2,3,4);
foreach($arr AS $key => $value) {
$arr[$key] = $value * 2;
}
// $arr = array(2,4,6,8)
>
> Jeg er ny i php, ved ikke hvilken konsekvens der er i at der arbejdes på
> en kopi af arrayet?
$arr = array(1,2,3,4);
foreach($arr AS $key => $value) {
$arr[$key] = $value * 2;
break;
}
// $arr = array(2,2,3,4)
| |
Stig Holmberg (25-04-2009)
| Kommentar Fra : Stig Holmberg |
Dato : 25-04-09 11:18 |
|
"Martin" <martin@aarhof.invalid> skrev i meddelelsen
news:49f26d46$0$90273$14726298@news.sunsite.dk...
>
> Det du kan gøre er
>
> $arr = array(1,2,3,4);
> foreach($arr AS $key => $value) {
> $arr[$key] = $value * 2;
> }
> // $arr = array(2,4,6,8)
Det er jo det jeg gør i forvejen:
if(get_magic_quotes_gpc()){
foreach($required as $key => $value){
$required[$key] = stripslashes($value);
}
}
Det virker bare ikke på variablen $tlf der kommer fra $_POST['telefon']
Mvh. Stig
| |
Bertel Lund Hansen (25-04-2009)
| Kommentar Fra : Bertel Lund Hansen |
Dato : 25-04-09 07:18 |
|
Stig Holmberg skrev:
> Tak for dit input, jeg har prøvet at sætte & foran $value, men det gav ingen
> forskel.
Nej, det er klart. Der var ikke det omtalte problem i din kode.
> Jeg er ny i php, ved ikke hvilken konsekvens der er i at der arbejdes på en
> kopi af arrayet?
Princippet der overrasker begyndere:
$variabel = "etellerandet";
$løkkekopi_af_variabel = $variabel;
$løkkekopi_af_variabel = "nogetheltandet";
echo $variabel;
og så spørger de:
Hvorfor er $variabel ikke blevet ændret?
Her er din kode som den skulle se ud hvis du ville indføre
omtalte fejl i den:
FEJLKODE:
if (get_magic_quotes_gpc()) {
foreach($required as $key => $value) {
$value = stripslashes($value);
}
}
--
Bertel
http://bertel.lundhansen.dk/ FIDUSO: http://fiduso.dk/
| |
Stig Holmberg (25-04-2009)
| Kommentar Fra : Stig Holmberg |
Dato : 25-04-09 12:36 |
|
"Bertel Lund Hansen" <unospamo@lundhansen.dk> skrev i meddelelsen
news:rfa5v4hcnbf4a207frs2k42stadffgg677@news.stofanet.dk...
> Stig Holmberg skrev:
>
>> Tak for dit input, jeg har prøvet at sætte & foran $value, men det gav
>> ingen
>> forskel.
>
> Nej, det er klart. Der var ikke det omtalte problem i din kode.
>
>> Jeg er ny i php, ved ikke hvilken konsekvens der er i at der arbejdes på
>> en
>> kopi af arrayet?
>
> Princippet der overrasker begyndere:
>
> $variabel = "etellerandet";
> $løkkekopi_af_variabel = $variabel;
> $løkkekopi_af_variabel = "nogetheltandet";
> echo $variabel;
>
> og så spørger de:
>
> Hvorfor er $variabel ikke blevet ændret?
Ja det virker logisk nok.
> Her er din kode som den skulle se ud hvis du ville indføre
> omtalte fejl i den:
>
> FEJLKODE:
>
> if (get_magic_quotes_gpc()) {
> foreach($required as $key => $value) {
> $value = stripslashes($value);
> }
> }
Det forstår jeg så ikke, er $value ikke en intern variabel i løkken som ikke
har noget at gøre med vores oprindelige værdi?
Og den burde det være muligt at ændre?
Og så burde dette da heller ikke virke:
if(get_magic_quotes_gpc()){
foreach($required as $key => $value){
$required[$key] = stripslashes($value);
}
}
For hvis $required er en kopi, burde den oprindelige $required da ikke ændre
sig?
Ja, nu er jeg totalt forvirret, og min stripslashes virker stadig ikke, har
prøvet at lave en simpel konkatenering i løkken og det virker fint også på
input feltet: $required[$key] = $value . "Testing";
Mvh. Stig
| |
Martin (25-04-2009)
| Kommentar Fra : Martin |
Dato : 25-04-09 18:18 |
|
Stig Holmberg wrote:
> Det forstår jeg så ikke, er $value ikke en intern variabel i løkken som
> ikke har noget at gøre med vores oprindelige værdi?
Nej
Hvis du bruger den som reference, så lig mærke til den søde warning som
står i manualen
Warning
Reference of a $value and the last array element remain even after the
foreach loop. It is recommended to destroy it by unset().
| |
Bertel Lund Hansen (26-04-2009)
| Kommentar Fra : Bertel Lund Hansen |
Dato : 26-04-09 11:14 |
|
Stig Holmberg skrev:
> Ja det virker logisk nok.
Godt.
> > FEJLKODE:
> >
> > if (get_magic_quotes_gpc()) {
> > foreach($required as $key => $value) {
> > $value = stripslashes($value);
> > }
> > }
> Det forstår jeg så ikke, er $value ikke en intern variabel i løkken som ikke
> har noget at gøre med vores oprindelige værdi?
Jo, netop. Når løkken er færdig, er $value død, og alle ændringer
af den er gået tabt.
> Og den burde det være muligt at ændre?
Ja - men uden permanent effekt. Enhver ændring er ligegyldig -
medmindre den genbruges inden for løkken.
> Og så burde dette da heller ikke virke:
> if(get_magic_quotes_gpc()){
> foreach($required as $key => $value){
> $required[$key] = stripslashes($value);
> }
> }
Jo, for der er det ikke den midlertidige variabel der ændres, men
derimod det originale array som er aktivt både enden for og uden
for løkken. Det gør ikke spor at $key også er midlertidig. Den
skal bare udpege det rigtige element der skal ændres.
> For hvis $required er en kopi,
Det er det ikke.
> Ja, nu er jeg totalt forvirret, og min stripslashes virker stadig ikke,
Nej, det har jeg ingen løsning på (bortset fra at man kan lave
noget brute-force med gentagen fjerning af skråstreger til alle
er væk).
--
Bertel
http://bertel.lundhansen.dk/ FIDUSO: http://fiduso.dk/
| |
Stig Holmberg (26-04-2009)
| Kommentar Fra : Stig Holmberg |
Dato : 26-04-09 21:49 |
|
"Bertel Lund Hansen" <unospamo@lundhansen.dk> skrev i meddelelsen
news:2oc8v4pa88l1q1qf8ga4ug6gq3fra6000f@news.stofanet.dk...
> Stig Holmberg skrev:
>
>> Ja det virker logisk nok.
>
> Godt.
>
>> > FEJLKODE:
>> >
>> > if (get_magic_quotes_gpc()) {
>> > foreach($required as $key => $value) {
>> > $value = stripslashes($value);
>> > }
>> > }
>
>> Det forstår jeg så ikke, er $value ikke en intern variabel i løkken som
>> ikke
>> har noget at gøre med vores oprindelige værdi?
>
> Jo, netop. Når løkken er færdig, er $value død, og alle ændringer
> af den er gået tabt.
Aha, så faldt tiøren, tak for det.
>> Og den burde det være muligt at ændre?
>
> Ja - men uden permanent effekt. Enhver ændring er ligegyldig -
> medmindre den genbruges inden for løkken.
Selvfølgelig, det burde jeg have gennemskuet.
>
>> Og så burde dette da heller ikke virke:
>
>> if(get_magic_quotes_gpc()){
>> foreach($required as $key => $value){
>> $required[$key] = stripslashes($value);
>> }
>> }
>
> Jo, for der er det ikke den midlertidige variabel der ændres, men
> derimod det originale array som er aktivt både enden for og uden
> for løkken. Det gør ikke spor at $key også er midlertidig. Den
> skal bare udpege det rigtige element der skal ændres.
Nu forstår jeg forskellen.
>> For hvis $required er en kopi,
>
> Det er det ikke.
>
>> Ja, nu er jeg totalt forvirret, og min stripslashes virker stadig ikke,
>
> Nej, det har jeg ingen løsning på (bortset fra at man kan lave
> noget brute-force med gentagen fjerning af skråstreger til alle
> er væk).
Det er heldigvis løst nu, se min anden post.
Tak for hjælpen, det var oplysende.
Mvh. Stig
| |
Bertel Lund Hansen (25-04-2009)
| Kommentar Fra : Bertel Lund Hansen |
Dato : 25-04-09 07:13 |
|
Birger Sørensen skrev:
> Note: Unless the array is referenced, foreach operates on a copy of the
> specified array and not the array itself.
Det problem har Stigs kode ikke. Han ændrer
$required[$key]
og det er netop det originale array og ikke kopien.
--
Bertel
http://bertel.lundhansen.dk/ FIDUSO: http://fiduso.dk/
| |
Bertel Lund Hansen (25-04-2009)
| Kommentar Fra : Bertel Lund Hansen |
Dato : 25-04-09 07:12 |
|
Stig Holmberg skrev:
> Det virker på de passive variabler, men ikke på form-feltet, hvad gør jeg
> galt?
Du gør sådan set ikke noget galt, men der er noget du ikke er
opmærksom på. Indføj en linje i din kode, så får du syn for
sagen:
> if(get_magic_quotes_gpc()){
> foreach($required as $key => $value){
echo "<p>$value</p>";
> $required[$key] = stripslashes($value);
> }
> }
Jeg ved ikke hvorfor det er sådan, men jeg gætter på at det er
get_magic_quotes_gpc() der laver noget automatik.
--
Bertel
http://bertel.lundhansen.dk/ FIDUSO: http://fiduso.dk/
| |
Stig Holmberg (25-04-2009)
| Kommentar Fra : Stig Holmberg |
Dato : 25-04-09 15:15 |
|
"Bertel Lund Hansen" <unospamo@lundhansen.dk> skrev i meddelelsen
news:79a5v4pv0r34tfcu4dr7c92n9tb3ibsngd@news.stofanet.dk...
> Stig Holmberg skrev:
>
>> Det virker på de passive variabler, men ikke på form-feltet, hvad gør jeg
>> galt?
>
> Du gør sådan set ikke noget galt, men der er noget du ikke er
> opmærksom på. Indføj en linje i din kode, så får du syn for
> sagen:
>
>> if(get_magic_quotes_gpc()){
>> foreach($required as $key => $value){
> echo "<p>$value</p>";
>> $required[$key] = stripslashes($value);
>> }
>> }
>
> Jeg ved ikke hvorfor det er sådan, men jeg gætter på at det er
> get_magic_quotes_gpc() der laver noget automatik.
Tak for din hjælp, der er som du siger ikke noget galt med foreach-løkken,
men jeg har nu fundet fejlen.
Det der forvirrede mig var at stripslashes fjernede de \ jeg skrev ind i
mine passive variabler men ikke dem jeg skrev i input-feltet.
Det skyldes følgende:
1. Anførselstegn i variabler fra $_POST arrayet bliver escaped(\") af
magicquotes.
2. Backslashes i variabler fra $_POST arrayet bliver escaped(\\) af
magicquotes.
3. Backslashes i variabler fra $_POST arrayet BLIVER fjernet af
stripslashes - MEN da magicquotes sætter 1 ekstra (se punkt 2) bliver der en
tilbage.
4. Alle backslashes i variabler der IKKE kommer fra $_POST arrayet bliver
fjernet af stripslashes.
Man kan sige at jeg testede funktionen på en forkert måde, ved at sætte \
ind i input-feltet og de passive variabler, jeg skulle have testet med
anførselstegn.
Jeg stirrede mig blind på at stripslashes fjernede \ fra mine passive
variabler, men ikke gjorde det fra mit input-felt variabel, men det var bare
punkt 3. der var på spil.
Mvh. Stig
| |
Martin (25-04-2009)
| Kommentar Fra : Martin |
Dato : 25-04-09 18:23 |
|
Stig Holmberg wrote:
>
> "Bertel Lund Hansen" <unospamo@lundhansen.dk> skrev i meddelelsen
> news:79a5v4pv0r34tfcu4dr7c92n9tb3ibsngd@news.stofanet.dk...
>> Stig Holmberg skrev:
>>
>>> Det virker på de passive variabler, men ikke på form-feltet, hvad gør
>>> jeg
>>> galt?
>>
>> Du gør sådan set ikke noget galt, men der er noget du ikke er
>> opmærksom på. Indføj en linje i din kode, så får du syn for
>> sagen:
>>
>>> if(get_magic_quotes_gpc()){
>>> foreach($required as $key => $value){
>> echo "<p>$value</p>";
>>> $required[$key] = stripslashes($value);
>>> }
>>> }
>>
Glæd dig til PHP6, så er magic_quotes slået helt fra, og kan ikke sættes
til on :)
og er allerde deprecated
This feature has been DEPRECATED as of PHP 5.3.0 and REMOVED as of PHP
6.0.0. Relying on this feature is highly discouraged.
Hvis du skal bruge den til at indsætte i en database, så bare nøjes med
mysql_real_escape_string
| |
Stig Holmberg (25-04-2009)
| Kommentar Fra : Stig Holmberg |
Dato : 25-04-09 20:30 |
|
"Martin" <martin@aarhof.invalid> skrev i meddelelsen
news:49f3470f$0$90270$14726298@news.sunsite.dk...
> Stig Holmberg wrote:
>>
>> "Bertel Lund Hansen" <unospamo@lundhansen.dk> skrev i meddelelsen
>> news:79a5v4pv0r34tfcu4dr7c92n9tb3ibsngd@news.stofanet.dk...
>>> Stig Holmberg skrev:
>>>
>>>> Det virker på de passive variabler, men ikke på form-feltet, hvad gør
>>>> jeg
>>>> galt?
>>>
>>> Du gør sådan set ikke noget galt, men der er noget du ikke er
>>> opmærksom på. Indføj en linje i din kode, så får du syn for
>>> sagen:
>>>
>>>> if(get_magic_quotes_gpc()){
>>>> foreach($required as $key => $value){
>>> echo "<p>$value</p>";
>>>> $required[$key] = stripslashes($value);
>>>> }
>>>> }
>>>
>
> Glæd dig til PHP6, så er magic_quotes slået helt fra, og kan ikke sættes
> til on :)
>
> og er allerde deprecated
>
> This feature has been DEPRECATED as of PHP 5.3.0 and REMOVED as of PHP
> 6.0.0. Relying on this feature is highly discouraged.
>
> Hvis du skal bruge den til at indsætte i en database, så bare nøjes med
> mysql_real_escape_string
Ja, det var en mindre god idé de fik dengang med magicquotes
Mvh. Stig
| |
|
|