[PHP] unserialize probleem met & " ' < > *

Pagina: 1
Acties:
  • 116 views sinds 30-01-2008
  • Reageer

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik heb een probleem om de volgende lettertekens door unserialize te halen: & " ' < >
Ik doe het volgende in mijn script:

PHP:
1
2
3
4
5
6
<?php 
$stack1 = array("description_".$row[1] => $description); 
$stack2 = array("turnover_".$row[1] => $turnover); 
$stack3 = array("published_site_".$row[1] => $published_site); 
$array = array_merge ($array,$stack1,$stack2,$stack3); 
?> 

En deze word dmv een form verstuurd.

Hierna doe ik het volgende:
PHP:
1
2
3
4
5
<?php 
$array = $HTTP_POST_VARS["array"]; 
$array = stripslashes($array); 
$array = unserialize($array); 
?> 

Hierna ga ik ze verwerken en zolang ik geen & " ' < of > gebruik gaat het goed.
Anders krijg ik de volgende melding:

Notice: unserialize(): Error at offset 1143 of 1203 bytes in D:\webserver\docs\document.php on line x
Waarbij "line x" de volgende regel is;

PHP:
1
2
3
<?php 
$array = unserialize($array); 
?> 


Ik kan helaas deze lettertekens niet escapen, want het is om tekst door te geven, waarbij ik ook de vrijheid wil laten om deze lettertekens te gebruiken.
Het gaat om een Windows 2000 server met Sambar en met PHP Version 4.3.2

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

HTMLSpecialChars eroverheen gooien?

En $HTTP_POST_VARS is hopeloos uit de tijd. Gebruik $_POST.

[ Voor 52% gewijzigd door NMe op 14-02-2005 22:01 ]

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
PHP:
1
2
3
4
5
6
7
<?php 
$description1 = htmlspecialchars($description);
$stack1 = array("description_".$row[1] => $description1);  
$stack2 = array("turnover_".$row[1] => $turnover);  
$stack3 = array("published_site_".$row[1] => $published_site);  
$array = array_merge ($array,$stack1,$stack2,$stack3);  
?>

Als je het zo bedoel.... Helaas, ik zie in beide gevallen (met en zonder htmlspecialchars) na een print_r($array); tussen de regel van de stripslashes en de unserialize wel de trekens terugkomen, maar de foutmelfing blijft bestaan

Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

Gebruik je wel htmlspecialchars bij het wegschrijven naar het formulier?
Is de stripslashes wel nodig (check of magic_quotes_gpc aan of uit staat)?
Zitten er geen enters in je serialized string?

[ Voor 14% gewijzigd door crisp op 14-02-2005 23:49 ]

Intentionally left blank


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
  • description_10";s:29:"& " ' < >";s:11:"turnover_10";s:4:"0.00";s:17:"published_site_10";s:0:"";}
Dit bovenstaande is een deel van de output van print_r
Op het scherm staat:
  • & " ' < >
In de source (HTML) staat:
  • <font color='#FFFFFF' font face='Tahoma'>  & " ' < >  </font>
In de php.ini staat bij magic quotes:
  • magic_quotes_gpc = On
En zoals je ziet staat htmlspecialchars alleen aan bij het wegschrijven naar de array.
Bij het wegschrijven naar MySQL doe ik wel:
PHP:
1
$description = htmlentities(trim($description),ENT_QUOTES);

Maar ik bewerk ze NIET tijdens het opvragen naar het document.
Dit om te voorkomen en er juist mee te bereiken dat bijvoorbeeld:
  • ' \' '' \\' \\\' " \" "" \\" \\\" ` \` `` \\` \\\`
goed gaat.

Acties:
  • 0 Henk 'm!

  • mjax
  • Registratie: September 2000
  • Laatst online: 20:52
Waarom gebruik je geen session variabelen voor het doorgeven van dit soort arrays?

Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

Ik zie niet waar je de $array serialized wegschrijft in je form. Je moet niet enkel de description voorzien van entities, maar je hele serialized string:
PHP:
1
echo '<input type="hidden" value="' . htmlspecialchars(serialize($array)) . '">';

Bij het schrijven naar je database zou ik juist geen htmlentities/specialchars gebruiken. Rule of thumb is: output naar HTML -> entities/specialchars, schrijven naar database -> escapen.

Wat er nu waarschijnlijk gebeurd is dat je zoiets in je HTML output hebt:
HTML:
1
<input type='hidden' value='s:22:"& " < >";'>

maar dat krijg je zo terug in je script:
code:
1
s:22:"& " < >";
mjax schreef op dinsdag 15 februari 2005 @ 08:30:
Waarom gebruik je geen session variabelen voor het doorgeven van dit soort arrays?
Dat zou misschien een optie kunnen zijn, maar soms kan het handig zijn om het op deze manier te doen. In de topicadmin van dit forum gebruik ik ook een serialized array in een hidden formfield die ik mbv een serialize/unserialize implementatie in javascript ook clientside kan bewerken :)

[ Voor 51% gewijzigd door crisp op 15-02-2005 09:29 ]

Intentionally left blank


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
crisp schreef op dinsdag 15 februari 2005 @ 09:17:
Ik zie niet waar je de $array serialized wegschrijft in je form. Je moet niet enkel de description voorzien van entities, maar je hele serialized string:
PHP:
1
echo '<input type="hidden" value="' . htmlspecialchars(serialize($array)) . '">';
Dat was de truuk _/-\o_
Bij het schrijven naar je database zou ik juist geen htmlentities/specialchars gebruiken. Rule of thumb is: output naar HTML -> entities/specialchars, schrijven naar database -> escapen.
Dit wil ik later nog eens bekijken, bedankt voor deze hint
Wat er nu waarschijnlijk gebeurd is dat je zoiets in je HTML output hebt:
HTML:
1
<input type='hidden' value='s:22:"&amp;amp; &amp;quot; &amp;lt; &amp;gt;";'>
Ik zie het volgende in mijn HTML output:
HTML:
1
description_11&quot;;s:31:&quot;&amp;amp; &amp;quot; &amp;#039; &amp;lt; &amp;gt; *&quot;;
maar dat krijg je zo terug in je script:
code:
1
s:22:"&amp; &quot; &lt; &gt;";
Dit klopt echter niet. Ik zie echt alleen de "probleem"-caracters terug. :r
Dit is nu echter opgelost door de bovengenoemde escape :*)
Pagina: 1