(flashcodeurs) [FLASH8] variables en POST & LoadVars

36 views
Skip to first unread message

ekameleon

unread,
Feb 14, 2006, 12:36:34 PM2/14/06
to FC...@googlegroups.com
Hello :)

petit bug ? problème de sécurité ?
Si quelqu'un peut tester ces 2 petits bout de code pour moi ce serait
sympa ^_^


Dans Flash tout simplement :

// définir votre répertoire de test
var url:String = "http://localhost/test.php" ;

var loader:LoadVars = new LoadVars() ;
loader.contenu = "Hello World" ;

loader.send(url, "_blank", "POST") ;


Dans un petit fichier test.php :

<?php

echo "contenu : " . $_POST["contenu"] ;

?>

Normalement cela marche pas.. si vous passez votre parsing en "GET" là
tout fonctionne ??

J'ai réussi juste à accéder aux variables en "POST" en utilisant la
méthode extract() PHP cmais sur le tableau $_GET ??? Flash8 ne peux plus
parser en local des variables en POST ?? J'y comprends plus rien :D

<?php

if(!empty($_GET)) extract($_GET); // si je supprime cette ligne cela
ne marche plus ??

echo "size -> " . sizeOf($_POST) ;
echo "<br>" ;
echo "contenu via le tableau global POST : " . $_POST['contenu'] ;
echo "<br>" ;
echo "contenu directement via le extract : " . $contenu ; // marche
uniquement avec le extract

?>


Voilà :) Si quelqu'un à une idée à ce sujet ? bien entendu le PHP
fonctionne avec un formulaire HTML classique etc...
Reste à tester en ligne le swf maintenant ? J'ai pas encore essayé ? :)

EKA+ :)

________________________________________
http://www.buRRRn.com/projects/FCNG.html


zwetan

unread,
Feb 14, 2006, 2:44:31 PM2/14/06
to FC...@googlegroups.com
salut :)

>
> petit bug ? problème de sécurité ?
> Si quelqu'un peut tester ces 2 petits bout de code pour moi ce serait
> sympa ^_^
>

[snip]


>
> echo "contenu : " . $_POST["contenu"] ;
>
> ?>
>
> Normalement cela marche pas.. si vous passez votre parsing en "GET" là
> tout fonctionne ??
>

essaye plutot de recuperer ton POST avec

$GLOBALS[ "HTTP_RAW_POST_DATA" ];


> J'ai réussi juste à accéder aux variables en "POST" en utilisant la
> méthode extract() PHP cmais sur le tableau $_GET ??? Flash8 ne peux plus
> parser en local des variables en POST ?? J'y comprends plus rien :D
>
> <?php
>
> if(!empty($_GET)) extract($_GET); // si je supprime cette ligne cela
> ne marche plus ??
>
> echo "size -> " . sizeOf($_POST) ;
> echo "<br>" ;
> echo "contenu via le tableau global POST : " . $_POST['contenu'] ;
> echo "<br>" ;
> echo "contenu directement via le extract : " . $contenu ; // marche
> uniquement avec le extract
>
> ?>
>
>
> Voilà :) Si quelqu'un à une idée à ce sujet ? bien entendu le PHP
> fonctionne avec un formulaire HTML classique etc...
> Reste à tester en ligne le swf maintenant ? J'ai pas encore essayé ? :)
>

humm ca peut peut-etre etre aussi un probleme de header
selon le type de données rajoute un
header( "Content-type: $mime; charset=$charset" );
avec $mime = "text/plain" et charset="UTF-8"
(utf-8 car on veut discuter avec flash)

voir http://www.w3.org/Protocols/rfc1341/4_Content-Type.html
la liste officielle se trouvant ici
http://www.iana.org/assignments/media-types/
et aussi http://www.iana.org/assignments/media-types-parameters
(non je ne suis pas un dico mais avec eden j'ai accumulé un peu de doc :P)

et des explications tres utile sur le param charset
http://www.w3.org/International/O-HTTP-charset


en + du fla en general je test aussi en ligne de commande ;)

