我见过很多次人们说不要在块,节点,视图参数,规则等中使用自定义PHP / PHP过滤器(来自Drupal UI)。我进行了一些搜索,但没有发现太多,似乎这是所有“都知道”的Drupal最佳实践。
我知道这构成了潜在的安全风险,特别是对于最终用户或刚接触Drupal或PHP的人员而言,但是作为开发人员/网站构建者,真正的原因是不使用Drupal UI中的自定义PHP?
我见过很多次人们说不要在块,节点,视图参数,规则等中使用自定义PHP / PHP过滤器(来自Drupal UI)。我进行了一些搜索,但没有发现太多,似乎这是所有“都知道”的Drupal最佳实践。
我知道这构成了潜在的安全风险,特别是对于最终用户或刚接触Drupal或PHP的人员而言,但是作为开发人员/网站构建者,真正的原因是不使用Drupal UI中的自定义PHP?
Answers:
原因如下:
可能还有更多原因,但这应该足够了:)
require_once $_SERVER['DOCUMENT_ROOT'].'/sites/all/themes/myTheme/php/stuff.php';
并在IDE /文本编辑器中编写其余代码。有时,即使作为一个优秀的PHP开发人员,这也不是一件容易的事,或者要花很长时间才能创建自己的模块。一个简短的例子:Ubercart条件操作。但是,确实将代码保留在db中并不是一件好事。
考虑到节点中使用PHP过滤器的情况,不使用它的原因是,如果您不想让所有用户都使用PHP过滤器,则会限制可以编辑该节点的用户。
与其使用PHP过滤器,不如使用一个自定义模块,该模块将用其执行的代码结果替换节点内容中的特定文本(不使用eval()
),或者将其自身的文本附加到节点的主体内容中。在这种情况下,任何用户都可以编辑该节点,而无需获得添加任意PHP代码(然后由PHP过滤器运行)的权限。
通常,最好避免使用eval()
它,因为它会降低代码的可读性,降低您在运行时预测代码路径的能力(以及可能的安全隐患),从而降低代码调试的能力。
除了在开发或测试站点中,我不会启用PHP过滤器,也不会使用传递给的PHP代码eval()
。
PHP过滤器已从Drupal 8中删除。它现在是第三方模块,未包含在安全建议策略中。这可能是在生产服务器中不使用它的更多原因(如果已经给出的原因不能说服您)。
作为上述各种问题(代码维护困难,版本控制,发现错误)的变通办法,您可能会略有“ klugey”的可能性:
在始终包含的某些文件中创建函数(根据函数的用途仔细命名)-如果您要为站点编写自定义模块,那么放置这些函数的好地方。您输入的php很简单:return my_specialfunc($somevar);
- $somevar
这里可能是正在处理的节点对象,或者其他与此相关的变量。
我发现,在某些地方,我通常还是希望能够灵活地调用自己的代码。使用此技术时,维护代码很容易,因为只需修改文件中的函数即可。由于该函数将显示在回溯中,因此发现错误很容易。
但是请注意,这不能解决潜在的安全问题。这些在很大程度上取决于Drupal核心的安全性。通常,包含数据库的代码通常是安全的致命弱点-使用包含数据库的代码的功能往往更容易被利用,并且围绕它们的安全性需要特别严格。但是,Drupal通常在维护这些问题的安全性方面非常擅长-这些问题出现了,然后很快就用新发行版进行了修补/解决。
如果您不希望非管理员用户直接修改数据库,则这是安全漏洞原因,可避免将此权限授予用户。
<?php
echo file_get_contents(dirname(__FILE__)."/../sites/default/settings.php");
?>
与其做类似的事情return functionname($object)
,不如尽可能地使用令牌/过滤器系统。诸如“插入视图”和“嵌入节点”之类的模块可以在人们希望将PHP嵌入节点或块体的常见情况下提供帮助。
您应该关心数据的可移植性。如果将节点从drupal 7迁移到drupal 8,并且其中包含某些节点的正文<?php whatever_function_that_does_not_exist_anymore(); ?>
,该怎么办?
不要在5个月内而是5年内考虑您的项目。我认为,更新,良好实践和可移植性是任何良好IT项目的重要方面。
使用尽可能少的贡献模块也是这一方面的一个方面。