我已经从php加密字符串,并希望在客户端呈现它,但我不知道如何使用javascript混合它
$enc = encrypt_url('a');
echo "My enc result = ".$enc."<br>";
echo "My dec result = ".decrypt_url($enc);

我使用ajax传递了它,因此,客户端将其检索为"ZEJxSkpkYjhhNWUvenZkdFlUSGxvUT09“
我正在尝试解密,但无法解密
<script>
.....
success: function(result) {
var x = `<?php decrypt_url('\\`+ result+`\\') ?>`;
console.log(x)
}
</script>但结果为空

发布于 2019-09-19 17:26:43
您应该使用Ajax来实现这一点:
encrypt.php
$encrypt = encrypt_url('a');decrypt.php
die(json_encode(decrypt_url($_POST['encrypted_string'])));脚本
$.ajax({
url: "decrypt.php",
type: "post",
data: {'encrypted_string': <?=$encrypt?>},
success: function (response) {
alert(response);
},
error: function(jqXHR, textStatus, errorThrown) {
console.log(textStatus, errorThrown);
}
});发布于 2019-09-19 17:41:26
<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:
<html>
<head></head>
<body>
<script>
function(result)
{
var x = '<?php echo decrypt_url('+result+',true) ?>';
console.log(x)
}
</script>
</body>
</html>它将由浏览器呈现为:
<html>
<head></head>
<body>
<script>
function(result)
{
var x = '正如您所看到的,从<?php标记开始的输出是损坏的。
你们中的一些人可能想知道为什么,所以我想我应该扩展一下我的答案。首先,这是一个逻辑错误,因为OP假设PHP可以从客户端控制。我可以看到这一点,因为引用的代码段是嵌入了PHP的HTML,其中PHP块本身位于一段JavaScript中。现在,让我们来看看在使用OP代码的简化版本执行过程中发生了什么:
<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脚本(这是对实际过程的简化,以显示基本原理)。完成这一步后,您的代码将如下所示:
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解释时将返回什么:
'\\`+ result+`\\'我非常确定这不是OP的decrypt_url函数所需要的输入。但让我们看看代码现在是什么样子(添加了缺少的分号):
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,如果没有,第二行将导致错误。因此,让我们来解决这个问题:
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代码-让我们看看输出是什么样子:
<html>
<head>
<title>Test</title>
</head>
<body>
<script>
function test(result)
{
var x = `\\`+ result+`\\`;
console.log(x)
}
</script>
</body>
</html>此时,PHP将输出发送到客户端。因为我使用了strtolower函数,所以这里没有任何破坏代码的更改,test函数唯一要做的就是用双反斜杠包装result,但是如果我使用了strtoupper,test函数就会失败,因为RESULT是未定义的。我假设decrypt_url函数不应该只是将输入包装在反斜杠中,但它将以一种更复杂的方式转换输入,这很可能会完全破坏生成的代码,因此无法加载页面。
我希望这能更清楚地说明为什么这种方法不能工作。
https://stackoverflow.com/questions/58007698
复制相似问题