TestServerConnection.js
-------------------------------------
trace = function( /*String*/ txt )
{
WScript.Echo( String( txt ) );
}

HTTP = new ActiveXObject( "WinHttp.WinHttpRequest.5.1" );

HTTP.Open( "POST", "http://test.burrrn.com/getaway.php", false );

HTTP.Send( "toto = 123; titi = \"euro sign is ?\";" );
trace( HTTP.ResponseText );
trace( "Status: " + HTTP.Status + " - " + HTTP.StatusText );
trace( HTTP.GetAllResponseHeaders() );
trace( "" );
-------------------------------------

ce qui renvoie dans un prompt dos
-------------------------------------
C:\shell>cscript TestServerConnection.js
Microsoft (R) Windows Script Host Version 5.6
Copyright (C) Microsoft Corporation 1996-2001. All rights reserved.

{toto:123,titi:"euro sign is \u20ac",sender:"DataProcess"}
Status: 200 - OK
Date: Tue, 14 Feb 2006 19:10:56 GMT
Server: Microsoft-IIS/6.0
Content-Type: text/html
X-Powered-By: PHP/4.3.11
X-Powered-By: buRRRn
Transfer-Encoding: chunked
-------------------------------------

pratique pour comparer ce qui passe / passe pas avec flash

note les données POST se mettent là
HTTP.Send( ... )

l'avantage du RAW POST c'est qu'on n'est pas obligé
de passer les données en faisant un escape/unescape

dans mon cas un packet eden ;)

zwetan


________________________________________
http://www.buRRRn.com/projects/FCNG.html


La Souche

unread,
Feb 14, 2006, 2:54:05 PM2/14/06
to FC...@googlegroups.com

Salut :)

>
> petit bug ? problème de sécurité ?
> Si quelqu'un peut tester ces 2 petits bout de code pour moi ce serait
> sympa ^_^
>
>

> Dans Flash tout simplement :
>
> // définir votre répertoire de test
> var url:String = "http://localhost/test.php" ;
>
> var loader:LoadVars = new LoadVars() ;
> loader.contenu = "Hello World" ;
>
> loader.send(url, "_blank", "POST") ;
>
>
> Dans un petit fichier test.php :
>
> <?php
>

> echo "contenu : " . $_POST["contenu"] ;
>
> ?>
>
> Normalement cela marche pas.. si vous passez votre parsing en "GET" là
> tout fonctionne ??

>

> J'ai réussi juste à accéder aux variables en "POST" en utilisant la
> méthode extract() PHP cmais sur le tableau $_GET ??? Flash8 ne peux plus
> parser en local des variables en POST ?? J'y comprends plus rien :D
>

effectivement le POST ne fonctionne pas, les valeurs sont toujours
envoyées en GET que l'on parse en GET ou POST depuis le fla

car dans le test.php $_GET["contenu"] fonctionne tout le temps

J'ai essayé le system.security = "http://localhost" ;
mais cela ne fait rien :(

> <?php
>
> if(!empty($_GET)) extract($_GET); // si je supprime cette
> ligne cela ne marche plus ??

moi, si je supprime la ligne cela fonctionne quant même


>
> echo "size -> " . sizeOf($_POST) ;
> echo "<br>" ;
> echo "contenu via le tableau global POST : " .
> $_POST['contenu'] ;
> echo "<br>" ;
> echo "contenu directement via le extract : " . $contenu ; //
> marche uniquement avec le extract
>
> ?>
>
>
> Voilà :) Si quelqu'un à une idée à ce sujet ? bien entendu le PHP
> fonctionne avec un formulaire HTML classique etc...
> Reste à tester en ligne le swf maintenant ? J'ai pas encore essayé ? :)

je n'ai pas testé en ligne non plus :)

Lasouche


________________________________________
http://www.buRRRn.com/projects/FCNG.html


