首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用php加密,使用js解密

使用php加密,使用js解密
EN

Stack Overflow用户
提问于 2019-09-19 17:18:55
回答 2查看 731关注 0票数 0

我已经从php加密字符串,并希望在客户端呈现它,但我不知道如何使用javascript混合它

代码语言:javascript
复制
$enc = encrypt_url('a');
echo "My enc result = ".$enc."<br>";
echo "My dec result = ".decrypt_url($enc);

我使用ajax传递了它,因此,客户端将其检索为"ZEJxSkpkYjhhNWUvenZkdFlUSGxvUT09“

我正在尝试解密,但无法解密

代码语言:javascript
复制
<script>
.....
success: function(result) {
    var x = `<?php decrypt_url('\\`+ result+`\\') ?>`;
    console.log(x)
} 
</script>

但结果为空

EN

回答 2

Stack Overflow用户

发布于 2019-09-19 17:26:43

您应该使用Ajax来实现这一点:

encrypt.php

代码语言:javascript
复制
$encrypt = encrypt_url('a');

decrypt.php

代码语言:javascript
复制
die(json_encode(decrypt_url($_POST['encrypted_string'])));

脚本

代码语言:javascript
复制
 $.ajax({
        url: "decrypt.php",
        type: "post",
        data: {'encrypted_string': <?=$encrypt?>},
        success: function (response) {
           alert(response);
        },
        error: function(jqXHR, textStatus, errorThrown) {
           console.log(textStatus, errorThrown);
        }
    });
票数 0
EN

Stack Overflow用户

发布于 2019-09-19 17:41:26

代码语言:javascript
复制
<script>
.....
success: function(result) {
    var x = `<?php decrypt_url('\\`+ result+`\\') ?>`;
    console.log(x)
} 
</script>

当PHP返回这个页面时,它将对字符串'\\``+ result+``\\'执行decrypt_url函数,因为不能像那样从JavaScript向PHP传递参数。因此,您的x将变为nothing (即null)或随机(取决于decrypt_url函数)。使用AJAX将参数从JavaScript传递到PHP。

一个简单的测试用例来展示发生了什么:

test.php:

代码语言:javascript
复制
<html>
        <head></head>
        <body>
                <script>
                        function(result)
                        {
                                var x = '<?php echo decrypt_url('+result+',true) ?>';
                                console.log(x)
                        }
                </script>
        </body>
</html>

它将由浏览器呈现为:

代码语言:javascript
复制
<html>
    <head></head>
    <body>
        <script>
            function(result)
            {
                    var x = '

正如您所看到的,从<?php标记开始的输出是损坏的。

你们中的一些人可能想知道为什么,所以我想我应该扩展一下我的答案。首先,这是一个逻辑错误,因为OP假设PHP可以从客户端控制。我可以看到这一点,因为引用的代码段是嵌入了PHP的HTML,其中PHP块本身位于一段JavaScript中。现在,让我们来看看在使用OP代码的简化版本执行过程中发生了什么:

代码语言:javascript
复制
<html>
  <head>
    <title>Test</title>
  </head>
  <body>
    <script>
      function test(result)
      {
        var x = `<?php strtoupper('\\`+ result+`\\') ?>`;
        console.log(x)
      }
    </script>
  </body>
</html>

让我们将代码另存为test.php,看看在执行文件时PHP是如何处理它的:首先,它基本上将所有内容转换为单个PHP脚本(这是对实际过程的简化,以显示基本原理)。完成这一步后,您的代码将如下所示:

代码语言:javascript
复制
echo "<html>\n<head>\n<title>Test</title>\n</head>\n<body>\n<script>\nfunction test(result)\n{\nvar x = `";
strtoupper('\\`+ result+`\\')
echo "`;\nconsole.log(x)\n}\n</script>\n</body>\n</html>";

仔细观察的人可能已经发现了第一个问题:在strtolower(...)调用后没有分号。因此,让我们假设它就在那里,看看这行在被PHP解释时将返回什么:

代码语言:javascript
复制
'\\`+ result+`\\'

我非常确定这不是OP的decrypt_url函数所需要的输入。但让我们看看代码现在是什么样子(添加了缺少的分号):

代码语言:javascript
复制
echo "<html>\n<head>\n<title>Test</title>\n</head>\n<body>\n<script>\nfunction test(result)\n{\nvar x = `";
'\\`+ result+`\\';
echo "`;\nconsole.log(x)\n}\n</script>\n</body>\n</html>";

现在我们缺少了另一个echo,如果没有,第二行将导致错误。因此,让我们来解决这个问题:

代码语言:javascript
复制
echo "<html>\n<head>\n<title>Test</title>\n</head>\n<body>\n<script>\nfunction test(result)\n{\nvar x = `";
echo '\\`+ result+`\\';
echo "`;\nconsole.log(x)\n}\n</script>\n</body>\n</html>";

因此,在修复了缺少的分号和缺少的echo之后,我们得到了有效的PHP代码-让我们看看输出是什么样子:

代码语言:javascript
复制
<html>
<head>
<title>Test</title>
</head>
<body>
<script>
function test(result)
{
var x = `\\`+ result+`\\`;
console.log(x)
}
</script>
</body>
</html>

此时,PHP将输出发送到客户端。因为我使用了strtolower函数,所以这里没有任何破坏代码的更改,test函数唯一要做的就是用双反斜杠包装result,但是如果我使用了strtouppertest函数就会失败,因为RESULT是未定义的。我假设decrypt_url函数不应该只是将输入包装在反斜杠中,但它将以一种更复杂的方式转换输入,这很可能会完全破坏生成的代码,因此无法加载页面。

我希望这能更清楚地说明为什么这种方法不能工作。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58007698

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档