我现在已经升级到 PHP5.5 并且在PHP.ini中short_open_tag=off
并且我认识到了这一点,因为有些文件现在没有运行,因为<?
而不是<?php
.
现在有两种解决方案搜索任何 php 文件并将打开标记更改为<?php
或激活short_open_tag=on
第二种选择是否存在安全问题?
我现在已经升级到 PHP5.5 并且在PHP.ini中short_open_tag=off
并且我认识到了这一点,因为有些文件现在没有运行,因为<?
而不是<?php
.
现在有两种解决方案搜索任何 php 文件并将打开标记更改为<?php
或激活short_open_tag=on
第二种选择是否存在安全问题?
不是直接的安全漏洞,但在适当的条件下它可能会成为一个安全漏洞。
首先让我们来规范标准。在 PHP 5.4 及更高版本中,该short_open_tag=on
指令适用于所有短标签,除了<?=
echo 标签。通常认为,由于可移植性,在整个代码中使用短标签是一种不好的做法。我个人现在确实使用短标签。自 PHP 5.4 和 >= 5.4 起,短回显标签<?=
始终可用,不受short_open_tag
ini 指令的影响。我认为将回声标签与其他标签分开的决定是一个很好的决定。
实际上,PSR 标准表明了这一点。所以:
PSR-1建议只使用<?php ?>
or <?= ?>
(echo short tag) -而没有其他变体,而PSR-2建议不要关闭 PHP-only 文件中的标签。这可能看起来很奇怪,但有时您的代码中可能会出现无法追踪的错误,因为在您的开始之前或在您的右括号之后有一个空格 (' ') 字符。这是一个众所周知的问题。我坚持这两种做法,因为我看到这一切都非常错误,因为旧项目中使用了不同的标签。
这一切是从哪里开始的?
早在 PHP 的早期人们就开始意识到 PHP 标记与 XML 和 ASP 的标记冲突。是的,您可以<% //code here %>
用作打开/关闭标签。然后决定 PHP 将使用<?php ?>
as 来区别于 XML 和 ASP——PHP 代码的顶级命名空间。实际上,引入 ASP 标签是为了方便 ASP 开发人员采用 PHP 的一种舒适方式。
ASP 标记由asp_tags
ini 指令处理,它们应该是关闭的。
再次 - 对短标签进行了辩论,这就是为什么现在短标签和短回声标签之间存在分离。我认为这是一件好事。只需替换旧代码中的所有短标签。
现在谈安全。
您应该担心的唯一情况是当您有一些用户输入以某种方式最终通过 PHP 解释器时。您将需要剥离:
<script language="php"></script>
最后一部分 - <script language="php"></script>
- 非常重要,因为它现在没有被使用(没有它我们会更好),但据我所知,PHP 解释器仍然支持它。因此,该 HTML 脚本标记之间的任何内容都将被解释为 PHP。这一切在这里都得到了很好的解释。
字节移位代码注入到底是什么鬼?
这有点难以解释,但基本思想是它是混淆代码注入。因此,如果攻击者能够以某种方式注入一些 PHP 代码并且他/她不希望维护者/开发人员立即识别它,他可以执行以下操作:
$smth = 'rpub "lbh ner nggnpxrq naq lbhe jrofvgr unf orra gnxra bire";';
eval(str_rot13($smth));
这个想法是“刺痛的斑点”是一个php代码字符串,但字节移位了,所以它被混淆了。在我的示例中,eval()
将收到
echo "you are attacked and your website has been taken over"
. 我正在使用str_rot13(),因为它很容易前后混淆字符串,但这可能是基于chr()
orord()
或任何其他字符串操作函数的自定义函数。
防止此类攻击的最佳方法是阻止eval()
执行。您应该能够通过disable_functions
ini 指令执行此操作。当然解析你的代码!还要禁用eval()
.
这种类型的攻击对于像 Wordpress 这样的系统来说真的很难注意到,它们在数据库中存储了很多东西,其中大部分都是不必要的。我个人已经看到通过以下两种方式之一对网站(不是我维护的那些:D)进行此类代码注入:
diff
将其与存储库中的最新版本进行比较,或将其与某些源备份进行比较(再次通过diff
)。希望这有帮助。所以请开始遵守PSR 标准。
<?=