ekameleon

unread,
Feb 14, 2006, 5:41:42 PM2/14/06
to FC...@googlegroups.com
Hello :)

> essaye plutot de recuperer ton POST avec
>
> $GLOBALS[ "HTTP_RAW_POST_DATA" ];

Encore un truc que je connais pas ^_^ J'ai découvert extract() ce matin
:) Je vais aller voir ce que cela donne (là je viens de tester avec le
HTTP_RAW_POST_DATA en copiant collant directement dans mon PHP mais cela
fonctionne pas (mais peut être que je l'utilise mal ?)


> humm ca peut peut-etre etre aussi un probleme de header
> selon le type de données rajoute un
> header( "Content-type: $mime; charset=$charset" );
> avec $mime = "text/plain" et charset="UTF-8"
> (utf-8 car on veut discuter avec flash)
>

Oui dans tous les cas c'est tout de même mieux de tout mettre en utf8 vu
que je récupère de l'utf8 !

> voir http://www.w3.org/Protocols/rfc1341/4_Content-Type.html
> la liste officielle se trouvant ici
> http://www.iana.org/assignments/media-types/
> et aussi http://www.iana.org/assignments/media-types-parameters
> (non je ne suis pas un dico mais avec eden j'ai accumulé un peu de doc :P)
>
> et des explications tres utile sur le param charset
> http://www.w3.org/International/O-HTTP-charset
>
>

je vais lire tout cela demain merci :)


Vivement que je vois cela de + prés :D
Merci pour ces précisions ;)

ekameleon

unread,
Feb 15, 2006, 6:44:16 AM2/15/06
to FC...@googlegroups.com
Hello :)

> J'ai essayé le system.security = "http://localhost" ;
> mais cela ne fait rien :(

Normalement c'est System.security.allowDomain :) Mais en effet ici vu
qu'on est en local pas de raison d'utiliser cette méthode :)

> moi, si je supprime la ligne cela fonctionne quant même

En fait le extract permet de déplacer le contenu d'un tableau indexé
dans le "_global" ... le truc qu'on voit bien dans tous les cas c'est
qu'avec le flashplayer 8 il semblerait que les données en POST soient
dans tous les cas envoyées en GET ??

<?php

header( "Content-type:text/plain ; charset=UTF-8" );

echo "size _POST -> " . sizeOf($_POST) ;
echo "\r" ;
echo "size _GET -> " . sizeOf($_GET) ;
echo "\r" ;

echo "contenu POST -> " . $_POST['contenu'] ;
echo "\r" ;
echo "contenu GET -> " . $_GET['contenu'] ;

?>

On voit bien que seul le tableau des $_GET est rempli ? Va savoir
maintenant d'où vient le problème ?

m-e-

unread,
Feb 15, 2006, 8:20:31 AM2/15/06
to FC...@googlegroups.com
"ekameleon" <ekam...@gmail.com> a écrit dans le message de
news: ivuWz0YMGHA.2408@BURN...

Je ne sais pas s'il s'agit là du même problème mais, on peut
lire ici (livedoc pour FMX2004 LoadVars.send()) :

http://livedocs.macromedia.com/flash/mx2004/main_7_2/wwhelp/wwhimpl/common/html/wwhelp.htm?context=Flash_MX_2004&file=00001418.html

Francis Cheng :
"I think I see the problem. This appears to be a limitation of
the test movie player, as it seems to send everything using the
GET method. The POST method only works if you are attempting to
use it from within a browser. Try publishing the SWF with the
HTML option, then double-click on the resulting HTML page. I was
able to get POST to work with both Internet Explorer and FireFox
on Windows. I'll be sure to clarify this in the documentation.
Sorry for the inconvenience. "

Francis Cheng :
"I'm sorry this wasn't mentioned in the docs. I've updated the
source file to include information about the test movie player's
inability to use the POST method. "

________________________________________
http://www.buRRRn.com/projects/FCNG.html


