[PHP] Serialize probleem met quotes e.d.

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Rhapsody
  • Registratie: Oktober 2002
  • Laatst online: 10:47

Rhapsody

In Metal We Trust

Topicstarter
Hey allen,


Ik heb een object dat ik wil opslaan in de database (mysql). Dit object heeft een property welke ik vul met HTML.
Nu krijg ik bij het unserializen alleen de volgende melding: Notice: unserialize(): Error at offset 240 of 258 bytes in...

Na wat zoekwerk ben ik erachter gekomen dat dat aan de quotes e.d. ligt. Nu heb ik geprobeerd htmlspecialchars te gebruiken, maar dat maakt niets uit.

Hier op GoT staat een topic met een zelfde probleem, alleen kom ik daar nergens een oplossing tegen.

Kan iemand mij hiermee helpen?


edit: [rml][ PHP] unserialize probleem met & " ' < > *[/rml] is het topic.

[ Voor 10% gewijzigd door Rhapsody op 27-07-2006 17:43 . Reden: link naar andere topic toegevoegd ]

🇪🇺 pro Europa! | Dit was niet mijn kabinet!


Acties:
  • 0 Henk 'm!

  • Shadowman
  • Registratie: Januari 2002
  • Niet online
stripslashes() voor je het door de unserialize haalt.

Klinkt overigens als magic quotes @ runtime. (Ik neem aan dat bij het unserializen de data uit de database komt).

Dit gedrag kun je zo uitzetten:
ini_set("magic_quotes_runtime", "0");

Acties:
  • 0 Henk 'm!

  • Rhapsody
  • Registratie: Oktober 2002
  • Laatst online: 10:47

Rhapsody

In Metal We Trust

Topicstarter
Shadowman schreef op donderdag 27 juli 2006 @ 21:19:
stripslashes() voor je het door de unserialize haalt.

Klinkt overigens als magic quotes @ runtime. (Ik neem aan dat bij het unserializen de data uit de database komt).

Dit gedrag kun je zo uitzetten:
ini_set("magic_quotes_runtime", "0");
het wil nog niet helemaal lukken.

Ff voor de duidelijkheid een stappenplan:

1. html door addslashes halen
2. object serializen
3. opslaan in db

4. uitlezen
5. stripslashes
6. unserializen

klopt dat?

En dat met die magic_quotes heb ik nu helemaal bovenaan staan, al heb ik dat nog nooit hoeven gebruiken. :)


edit:
Zo wordt het momenteel in de database opgeslagen:
code:
1
O:4:"test":2:{s:8:"property";s:32:"asddsdadas <hr SIZE=\"4\" />";s:5:"other";N;}

Dus eerst via addslashes.

Vervolgens krijg ik dan deze fout bij het unserializen:
Notice: unserialize(): Error at offset 68 of 78 bytes

[ Voor 33% gewijzigd door Rhapsody op 27-07-2006 21:45 ]

🇪🇺 pro Europa! | Dit was niet mijn kabinet!


Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

stappenplan zou als volgt moeten zijn:

1. object serializen
2. serialized string escapen met juiste escape-functie - voor MySQL is dat mysql_(real_)escape_string
3. opslaan in DB

4. uitlezen
5. unserializen

zolang magic_quotes_runtime uitstaat hoef je niet te unescapen

Intentionally left blank


Acties:
  • 0 Henk 'm!

  • Sybr_E-N
  • Registratie: December 2001
  • Laatst online: 12-06 19:52
Heb je ook een testcase welke fout gaat?

Als ik zelf het volgende voorbeeld uitvoer gaat het gewoon goed. (Ik laat het database gedeelte er even uit). Dit zou bij jouw ook fout moeten gaan dan?

PHP:
1
2
3
4
5
$html = '<BODY><A HREF="blaat.php">DIT is een Test</A></BODY>';

$serial = serialize($html);

echo unserialize($serial);

Acties:
  • 0 Henk 'm!

  • Guru Evi
  • Registratie: Januari 2003
  • Laatst online: 11-06 13:22
Ik denk net als crisp dat je gewoon de verkeerde volgorde gebruikt hebt.

Ik gebruik zelf Magic Quotes niet omdat het enorm onvoorspelbaar is als je port naar andere servers. Als iemand zijn input onveilig wil aannemen, ok, ik zorg wel in mijn code dat het goed gaat maar workarounds zoals Magic Quotes zorgen gewoon dat de programmeur lui wordt.

