如何评估第三方扩展?


41

尽管Magento做到了很多“开箱即用”的功能,但我们发现客户商店不可避免地需要一些需要第三方扩展的功能和设施。

但是,考虑到介质的性质,将“外国”代码引入处理商业交易的复杂系统可能是一个冒险的提议。

您在评估Magento扩展时会寻找什么?您遇到过哪些“危险信号”(性能消耗,安全风险,体系结构不良行为)?


3
稍微glib,但grep'eval'* -R。如果看到它,请运行。
亚伦·邦纳

Answers:


27

以下是评估第三方模块的一些想法:

基本:

  • 当前的Magento版本支持-它是否支持Magento的最新版本(包括我们正在为其开发的最新版本)?

    如果某个模块不支持Magento的最新版本,则可能不花宝贵的开发时间就很难使其工作。

  • 支持-创建模块的开发人员是否支持该产品?

    健康模块的标志之一是开发人员积极支持它。如果他们不支持它是一个危险信号,那么如果产品好,他们为什么不支持该产品呢?

    此外,如果支持某个模块,通常我们可以通过简单的电子邮件从开发人员那里获取重要信息(例如,该模块是否使用jQuery或Prototype)。

  • 评论-其他用户在说什么?他们的经历如何?

    通过阅读评论,我们可以更好地了解全局,是否存在安装问题?开发人员是否及时,有帮助地做出回应?它是否如广告所示运作?

  • 退款-如果无法正常使用,他们会退还您的钱吗?

    很多时候,我们希望尝试该模块,以便我们对其进行测试(如果它可以正常工作并符合我们的规范)!但是,如果没有,我们希望选择退还并获得退款。

中间:

  • 类覆盖-模块是否覆盖任何核心类?

    一般来说,一个好的模块不应覆盖任何核心类,而应使用观察者。

    原因之一是,这可能会使Magento升级变得困难。此外,其他模块可能取决于给定功能的一个输出,并且此模块提供的功能有所不同。

    有时这是不可能的,如果是这种情况,应该有一个很好的理由来说明它要覆盖核心类。

  • 布局更新-模块是否更改了某些布局设置?

    某些模块会更改您网站的布局设置(例如:产品页面),确保它不会破坏您的当前布局,以及确保它满足您的要求(请阅读:需要多少时间才能解决) 。

  • 模板更改-模块是否包含更改我当前设计的模板?

    这个模块会引入新的模板吗?如果是,他们会破坏我的设计吗?按照我们想要的方式进行设计需要多少时间?

  • 依赖关系-该模块是否依赖于其他模块?

    如果模块依赖于其他模块,我们需要确保它们在那里并已安装。另外,我们需要问自己,将来是否要关闭其依赖的模块?

高级:

  • SQL升级脚本-模块是否以某种方式更新数据库?

    模块更新数据库后,我们需要确定一些事项。

    它会更新核心表吗?如果是,那就不好了,我们希望我们的数据库干净并可以升级。

    它是否以明智的方式存储信息?如果我们想自己从数据库中获取原始数据,我们是否可以理解它?

  • 事件-模块是否观察或调度任何事件?

    如果模块调度或观察事件,我们想知道:

    它观察/调度哪些事件?这会影响系统中另一个工作的模块吗?例如,如果我们的一个模块将负载商品的名称更改为大写,并且此模块在负载商品的名称上添加了“免费”一词,它将如何工作?“免费”一词也会大写吗?

  • 代码审查-模块是否使用可接受的编码技术?

    与Magento相比,这更多与PHP编码技术有关。

    代码是否使用Try / Catch块?

    代码是否会转义用户输入?

    具体细节确实取决于我们的技能水平/要求。

  • 潜在问题-安装此模块会导致哪些潜在问题?

    试想一下,如果我们安装此模块,可能会遇到的五个最主要的问题,可能令人惊讶,它确实使您对整个项目有了深入的了解。

底线:

在理想的世界中拥有所有这些东西真是太好了,在现实世界中,我们需要做被称为“妥协”的事情:)

此外,这些准则旨在为我们提供帮助,而不是阻碍我们,因此,如果我们仅安装一个模块(例如社交共享模块),并且该模块适用于需要简单站点设置的客户,做大量研究是没有意义的。

换句话说:这与我们的时间效率有关,如果使用此准则(项目中的准则)可以帮助我节省长期使用的时间,即使不放弃它也可以节省理智。


4
也许您想将相对较新的方法“ 法官”添加到您的绝佳答案中
Simon

@Simon感谢您的分享,将更加彻底地检查并更新帖子:)
pzirkind

1
只是想补充一下Simon提到的The Judge,乏味的任务最适合机器:github.com/magento-ecg/coding-standard如果您使用PHP_CodeSniffer或也存在基于PHP的版本:github.com/magento-ecg/ magniffer和PDF围绕5个最常见的Magento编码问题:info.magento.com/rs/magentocommerce/images/…– B00MER
2014年

而且我认为...应该避免所有晦涩的扩展名。它们不容易被覆盖,并且代码质量也不容易评估。
RichardBernards 2014年

10

一些Magento特定的“不良做法”危险信号是:

  • 中的任何代码 app/code/local/Mage
  • 覆盖的模板(其中的文件app/design已经存在于核心中)
  • 重写诸如的基本类catalog/product。总的来说,我会仔细检查每一次重写,看看是否可以避免
  • 严重违反Zend / Magento编码标准。尽管这只是关于代码格式的问题,但我得出的结论是,不关心标准的开发人员很可能也将不关心其他更重要的事情。
  • 核心数据库表中的更改
  • 模板中的硬编码文本(不使用翻译机制)和其他地方
  • 模板中的业务逻辑(经验法则:Mage::getModeltemplate目录中的任何出现通常都是不好的迹象)

