如何避免“PHP注入”

时间:2010-12-09 17:37:09

标签: php security

我有这个脚本

<?php $number = %value%; ?>

%value%标记将被用户输入的数据库上的值替换。

我担心的是有人输入的内容如下:

1; echo phpinfo()

替换的结果将是:

<?php $number = 1; echo phpinfo(); ?>

这显然是一种安全隐患。

是否有一个函数来逃避php脚本字符或我可以使用的东西?

提前致谢。

上下文

这是我正在研究的CMS上的工具,通常工具生成添加到某些PHP文件的HTML代码。

在这种情况下,此工具从RSS频道生成HTML结构。我们要求用户输入RSS URL和要显示的提要数量,我们将这些值替换为PHP脚本,并使用它们获取提要并以HTML结构显示它们。

像这样:

<?php
  $url = "URL"; //comes from DB
  $number = N; //comes from DB
  $feeds = getFeeds($url, $number);
  ...
?>

3 个答案:

答案 0 :(得分:10)

您上面描述的机制存在缺陷。 PHP就是这样不行。除非:

,否则不会执行用户输入(或者更准确地说,由PHP解释)
  • 您通过eval()电话
  • 运行它
  • 您将代码和用户输入的组合保存为PHP文件,然后执行它

你应该担心的是SQL注入,这是一个非常不同的东西。

如果你指的是一个类似子弹的场景,你很可能从设计的角度做一些非常错误的事情,你应该重新考虑你的方法。

答案 1 :(得分:1)

正如code_burgar所提到的......这种设计完全有缺陷。应该没有理由动态构建服务器执行的文件。您应该从db中提取记录集,循环遍历它并为每条记录执行getFeeds()函数。这样做不会执行任何db提供的数据,除非..再次作为cod_burgar说..你使用eval()函数。

答案 2 :(得分:1)

通常,您希望在任何程序中清理所有用户提供的输入。 EG:如果要求一个5位数字,在将数据分配给变量之前,确认它实际上是一个整数,并确保它只有5位数。

Link to sanitizing PHP input