Pandora FMS - Open Source Monitoring - pandorafms.org


Acties:
  • 0 Henk 'm!

  • Rhapsody
  • Registratie: Oktober 2002
  • Laatst online: 10:47

Rhapsody

In Metal We Trust

Topicstarter
Sybr_E-N schreef op donderdag 27 juli 2006 @ 21:59:
Heb je ook een testcase welke fout gaat?

Als ik zelf het volgende voorbeeld uitvoer gaat het gewoon goed. (Ik laat het database gedeelte er even uit). Dit zou bij jouw ook fout moeten gaan dan?

PHP:
1
2
3
4
5
$html = '<BODY><A HREF="blaat.php">DIT is een Test</A></BODY>';

$serial = serialize($html);

echo unserialize($serial);
nee die werkt gewoon wel bij mij.


Ik heb inderdaad een testcase gemaakt.

De html die ik wil serializen komt van een TinyMCE af.

edit: even een korte update. Het ziet er naar uit dat de $_POST reeds ge-addslashed is, alsof dit gebeurt door TinyMCE.

[ Voor 15% gewijzigd door Rhapsody op 27-07-2006 22:19 ]

🇪🇺 pro Europa! | Dit was niet mijn kabinet!


Acties:
  • 0 Henk 'm!

  • Rhapsody
  • Registratie: Oktober 2002
  • Laatst online: 10:47

Rhapsody

In Metal We Trust

Topicstarter
Bedankt!

Ik heb het nu zo opgelost:
1. $_POST['textarea'] door stripslashes heenhalen
2. object vullen en serializen
3. in db zetten

4. uitlezen
5. unserializen


Magic_quotes e.d. heb ik eruitgehaald en zo werkt het perfect. Ik ga het nu nog even goed testen zodat ik het zeker weet.
Blijkbaar wordt de html, geproduceerd door TinyMCE al ge-addslashed (wel apart trouwens)

🇪🇺 pro Europa! | Dit was niet mijn kabinet!


Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

Rhapsody schreef op donderdag 27 juli 2006 @ 22:24:
Magic_quotes e.d. heb ik eruitgehaald en zo werkt het perfect. Ik ga het nu nog even goed testen zodat ik het zeker weet.
Blijkbaar wordt de html, geproduceerd door TinyMCE al ge-addslashed (wel apart trouwens)
Dat is de gewone magic_quotes functionaliteit van PHP (da's weer iets anders dan magic_quotes_runtime)

[ Voor 8% gewijzigd door crisp op 27-07-2006 22:41 ]

Intentionally left blank


Acties:
  • 0 Henk 'm!

  • Rhapsody
  • Registratie: Oktober 2002
  • Laatst online: 10:47

Rhapsody

In Metal We Trust

Topicstarter
ah ok. Ja die magic_quotes daar ben ik zelf niet zo bekend mee. Maar in ieder geval erg bedankt.

🇪🇺 pro Europa! | Dit was niet mijn kabinet!


Acties:
  • 0 Henk 'm!

  • T-MOB
  • Registratie: Maart 2001
  • Nu online
Zoiets werkt dan ook nog server-config-independant... :)
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
/** magic is for magicians **/
if (get_magic_quotes_gpc()) {
    $_POST   = strLib::stripslashesRecursive($_POST);
    $_GET    = strLib::stripslashesRecursive($_GET);
    $_COOKIE = strLib::stripslashesRecursive($_COOKIE);
}

//en uit strLib:
    /**
     * Performs a stripslash on each element of the input. Input can be either an
     * array or a string. The latter doesn't make much sense though
     */
    function stripslashesRecursive($input) {
        if (is_array($input)) {
            foreach($input as $key => $value) {
                $output[$key] = (is_array($value)) ? strLib::stripslashesRecursive($value) : stripslashes($value);
            }
        } else {
            $output = stripSlashes($input);
        }

        return $output;
    }

Regeren is vooruitschuiven


Acties:
  • 0 Henk 'm!

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 29-05 22:54
Die dubbele is_array controle in die functie is een beetje overbodig:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php

function stripslashesRecursive($input) {
    if (is_array($input)) {
        $output = array();
        foreach($input as $key => $value) {
            $output[$key] = strLib::stripslashesRecursive($value);
        }
        return $output;
    } else {
        return stripslashes($input);
    }
}

?>


Niet dat het veel uitmaakt, maar toch vind ik hem zo wat netter.

Noushka's Magnificent Dream | Unity

Pagina: 1