我已升级到PHP5.5,现在已升级到 PHP.ini short_open_tag=off
,我认识到这一点,因为有些文件现在没有运行,因为<?
取而代之<?php
。
现在有两种解决方案可以侦测任何php文件,并将开放标记更改为<?php
或激活short_open_tag=on
第二个选项是否存在任何安全问题?
答案 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解释器。您将需要剥离:
<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)进行的:
diff
或将其与某些源备份进行比较(再次通过diff
)。希望这有帮助。 所以请开始遵守PSR Standards。
<?=