zwetan

unread,
Feb 15, 2006, 9:55:53 AM2/15/06
to FC...@googlegroups.com
>
> Je ne sais pas s'il s'agit là du même problème mais, on peut
> lire ici (livedoc pour FMX2004 LoadVars.send()) :
>
[snip]

>
> Francis Cheng :
> "I'm sorry this wasn't mentioned in the docs. I've updated the
> source file to include information about the test movie player's
> inability to use the POST method. "
>

je pense que tu a mis le doigt sur le probleme :)

bien vu

zwetan

________________________________________
http://www.buRRRn.com/projects/FCNG.html


Shaoken

unread,
Feb 15, 2006, 2:44:49 PM2/15/06
to FC...@googlegroups.com
ekameleon a écrit :

> Encore un truc que je connais pas ^_^ J'ai découvert extract() ce matin
> :) Je vais aller voir ce que cela donne (là je viens de tester avec le
> HTTP_RAW_POST_DATA en copiant collant directement dans mon PHP mais cela
> fonctionne pas (mais peut être que je l'utilise mal ?)

Salut,

Tu dois avoir ta variable "always_populate_raw_post_data" mise à ON dans
ton PHP.ini pour pouvoir l'utiliser.

Attention, j'ai lu que d'avoir cette configuration active ralentissait
les perfs générales de tes scripts. Il est préférable d'utiliser cette
méthode qui en plus ne nécessite pas de modification du php.ini (utile
qd on ne possède pas son server dédié):

$param = file_get_contents('php://input');

++ :)

________________________________________
http://www.buRRRn.com/projects/FCNG.html


m-e-

unread,
Feb 16, 2006, 5:20:55 AM2/16/06
to FC...@googlegroups.com
"Shaoken" <nos...@shaoken.be> a écrit dans le message de news:
pOU1HhmMGHA.3012@BURN...

> Tu dois avoir ta variable "always_populate_raw_post_data" mise
> à ON dans
> ton PHP.ini pour pouvoir l'utiliser.
>
> Attention, j'ai lu que d'avoir cette configuration active
> ralentissait
> les perfs générales de tes scripts. Il est préférable
> d'utiliser cette
> méthode qui en plus ne nécessite pas de modification du
> php.ini (utile
> qd on ne possède pas son server dédié):
>
> $param = file_get_contents('php://input');

Le lien vers la doc pour les flux d'entrée-sortie :
http://fr2.php.net/manual/fr/wrappers.php.php

<<
php://input permet de lire des données POST bruts. C'est moins
gourmand en mémoire que $HTTP_RAW_POST_DATA et il n'y a pas de
directive spéciale dans php.ini. php://input n'est pas
disponible avec enctype="multipart/form-data".
>>

Pour la directive "always_populate_raw_post_data" :
http://fr3.php.net/manual/fr/ini.core.php

<<
Remplit toujours la variable $HTTP_RAW_POST_DATA. Sinon, la
variable est remplit uniquement des types MIME non reconnu des
données. Cependant, la méthode préférée pour accès à ce type de
données est php://input. $HTTP_RAW_POST_DATA n'est pas
disponible avec enctype="multipart/form-data".
>>

Et on peut voir que cette directive peut être configuré par
fichier ".htaccess" (PHP_INI_PERDIR) - ce qui ne nécessite pas
un hébergement dédié.

________________________________________
http://www.buRRRn.com/projects/FCNG.html


zwetan

unread,
Feb 18, 2006, 12:32:21 PM2/18/06
to FC...@googlegroups.com
voici un petit résumé de mes propres experiences

1) ne pas utiliser LoadVars ni XML, utiliser seulement sendAndLoad

LV = new LoadVars()
LV.nomdevar = valeur;

LoadVards transmettra les vars sous la forme
nomdevar=valeur&nomdevar2=valeur2
de plus sur chaque value LoadVars fera un escape()

