views:

48

answers:

1

I have this function that embeds flash :

function embedswfile(target, swf, base, width, height) {//dosomething}

And I want to call the function like this

embedSwf("flashgame",decode("<?=base64_encode($path['location'])?>"),decode("<?=base64_encode($path['base_directory'])?>"),"800","600" )

The idea is that whenever someone looks for any swf inside my website,he wont find anything clean.I will change the encoding algorithm,but this is just temporary. In order for that function to work,whenever I call the function 'decode' it must return a single value. PHP contains

<?php
echo base64_decode($_POST['s']);
?>

I tried this but it still wont work

var globvar;
function processdata(newmsg) {
    globvar = newmsg;   
}

function decode(s){
    $.ajax({type: "POST",
        url: "includes/decode.inc.php",
        data: "s=" + s,
        success:function(newmsg){
           processdata(newmsg);
        }
    });
return globvar;
}
+2  A: 

Important:

Forget about using Ajax and encoding, decoding the path. What do you think you gain from it? Security? No. One can figure out that this is bas64 encoded or he just monitors the network traffic and reads the response from the Ajax call.

Just do

embedSwf("flashgame","<? =$path['location']?>"),"<?=$path['base_directory']?>","800","600" )

Really, you cannot prevent someone else seeing the data and are just making things more complicated for you.

(Or you have to decrypt the data with JavaScript.)


(original answer is still correct nevertheless)

Ajax is asynchronous so something like var test = decode(s); will never work. The decode function will return before the Ajax call finishes.

Instead, put your logic into the callback handler. For example, if your code was this before:

var retdata = decode('s');
// here comes code that handles retdata

put the code into a function and call it from the success handler:

function process(retdata) {
    // here comes code that handles retdata
}

function decode(s){
    $.ajax({type: "POST",
        url: "includes/decode.inc.php",
        data: "s=" + s,
        success:function(newmsg){
           process(newmsg);
        }
    });
}

This seems to be a very common problem to all beginners. You will find a lot of questions here that deal with the same problem.

Update:

It is not nice, but you could change the function to

function decode(s, cb){
    $.ajax({type: "POST",
        url: "includes/decode.inc.php",
        data: "s=" + s,
        success:function(data){
           cb(data);
        }
    });
}

and do

decode("<?=base64_encode($path['location'])?>", function(location) {

    decode("<?=base64_encode($path['base_directory'])?>", function(dir) {

        embedSwf("flashgame",location,dir,"800","600" );

    });

});

Update 2:

For completeness, you can make the Ajax call synchronous, by using async: false. Then this will work:

function decode(s){
    var ret;
    $.ajax({type: "POST",
        url: "includes/decode.inc.php",
        data: "s=" + s,
        async: false,
        success:function(newmsg){
           ret = newmsg;
        }
    });
    return sync;
}

var val = decode(s);

However, this will block the browser until the Ajax call finished. You have to test whether this matters in your case or not.

Update 3:

You could also change your PHP script to not only accept one parameter but several and process both strings in one go.

Felix Kling
I was trying to solve this :function embedSwf("flashgame",decode("<?=base64_encode($path['location'])?>"),decode("<?=base64_encode($path['base_directory'])?>"),"800","600" ) {//do something}So that no swf will be actually visible inside my document.And I was echoing the swf as encoded and I was trying to pass the data to javascript after it was decoded with function decode
nevergone
@nevergone: Please see my updates. You can make the call synchronous, but it will freeze the browser. Test if it matters.
Felix Kling
I will create my own encryption algorithm.This is just temporary.I tried what you said in update #1, but it's not working.What is the cb(data) ?Where is the value of location and dir changed to uncoded ?
nevergone
@nevergone: Even with your own encryption algorithm, the data that is sent from the server as response will be unencrypted and can be read by everyone. Or you have to implemented a decryption algorithm in JavaScript and then you don't need Ajax.
Felix Kling
@nevergone: I had an error here, it must be: `success:function(data){cb(data);}`. The value is "changed" in the `decode` function.
Felix Kling
so the cb(data) is something like a return ?
nevergone
@nevergone: No, it is a function call. `cb` is just the name of the parameter (see `function decode(s, cb){`). You could call it `averylongparametername`. Functions are first class objects in JavaScript, so you can pass them around. And as you can see in the code, in the first call, I pass the anonymous function `function(location) { ... });` as `cb`.
Felix Kling
yes, I noticed how you pass that nicely , but for some reason it's still not working . If I remove the coding and decoding,the flash appears well,but if I add these changes you told me about in update #1 it doesnt work.It seems that it doesnt return the data correctly
nevergone
@nevergone: There was a right parenthesis to much, check for syntax errors. It should work.
Felix Kling
thx a lot, I got it working finally
nevergone