有人可以向我解释为什么这个PHP代码有效吗?

时间:2017-01-08 19:06:58

标签: php

我在网上找到了这段漂亮的PHP代码:

<?=($__='`@`@'^'*/).')(($_='->.<:'^'__@[_')('>'^@_,'%'^@_)),$__($_('|'^'=','|'^'&')),$__($_(':'^"\n",';'^']'^@_));

运行它时,它会生成以下文本字符串:

abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789

为什么这样做会有效?

1 个答案:

答案 0 :(得分:3)

你开始的是<?=(value),(value),(value);所以你可以像这样重写它。

echo ($__='`@`@'^'*/).')(($_='->.<:'^'__@[_')('>'^@_,'%'^@_));
echo $__($_('|'^'=','|'^'&'));
echo $__($_(':'^"\n",';'^']'^@_));

第1行:

$__ = '`@`@'^'*/).'使用^the bitwise operator`@`@移至*/).并将$__设置为字符串'JoIn',然后它对$_执行此操作,将其设置为字符串'range'。

$__()$_()现在是join()range()的别名。

让第一行更容易阅读:

echo ($__='join')(($_='range')('>'^@_,'%'^@_));

在括号中包装片段用于设置var,然后将其值作为表达式传递,这样你就可以做这样的奇特事情。

一点清洁:

$__ = 'join';
$_ = 'range';
echo $__($_('>'^@_, '%'^@_));

内部函数的两个参数:'>'^@_'%'^@_,是'a'和'z'。 (这些会滥用error suppression operator @来删除警告,并将_用作字符串,因此'>'^'_''%'^'_'

现在您echo join(range('a', 'z'));给了abcdefghijklmnopqrstuvwxyz

第二行将'|'^'=''|'^'&'AZ传递给这两个函数。

第三行传递09

最大的问题是你不应该在生产代码中使用任何这些技巧。