X = new XML( "mes donnees" );
XML ne creera pas de nomdevar=valeur
ce qui est mieux
mais transformera les données selon les regles XML
donc si vous passez un " il sera transfromé en &quot;

mais nous on veut garder nos donnees RAW
pas de transformations et juste les passer au POST tel quel

et c'est ca que le HTTP_RAW_POST_DATA recupere
et qui est le plus pratique amha

2) truc tres chiant avec flash c'est que pour envoyer
des données et en recevoir il faut utiliser la methode sendAndLoad

soit de l'objet XML soit de l'objet LoadVars

mais en fait non :)

il y a 3 trucs a savoir:
a) quand on appelle sendAndLoad on doit obligatoirement
avoir une propriete "contentType" defini sinon rien n'est envoyé
b) il faut definir une methode toString pour que sendAndLoad sache quoi
envoyer
c) le retour des données appelle la methode onData

ex:

toto = {};
toto._value = "mes données";
toto.sendAndLoad = XML.prototype.sendAndLoad;
toto.contentType = "text/plain";
toto.toString = function()
{
return this._value;
}

toto.onData = function( data )
{
trace( data );
}

toto.sendAndLoad( "blah.php", null, "POST" );

ou

obj = {};
obj.onData = function( src )
{
trace( "[" + data + "]" );
}

toto.sendAndLoad( "blah.php", obj, "POST" );

ce petit trick permet de passer des vraies donnees RAW encodées en UTF-8
depuis flash
RAW, cad qu'on a pas besoin d'utiliser escape() ou une base64 pour
transformer les données
ce qui peut etre TRES pratique quand on debug et qu'on veut voir ses donnees
en clair

3) pour la recup des donnes POST en PHP
3 options:

1) le definir dans le PHP.ini
-----------------
always_populate_raw_post_data = On
-----------------
2) le definir dans un .htaccess
-----------------
php_value always_populate_raw_post_data 1
-----------------
3) le definir dans PHP
ini_set( "always_populate_raw_post_data", "1" );

note: sous Windows meme si on ne le definit pas
cela marchque quand meme
(bon cela doit venir de ma config tres speciale apache qui renvoie en proxy
sur un IIS
mais bon... un IIS sous Windows devrait se comporter de la meme maniere je
pense)


4) niveau perf et autres petites config PHP

error_reporting( 0 );
pour ne pas "polluer" l'echange est utile

set_time_limit( 300 );
devrait couvrir des volumes d'echanges de donnees "normaux"
perso je reste largement en dessous de 1 seconde pour des gros paquets :)
(variable selon votre systeme de serialization/deserialization et de la
rapidite du serveur)

aussi pour etre sur que le script PHP aille jusqu a la fin
ignore_user_abort( true );


voila 2 petits scripts d'exemple

AS2
------------------------------
class HTTPConnection
{

var _HTTPverb:String;
var _value:String;

var gatewayURI:String;
var contentType:String;

var sendAndLoad:Function = LoadVars.prototype.sendAndLoad;

function HTTPConnection( URI:String )
{
_HTTPverb = "POST";
_value = "";

gatewayURI = URI;
contentType = "application/ecmascript";
}

function toString():String
{
return _value;
}

function onData( data:String )
{
trace( "receive [" + data + "]" );
}

function open( URI:String )
{
if( URI != null )
{
gatewayURI = URI;
}
}

function send( data:String )
{
trace( "send (" + data + ")" );
_value = data;
sendAndLoad( gatewayURI, this, _HTTPverb );
}

}
------------------------------
var connection:HTTPConnection = new HTTPConnection(
"http://www.test.com/getaway.php" );

connection.send( " hello world é à ? < > \" \' | & = + " )
------------------------------

PHP
------------------------------
<?php
error_reporting( 0 );
ini_set( "always_populate_raw_post_data", "1" );
set_time_limit( 300 );
ignore_user_abort( true );
$mimetype = "application/ecmascript";
$charset = "UTF-8";

header( "Content-Type: $mimetype; charset=$charset" );

