PHP 5.5 short_open_tag =安全漏洞?

时间:2014-03-21 09:24:28

标签: php short-open-tags

我已升级到PHP5.5,现在已升级到 PHP.ini short_open_tag=off,我认识到这一点,因为有些文件现在没有运行,因为<?取而代之<?php

现在有两种解决方案可以侦测任何php文件,并将开放标记更改为<?php或激活short_open_tag=on

第二个选项是否存在任何安全问题?

1 个答案:

答案 0 :(得分:24)

不是直接的安全漏洞,但在适当的条件下它可能成为一个漏洞。

首先关闭let的规格标准。在PHP 5.4及更高版本中,short_open_tag=on指令适用于除<?=之外的所有短标记 - echo标记。 通常认为,由于可移植性,在整个代码中使用短标记是一种不好的做法。我个人现在使用短标签。 由于PHP 5.4和&gt; = 5.4,短回声标记<?=始终可用且不受short_open_tag ini指令的影响。我认为这个决定将echo标签与其他标签分开是好的。

实际上PSR Standards建议这样做。所以: PSR-1建议仅使用<?php ?><?= ?>(echo short tag) - 而不使用其他变体PSR-2建议不要关闭代码在PHP专用文件中。这可能看起来很奇怪,但有时候你的代码中可能存在无法追踪的错误,因为在你的开始之前或者在你的结束之后只有一个空格('')字符。这是一个众所周知的问题。我坚持这两种做法,因为我看到这一切都非常错误,因为旧项目中的标签用法不同。

这一切从哪里开始?

早在PHP的早期,人们就开始意识到PHP标签与XML和ASP的标签冲突。是的,您可以使用<% //code here %>作为打开/关闭代码。 然后决定PHP将使用<?php ?>来区分XML和ASP - 这是PHP代码的顶级命名空间。 实际上ASP标签是一种舒适的方式,可以简化ASP开发人员对PHP的采用。

ASP标记由asp_tags ini指令处理,它们应该关闭。

再次 - 举行了关于短标签的争论,这就是为什么短标签和短回声标签之间存在分离的原因。我认为这是件好事。只需替换旧代码中的所有短标记即可。

现在关于安全性

你应该担心的唯一情况是你有一些用户输入,不知何故最终会通过PHP解释器。您将需要剥离:

  • 普通PHP标签
  • 简短的PHP标记
  • 短回声标签
  • ASP样式标记
  • 字节移位代码注入
  • 任何有<script language="php"></script>
  • 的内容

这最后一部分 - <script language="php"></script> - 非常重要,因为它今天没有被使用(如果没有它我们会更好)但据我记得它仍然由PHP解释器支持。因此,该HTML脚本标记之间的任何内容都将被解释为PHP。的 All this is very well explained here

到底是什么字节移位代码注入

这有点难以解释,但基本思想是混淆代码注入。因此,如果攻击者以某种方式能够注入一些PHP代码并且他/她不希望维护者/开发人员立即识别它,他可以做类似下面的事情:

$smth = 'rpub "lbh ner nggnpxrq naq lbhe jrofvgr unf orra gnxra bire";';
eval(str_rot13($smth));

这个想法是“sting的blob”是一个php代码字符串,但是字节移位所以它被混淆了。在我的示例中,eval()将收到 echo "you are attacked and your website has been taken over"。 我正在使用str_rot13(),因为很容易对字符串进行前后混淆,但这可能是基于chr()ord()或任何其他字符串操作函数的自定义函数。

防止此类攻击的最佳方法是阻止eval()执行。您应该可以通过disable_functions ini directive执行此操作。解析你的代码当然!但也禁用eval()

像Wordpress这样的系统很难注意到这种类型的攻击,它会在数据库中存储大量内容,其中大部分都是不必要的。我亲眼看到这样的代码注入是以两种方式之一对网站(不是我维护的那些:D)进行的:

  • 数据库损坏(当应用程序存储被解释的内容时可能)
  • 直接PHP源文件损坏 - 这更容易分析 - 仅针对存储库中的最新版本diff或将其与某些源备份进行比较(再次通过diff)。

希望这有帮助。 所以请开始遵守PSR Standards

  • 除echo标签<?=
  • 外,请勿使用短标签
  • 禁用ASP样式标记
  • 注意代码注入。