在块,节点,views-args等中使用PHP筛选器代码的缺点是什么?


96

我见过很多次人们说不要在块,节点,视图参数,规则等中使用自定义PHP / PHP过滤器(来自Drupal UI)。我进行了一些搜索,但没有发现太多,似乎这是所有“都知道”的Drupal最佳实践。

我知道这构成了潜在的安全风险,特别是对于最终用户或刚接触Drupal或PHP的人员而言,但是作为开发人员/网站构建者,真正的原因是不使用Drupal UI中的自定义PHP?


1
和往常一样,要视情况而定!如果您只需要在“视图页脚”的“视图页脚”底部的基本打印$ block上,则可能只需要通过gui进行操作,而不是仅为此目的而编写整个tpl文件。当然,这还取决于站点的角色和其他因素:期限紧迫?用户社区网站?还是仅仅是信息网站?这对业务运营至关重要吗?等...视情况而定。
Patoshiパトシ

Answers:


129

原因如下:

  • 数据库中的代码无法进行版本控制,通常以后也很难找到。
  • Eval()的代码比文件中的硬编码慢得多。
  • 如果该代码中的某个地方有错误,您将收到一条非常无用的错误消息(第3行中eval()代码中的错误),甚至可能需要手动浏览数据库以查找并修复错误。例如,如果它位于所有页面上显示的块内,并且始终导致致命错误。
  • 从Drupal 6升级到7并更改了您使用的任何API后,上述情况也适用。因此,在迁移时必须移植代码。如果代码在模块中,则可以预先移植,测试并仅将其部署在新站点上。在节点或块内部,它仅适用于Drupal 6或7。
  • 编写和维护该代码也更加困难,因为您正在浏览器中的文本字段中工作。将其包含在模块中使您可以使用具有语法突出显示,自动完成等功能的编辑器/ IDE。
  • 总是存在配置错误的可能性,使人们可以在启用php执行的情况下访问文本格式/块/任何内容。如果甚至没有启用php.module(在D7中,D6并不那么严格,例如对于块访问规则),则该风险已经大大降低了。
  • 如果您的CMS允许执行PHP,那么发现XSS安全漏洞或特权升级的攻击者现在可以使用您的服务器处理极其恶意的事情(作为DDOS的一部分,发送垃圾邮件,托管恶意软件,入侵到该站点上的其他站点/数据库)服务器,入侵可能位于防火墙后面的网络上的其他服务器)。除了使小漏洞更加痛苦之外,如果已知该站点可用于执行php,则这使该站点更有可能成为攻击目标。

可能还有更多原因,但这应该足够了:)


3
不错的清单:)希望可以成为其他人的资源
Laxman13 2011年

3
@ Laxman13:“对其他人”……还有你!:D @Berdir:+1,非常好的方面。顺便说一句,您不必在文本字段中编写整个代码,因为您还可以在其中包含文件。例如,您可以在文本字段中仅输入一行:require_once $_SERVER['DOCUMENT_ROOT'].'/sites/all/themes/myTheme/php/stuff.php';并在IDE /文本编辑器中编写其余代码。有时,即使作为一个优秀的PHP开发人员,这也不是一件容易的事,或者要花很长时间才能创建自己的模块。一个简短的例子:Ubercart条件操作。但是,确实将代码保留在db中并不是一件好事。
Sk8erPeter

我的意思是,例如UC条件操作模块具有非常出色的GUI,从而省去了编写自己的长代码的大量时间。您可以使用GUI上的“ next-next-finish”方法在几分钟内创建一个真正复杂的动作。但是也许您想用自己的一些代码扩展功能-在许多情况下,为此目的开发模块根本不值得。
Sk8erPeter

1
+1000-我已经看到了,这个列表中的每个要点都消耗了很多项目。在我的一生中,只有一次使用PHP模块是以理智的方式完成某件事的唯一方法,这仅仅是因为D7中的一个问题已在D7中修复。
geerlingguy

感谢您提供详细信息,以解决此问题。我在Drupal中工作时发现一种情况,当我们需要在“文本编辑器”中添加链接时,我们需要在“文本过滤器”中使用php代码,否则将无法正常工作。
Jayendra Kainthola

17

此代码很难调试和维护。我不知道对这种php代码使用版本控制的任何方法。

对于刚接触Drupal或PHP的人来说,这确实是潜在的安全风险,


1
好吧,如果将块配置导出到带有功能模块的代码中,则将PHP代码段置于版本控制下不是问题。
ya.teck

14

考虑到节点中使用PHP过滤器的情况,不使用它的原因是,如果您不想让所有用户都使用PHP过滤器,则会限制可以编辑该节点的用户。
与其使用PHP过滤器,不如使用一个自定义模块,该模块将用其执行的代码结果替换节点内容中的特定文本(不使用eval()),或者将其自身的文本附加到节点的主体内容中。在这种情况下,任何用户都可以编辑该节点,而无需获得添加任意PHP代码(然后由PHP过滤器运行)的权限。

通常,最好避免使用eval()它,因为它会降低代码的可读性,降低您在运行时预测代码路径的能力(以及可能的安全隐患),从而降低代码调试的能力。

除了在开发或测试站点中,我不会启用PHP过滤器,也不会使用传递给的PHP代码eval()

PHP过滤器已从Drupal 8中删除。它现在是第三方模块,未包含在安全建议策略中。这可能是在生产服务器中不使用它的更多原因(如果已经给出的原因不能说服您)。


11

作为上述各种问题(代码维护困难,版本控制,发现错误)的变通办法,您可能会略有“ klugey”的可能性:

在始终包含的某些文件中创建函数(根据函数的用途仔细命名)-如果您要为站点编写自定义模块,那么放置这些函数的好地方。您输入的php很简单:return my_specialfunc($somevar);- $somevar这里可能是正在处理的节点对象,或者其他与此相关的变量。

我发现,在某些地方,我通常还是希望能够灵活地调用自己的代码。使用此技术时,维护代码很容易,因为只需修改文件中的函数即可。由于该函数将显示在回溯中,因此发现错误很容易。

但是请注意,这不能解决潜在的安全问题。这些在很大程度上取决于Drupal核心的安全性。通常,包含数据库的代码通常是安全的致命弱点-使用包含数据库的代码的功能往往更容易被利用,并且围绕它们的安全性需要特别严格。但是,Drupal通常在维护这些问题的安全性方面非常擅长-这些问题出现了,然后很快就用新发行版进行了修补/解决。


11

如果您不希望非管理员用户直接修改数据库,则这是安全漏洞原因,可避免将此权限授予用户。

<?php
echo file_get_contents(dirname(__FILE__)."/../sites/default/settings.php");
?>

破解Drupal数据库凭据


7

与其做类似的事情return functionname($object),不如尽可能地使用令牌/过滤器系统。诸如“插入视图”和“嵌入节点”之类的模块可以在人们希望将PHP嵌入节点或块体的常见情况下提供帮助。


0

您应该关心数据的可移植性。如果将节点从drupal 7迁移到drupal 8,并且其中包含某些节点的正文<?php whatever_function_that_does_not_exist_anymore(); ?>,该怎么办?

不要在5个月内而是5年内考虑您的项目。我认为,更新,良好实践和可移植性是任何良好IT项目的重要方面。

使用尽可能少的贡献模块也是这一方面的一个方面。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.