0

文字列(jsコード)をphpで「暗号化」してから、javascriptを使用してデコードしようとしています。

これはphp関数です:

function xor_string( $text, $xorKey ) {
    $xored = '';
    $chars = str_split( $text );

    $i = 0;

    while ( $i < count( $chars ) ) {
        $xored .= chr( ord( $chars[$i] ) ^ $xorKey );
        $i++;
    }

    return $xored;
}

これはjs関数です:

function xor_string( str, key ) {
    var xored = "";
    for (i=0; i<str.length;i++) {
        var a = str.charCodeAt(i);
        var b = a ^ key;
        xored = xored+String.fromCharCode(b);
    }
    console.log(xored);
}

これは、特定のキーでは双方向に機能しますが、他のキーでは失敗します。たとえば、次のようになります。

echo urlencode( xor_string( 'document.location.href.search', 67 ) );

戻り値:

%27%2C+6.%26-7m%2F%2C+%227%2A%2C-m%2B1%26%25m0%26%221+%2B

そして、私がjavascriptでそれを「デコード」しようとすると、次のようになります。

var str = decodeURIComponent("%27%2C+6.%26-7m%2F%2C+%227%2A%2C-m%2B1%26%25m0%26%221+%2B");
xor_string( str, 67 );

それは戻ります:

dohument.lohation.href.searhh

なぜこれが起こっているのか誰もが知っていますか?

120などの一部の「キー」では正常に機能しますが、他の多くのキーでは失敗します。

4

2 に答える 2

4

古典的な:-)

PHPurlencodeはJavaScriptとまったく同じではありませんencodeURIComonent。空白の処理が異なります。1つはを使用し+、もう1つはを使用し%20ます。

これを処理する必要があります。たとえば、phpjsはPHP準拠のdecodeURI関数を提供します。

> var phpstring = "%27%2C+6.%26-7m%2F%2C+%227%2A%2C-m%2B1%26%25m0%26%221+%2B";
> xor_string(decodeURIComponent(phpstring.replace(/\+/g, "%20")), 67 );
"document.location.href.search"

お気づきかもしれませんが、このエラーは、xor関数(およびそのパラメーター)でスペースにエンコードされた文字にのみ当てはまります。

于 2012-09-27T02:28:37.840 に答える
1

より良い解決策は、rawurlencode()の代わりに使用することですurleconde()

rawurlencode()スペースを「%20」urlencode()に変換しますが、スペースを「+」に変換します。'%20'はdecodeURIComponent()、スペースに期待されるものです。

次の完全な例を参照してください。

<?php
    function xor_string( $text, $xorKey ) {
    $xored = '';
    $chars = str_split( $text );
    $i = 0;
    while ( $i < count( $chars ) ) {
        $xored .= chr( ord( $chars[$i] ) ^ $xorKey );
        $i++;
    }
    return $xored;
    }
?><html>
<body>
Encoded (php):
<div id="phpUrlEncode">
<?=urlencode( xor_string( 'document.location.href.search', 67 ) )?>
</div>
<div id="phpRawUrlEncode">
<?=rawurlencode( xor_string( 'document.location.href.search', 67 ) )?>
</div>
<br />
Decoded (js):
<div id="jsDecodeUrl"></div>
<div id="jsDecodeRawUrl"></div>
<script type="text/javascript">
function decodeStr(rawId,displayId) {
    var raw = document.getElementById(rawId).innerHTML;
    document.getElementById(displayId).innerHTML = xor_string(decodeURIComponent(raw),67);
}

function xor_string( str, key ) {
    var xored = "";
    for (i=0; i<str.length;i++) {
        var a = str.charCodeAt(i);
        var b = a ^ key;
        xored = xored+String.fromCharCode(b);
    }
    //console.log(xored);
    return xored;
}

decodeStr('phpUrlEncode','jsDecodeUrl');
decodeStr('phpRawUrlEncode','jsDecodeRawUrl');
</script>
</body>
</html>
于 2012-10-08T23:41:46.493 に答える