if( $_SERVER["REQUEST_METHOD"] == "GET" )
{
print( "GET request" );
exit();
}

$received = $GLOBALS["HTTP_RAW_POST_DATA"];

if( isset($received) && !empty($received) )
{
print( "[".$received."]" );
}
else
{
print( "no data received" );
}
exit();
?>
------------------------------

en output vous devriez obtenir (si tout se passe bien)

send( hello world é à ? < > " ' | & = + )
receive [ [ hello world é à ? < > " ' | & = + ] ]

(bon je viens de me rendre compte que j ai encore inversé et mis getaway au
lieu de gateway...)

mais bon ca marche et en tout UTF-8 (voir le main
________________________________________
http://www.buRRRn.com/projects/FCNG.html


ekameleon

unread,
Feb 19, 2006, 3:38:55 AM2/19/06
to FC...@googlegroups.com
Hello :)


> voici un petit résumé de mes propres experiences
>
> 1) ne pas utiliser LoadVars ni XML, utiliser seulement sendAndLoad
>

Alors là ... c'est clair que j'y avais pas pensé du tout :)

>
> mais nous on veut garder nos donnees RAW
> pas de transformations et juste les passer au POST tel quel
>
> et c'est ca que le HTTP_RAW_POST_DATA recupere
> et qui est le plus pratique amha
>
> 2) truc tres chiant avec flash c'est que pour envoyer
> des données et en recevoir il faut utiliser la methode sendAndLoad
>
> soit de l'objet XML soit de l'objet LoadVars
>
> mais en fait non :)
>

J'avais pas imaginé qu'on pouvait se faire notre propre gestionnaire de
transfert de donnée.

> il y a 3 trucs a savoir:
> a) quand on appelle sendAndLoad on doit obligatoirement
> avoir une propriete "contentType" defini sinon rien n'est envoyé
> b) il faut definir une methode toString pour que sendAndLoad sache quoi
> envoyer
> c) le retour des données appelle la methode onData
>
> ex:
>
> toto = {};
> toto._value = "mes données";
> toto.sendAndLoad = XML.prototype.sendAndLoad;
> toto.contentType = "text/plain";
> toto.toString = function()
> {
> return this._value;
> }
>
> toto.onData = function( data )
> {
> trace( data );
> }
>
> toto.sendAndLoad( "blah.php", null, "POST" );
>
> ou
>
> obj = {};
> obj.onData = function( src )
> {
> trace( "[" + data + "]" );
> }
>
> toto.sendAndLoad( "blah.php", obj, "POST" );
>

Je vais tester cela tout de suite ^_^

> ce petit trick permet de passer des vraies donnees RAW encodées en UTF-8
> depuis flash
> RAW, cad qu'on a pas besoin d'utiliser escape() ou une base64 pour
> transformer les données
> ce qui peut etre TRES pratique quand on debug et qu'on veut voir ses donnees
> en clair
>
> 3) pour la recup des donnes POST en PHP
> 3 options:
>
> 1) le definir dans le PHP.ini
> -----------------
> always_populate_raw_post_data = On
> -----------------
> 2) le definir dans un .htaccess
> -----------------
> php_value always_populate_raw_post_data 1
> -----------------
> 3) le definir dans PHP
> ini_set( "always_populate_raw_post_data", "1" );
>

Bon à savoir :)

.....


>
> en output vous devriez obtenir (si tout se passe bien)
>
> send( hello world é à ? < > " ' | & = + )
> receive [ [ hello world é à ? < > " ' | & = + ] ]
>
> (bon je viens de me rendre compte que j ai encore inversé et mis getaway au
> lieu de gateway...)
>

> mais bon ca marche et en tout UTF-8 (voir le main.as en attahcment) :)


>
Merci pour ces précisions :)

EKA+ :)

________________________________________
http://www.buRRRn.com/projects/FCNG.html


Reply all
Reply to author
Forward
0 new messages