php变量可以安全地保存有害代码吗? [关闭]

Posted

技术标签:

【中文标题】php变量可以安全地保存有害代码吗? [关闭]【英文标题】:Can php variable hold harmfull code safely? [closed] 【发布时间】:2012-10-15 06:42:57 【问题描述】:

假设我有一个文本文件。它包含“有害”代码,例如:

<?php phpinfo(); ?>

也可以是其他任何东西,SQL 注入代码、html 链接等...

现在这是我的示例脚本:

$content = file_get_contents('harmfullcode.txt');

现在显然 $content 变量将存储该有害代码。

我的问题是,将此类信息存储在变量中是否安全?

我知道例如如果我

echo $content;

那么它会是有害的。

但是如果我不对变量做任何事情,那么变量保存任何类型的有害代码是否安全?

经过编辑使其更清晰:

这有什么区别?

$content = file_get_contents('harmfullcode.txt');
$safevar = removebadstuff($content);
echo $safevar;

VS

$content = removebadstuff(file_get_contents('harmfullcode.txt'));
echo $content;

第二个例子在分配给 $content 之前删除了不好的东西...??我是 php 安全的新手,试图掌握这个概念。谢谢。

【问题讨论】:

如果您不输出或进一步处理该变量,问题是,您为什么首先要读取它?我假设您正在处理该变量,并且像echo一样,处理类型对于回答您的问题是必要的。那个变量会发生什么?只知道两个没有发生的案例,但知道确实发生的案例就没那么有趣了。 我进行了编辑以使其更清晰。 removebadstuff 函数仍未定义。它没有显示您对数据的实际操作。同样通常,在 output 时数据会被正确编码,因为有不同类型的输出。如果您破坏数据(“删除坏东西”),那么您做错事的可能性很高。 removebadstuff 函数将使用所有适当的措施,如修剪、魔术引号、stripslashes、htmlentities、mysqlrealescape 等...我在编辑的示例中想说的是:在第一个示例中,$content 变量在不清理的情况下保存信息,在第二个示例中,它在保存信息之前进行了清理。我上面的例子有什么不同吗?还是他们完成相同的任务? 它们几乎相同。您可能希望在第一个示例中使用unset $content,因为第二个示例仅创建局部变量作为removebadstuff 的第一个参数。顺便说一句:PHP 中的字符串是二进制安全的。 【参考方案1】:

如果不会被打印或评估,那么可以将它作为任何字符串变量存储在变量中。

【讨论】:

为了安全起见,我会清理 $content 变量,例如 $safevar = removebadstuff($content);然后我会回显 $safevar 或用它做其他事情。我的问题是,在清理之前将有害代码存储在变量中是否安全。【参考方案2】:

除非有害代码针对file_get_contents() 中的漏洞或PHP 本身的类似函数,否则将其存储在变量中应该是安全的。输出它可能不安全,在上面运行eval 肯定是个坏主意。

【讨论】:

【参考方案3】:

这取决于你如何对待这个变量。

在您的示例中,echo $content; 不会有害,它只会显示有害代码,而不执行它。

有害的例子:

eval($content);

exec($content); // any System program execution function

//preg_relace with e modifier, this is deperecated

// and so on .....

【讨论】:

echo 仍然可以将恶意 javascript 注入网页......只是因为它不会损害服务器,但只有客户端的浏览器不会降低它的危害【参考方案4】:

它们几乎一模一样。您可能希望在第一个示例中使用unset $content,因为第二个示例仅创建局部变量作为removebadstuff 的第一个参数。

请记住strings in PHP are binary-safe。

必读: The ultimate clean/secure function

【讨论】:

哦,还有 1 个问题,在未清理的数组上使用 count() 是否安全? 与您的其他问题一样,不能说它是否安全。消毒实际上可能会造成伤害,因此不安全。 PHP 本身会将任何数组视为数组,而不管它携带的数据如何。只要它是一个数组,它就是一个数组。请记住,您只是在更改一些数据,不会使任何事情变得安全或不安全。安全发挥作用的部分通常在您怀疑的其他地方,尤其是当您非常广泛地应用这些术语时。 我认为您应该阅读以下内容:***.com/questions/4223980/… - 如果您希望从一开始就安全,请拔出服务器的网络电缆。那么 PHP 是安全的。

以上是关于php变量可以安全地保存有害代码吗? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

提高安全性的最佳 PHP.ini 设置 [关闭]

用户代码可以安全地使用结构填充吗?

多个线程可以安全地同时将相同的值写入同一个变量吗?

php全局变量 超全局变量

如何将代码从 C# 转换为 PHP [关闭]

raidrive网盘挂载对本地磁盘有害吗?