0

JSONを使用してjavascriptスクリプトコードをphpスクリプトに送信してパック(暗号化)しますDeadEdwrdのPHPJavascript Packerを使用してhttp://joliclic.free.fr/php/javascript-packer/en/index.php いますパッカーは正常に動作しますが、パックされた結果が正しくないという奇妙な問題に直面しています。

これが私がパックしたい元のスクリプトです:

<script type='text/javascript'>jwplayer('mediaspace').setup({ 'flashplayer': 'http://www.domain.com/player/player/player.swf', 'file': 'http://doamin.com','image': 'http://www.domain.com/images/background.jpg', 'skin': 'http://www.domain.com/player/skin/glow.zip', 'plugins': 'hd-2,timeslidertooltipplugin-1', 'hd.file': 'http://doamin.com', 'controlbar': 'over', 'stretching': 'exactfit', 'width': '700', 'height': '404' });</script>

phpスクリプトに送信する前に、このスクリプトでjavascriptエスケープを使用します

脱出した後は次のようになります。

%3Cscript%20type%3D%27text/javascript%27%3Ejwplayer%28%27mediaspace%27%29.setup%28%7B%20%27flashplayer%27%3A%20%27http%3A//www.domain.com/player/player.swf%27%2C%20%27file%27%3A%20%27http%3A//domain.com%27%2C%20%20%20%20%20%27image%27%3A%20%27http%3A//www.domain.com/images/background.jpg%27%2C%20%27skin%27%3A%20%27http%3A//www.domain.com/player/skin/glow.zip%27%2C%20%27plugins%27%3A%20%27hd-2%2Ctimeslidertooltipplugin-1%27%2C%20%27hd.file%27%3A%20%27http%3A//domain.com%27%2C%20%27controlbar%27%3A%20%27over%27%2C%20%27stretching%27%3A%20%27exactfit%27%2C%20%27width%27%3A%20%27700%27%2C%20%27height%27%3A%20%27404%27%20%7D%29%3B%3C/script%3E

次に、JSONを使用してこれをphpスクリプトに送信します。

値を取得してスクリプトをパックし、パックされたスクリプトをjavascriptに返すPHPスクリプト:

<?php
$src = $_GET['code'];
$callback = $_GET['callback'];

require 'class.JavaScriptPacker.php';

$packer = new JavaScriptPacker($src, 'Normal', true, false);
$packed = $packer->pack();

$output = array('error'=>'none', 'results'=> $packed , 'source' => $src);
$out_string =  json_encode($output);
echo $callback.'('.$out_string.');';
?>

P / SIは配列に「ソース」を追加したので、正確にphpGETが何であるかを確認できます。

問題は、理由はわかりませんが、以下に示すように、phpがsource /$srcにバックスラッシュを追加しています。

<script type=\'text/javascript\'>jwplayer(\'mediaspace\').setup({ \'flashplayer\': \'http://www.domain.com/player/player.swf\', \'file\': \'http://domain.com\', \'image\': \'http://www.domain.com/images/ackground.jpg\', \'skin\': \'http://www.domain.com/player/skin/glow.zip\', \'plugins\': \'hd-2,timeslidertooltipplugin-1\', \'hd.file\': \'http://domain.com\', \'controlbar\': \'over\', \'stretching\': \'exactfit\', \'width\': \'700\', \'height\': \'404\' });</script>

これはパックの結果を破壊します

私が欲しかった結果:

eval(function(p,a,c,k,e,d){while(c--){if(k[c]){p=p.replace(new RegExp('\\b'+c.toString(a)+'\\b','g'),k[c])}}return p}('<8 g=\'f/e\'>d(\'l\').k({\'j\':\'3://6.5.0/4/4/4.n\',\'7\':\'3://b.0\',\'m\':\'3://6.5.0/i/h.c\',\'9\':\'3://6.5.0/4/9/x.z\',\'o\':\'a-2,w-1\',\'a.7\':\'3://b.0\',\'y\':\'v\',\'u\':\'q\',\'p\':\'r\',\'s\':\'t\'});</8>',36,36,'com|||http|player|domain|www|file|script|skin|hd|doamin|jpg|jwplayer|javascript|text|type|background|images|flashplayer|setup|mediaspace|image|swf|plugins|width|exactfit|700|height|404|stretching|over|timeslidertooltipplugin|glow|controlbar|zip'.split('|')))

しかし、バックスラッシュ(スクリプトも破壊します)が原因で得られた結果

eval(function(p,a,c,k,e,d){while(c--){if(k[c]){p=p.replace(new RegExp('\\b'+c+'\\b','g'),k[c])}}return p}('<2 1=\\\'0/3\\\'>4(\\\'7\\\').6({\\\'5\\\':\\\'8:',9,9,'text|type|script|javascript|jwplayer|flashplayer|setup|mediaspace|http'.split('|')))

私は何が間違っているのですか?

4

3 に答える 3

1

phpスクリプトの開始時にこれを追加します。

if(get_magic_quotes_gpc())
{
    function undo_magic_quotes_array($array)
    {
        return is_array($array) ? array_map('undo_magic_quotes_array', $array) : stripslashes($array));
    }
    $_GET = undo_magic_quotes_array($_GET);
    $_POST = undo_magic_quotes_array($_POST);
    $_COOKIE = undo_magic_quotes_array($_COOKIE);
    $_FILES = undo_magic_quotes_array($_FILES);
    $_REQUEST = undo_magic_quotes_array($_REQUEST);
}
于 2012-05-31T07:40:46.820 に答える
1

POST、GET、およびCOOKIE変数にバックスラッシュを自動的に追加するmagic_quotesがオンになっている可能性があります。

php.iniで無効にするか(PHP 5.3で非推奨になり、とにかく5.4で削除されます)、または単にストリップスラッシュを使用します。

$src = $_GET['code'];
if (get_magic_quotes_gpc())  
  $src = stripslashes($src);

または、すべての$_GET変数を一度にエスケープできます。

$_GET = array_map('stripslashes', $_GET);
于 2012-05-31T07:44:38.007 に答える
0

これはjson_encodeが原因です。スクリプト全体を文字列のように扱っています。当然、文字列としては、さまざまな文字をエスケープするために\が必要になります。

ここで作成されるJSONは、次のようになります。

{
    'error':'none', 
    'results':'eval(...)',
    'source':'...whatever your $src is...'
}

eval(...)$srcが引用符で囲まれていることに注意してください。それらは文字列であり、さまざまな文字をエスケープする必要があります。

于 2012-05-31T07:40:53.620 に答える