一些与PHP相关的危险信号(这是一个非常有选择性和不完整的列表):

  • 启用了错误报告的所有通知和警告(E_STRICT
  • @操作员的用法
  • 在输出之前不清除用户数据

一些与性能相关的危险信号:

  • 循环内的数据库查询
  • 加载整个集合只是为了使用其中的一部分

还应注意一般的Code Smells,这些不是必需的危险信号,但有助于估计总体质量。



2

Inchoo的优秀人员撰写了一篇有关分析第三方模块代码的文章。本文提到了类重写,cron作业,布局更新和事件观察器。

我发现事件观察者代码具有获得最高性能的潜力。请注意为频繁调度的事件运行的资源密集型第三方代码。诸如controller_action_predispatch或集合加载之类的事件。

我使用Prattski的此实用程序模块对重写和观察者进行了很好的概述。


事件会导致性能下降吗?我阅读了调度代码,看起来很精简。唯一的问题是实际加载的代码...
boruch 2013年

@boruch这对我来说也令人怀疑。本文不具备我惯于使用Inchoo的质量,尤其是这一部分具有误导性。在大多数情况下,观察者是扩展的最简洁的解决方案,并且我相信这篇文章的目的不是阻止其使用,而是可以通过这种方式轻松阅读。他们说的是,如果可能的话,应该始终首选使用*_after事件而不是*_before事件。在性能方面,根本没有关于观察者的声明。
Fabian Schmengler

@Tyler Hebel:controller_action_predispatch每个请求发送一次,所以这也许不是最好的例子。但是,尽管您只提到了出现性能问题的高可能性,并且每个请求分配了很多次事件,但我不同意:观察者与其他任何代码相比都不太可能出现性能问题。如果您执行诸如加载所有产品之类的会真正影响性能的事情,那么无论它发生在哪里,这都是一个问题。
Fabian Schmengler

@fab-我指的是帖子,而不是inchoo文章。我同意这篇文章的质量平庸。至于之前还是之后,显然使用之后(性能,错误和完整性)会更好,但是很多时候根本不可能。例如,很多时候我们需要从观察者重定向用户。唯一要做的就是在before事件上使用observer-> getController-> redirect。这是一个更好的方法,然后重写控制器..
boruch

1

将所有模板和外观资源放置在默认/默认(或专业版或企业版)中而不是基本/默认中是很烦人的。

需要注意的是混淆的代码-搜索对eval(),base64_decode()等的调用。这通常用于许可证验证,但可能是恶意的或令人恐惧的-我已经看到至少一个组件从RSS提要中获取了任意代码。

寻找dl()调用-我见过的至少一个支付网关组件需要安装PHP扩展来进行连接!


0

你是对的。

不幸的是没有魔术:您必须测试它们,检查代码以查看其是否开发完善,由于其论坛或快速回答您的问题,因此对商业模块具有良好的支持...

Magento Connect上有一些评论,扩展的受欢迎程度可以帮助您知道它是否有价值,但是说实话,您可以找到非常流行的模块,其中包含很多错误。上周我有一个关于MailChimp模块的很好的例子,基本上做得很好,但是我不得不修复一些错误并将其提供给开发人员。总是有风险,您必须进行测试。

WebShopApp的想法是朝这个方向发展,我的意思是提供一个平台来获取有关模块的良好信息。这个想法是将Magento推向这个方向。因此,模块质量是一个实际的问题。



0

我可以提出的#1测试是在他们的代码中找到一个零日漏洞利用(通常对于Magento扩展来说不是很难),仅向其安全团队报告模拟漏洞造成的破坏(没有表明哪个漏洞)代码的一部分很容易受到攻击),然后启动秒表-因为这正是您的网站遭到黑客入侵时将要发生的情况。当他们的支持人员要求全局FTP和mysql访问时,婉言拒绝指出它违反了PCI-DSS,并提议让他们对您的源代码存储库具有只读访问权限。

我执行的#2测试是呼叫供应商并使其措手不及。询问他们进行哪种行为/单元测试,使用哪种源代码控制系统,测试哪种PHP版本,测试哪种Magento版本,测试哪种Web服务器,是否使用浏览器-用于测试前端组件等的堆栈...如果供应商不知道您在说什么,保持沉默或想要“请专家给您发电子邮件”,请像地狱一样运行,因为他们最有可能使用编号用于“版本控制”的zip文件,仅在客户报告错误后3个月内修复错误。

说到PCI-DSS,还需要对所有系统进行修改以具有恢复策略。使用将不可为空的列添加到核心表的模块,这几乎是不可能的,同时仍保持可通过审核的恢复策略。在禁用时会导致问题(阅读:SQL错误)的任何模块都可以像地狱般运行。

PCI-DSS v3

6.4.5.4退出程序。

验证是否为每个样本变更都准备了退出程序。

对于每次更改,应记录有记录的退出程序,以防更改失败或对应用程序或系统的安全性产生不利影响,以使系统恢复到以前的状态

除了其他答案之外,这也是。海事组织(IMO)应该为在该平台上产生的一些危险废话而感到羞耻。

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.