pdrakeweb / phpcs-security-audit
phpcs-security-audit 是一组 PHP_CodeSniffer 规则,用于检测 PHP 及其流行的 CMS 或框架中的安全漏洞或弱点。
This package is not auto-updated.
Last update: 2024-09-14 16:13:35 UTC
README
phpcs-security-audit 是一组 PHP_CodeSniffer 规则,用于检测 PHP 及其流行的 CMS 或框架中的安全漏洞或弱点。
它目前包含核心 PHP 规则以及 Drupal 7 特定规则。下一个计划的 CMS 框架是 Symfony 2。
作为额外的规则集,该工具还检查与 CMS 框架相关的 CVE 问题和安全警告。您可以在静态代码分析期间使用它来跟踪组件的版本。
该项目作为 PHP_CodeSniffer 的扩展的主要原因是易于集成到持续集成系统中,并能够发现用面向对象分析(如在 RIPS 或 PHPMD)中)无法检测到的安全漏洞。
phpcs-security-audit 由 Phéromone 支持,并由 Jonathan Marcil 编写。
用法
您需要先安装 http://pear.php.net/package/PHP_CodeSniffer/,且 PHP 5.4 或更高版本已安装。
由于 PHP CodeSniffer 的工作方式,您需要将 phpcs-security-audit 中的 Security/ 文件夹放在 /usr/share/php/PHP/CodeSniffer/Standards 中或创建一个符号链接。
然后,您只需配置或使用 XML 规则文件,然后在代码上运行它即可
phpcs --extensions=php,inc,lib,module,info --standard=example_base_ruleset.xml /your/php/files/
指定扩展名很重要,例如,PHP 代码在 Drupal 中的 .module 文件中。
如果您想将其与 Jenkins 集成,请参阅 http://jenkins-php.org/ 以获取详细帮助。
要查看输出示例,可以使用提供的 tests.php 文件
$ phpcs --extensions=php,inc,lib,module,info --standard=example_base_ruleset.xml tests.php
FILE: tests.php
--------------------------------------------------------------------------------
FOUND 16 ERROR(S) AND 15 WARNING(S) AFFECTING 22 LINE(S)
--------------------------------------------------------------------------------
6 | WARNING | Possible XSS detected with . on echo
6 | ERROR | Easy XSS detected because of direct user input with $_POST on
| | echo
8 | WARNING | db_query() is deprecated except when doing a static query
8 | ERROR | Potential SQL injection found in db_query()
9 | WARNING | Usage of preg_replace with /e modifier is not recommended.
10 | WARNING | Usage of preg_replace with /e modifier is not recommended.
Drupal 详细信息
对于 Drupal AdvisoriesContrib,您需要将 /etc/php5/cli/php.ini
中的内容更改为
short_open_tag = On
以消除 "在此文件中未找到 PHP 代码" 的警告。
请注意,仅支持从 drupal.org 下载的 Drupal 模块。如果您使用的是来自其他来源的 contrib 模块,版本检查可能无法正常工作,并会生成警告。
自定义
与正常的 PHP CodeSniffer 规则一样,自定义是通过项目顶层文件夹中的 XML 文件提供的。
example_subset_ruleset.xml
文件将提供所有可能的选项,并允许您自定义或删除不喜欢的选项。
以下参数在许多规则中都很常见(这是 PHP CodeSniffer 的限制,对此表示歉意)
- ParanoiaMode:设置为 1 以添加更多检查。0 为更少。
- CmsFramework:设置为包含规则和 Utils.php 的文件夹的名称(例如 Drupal7,Symfony2)。
专业化
如果您想分支并帮助或只是进行自己的嗅探,可以使用 phpcs-security-audit 规则中提供的工具来简化流程。
假设您有一个自定义 CMS 函数,当调用 get_param()
函数时,会从 $_GET
获取用户输入。
您需要在Sniffs/中创建一个新的文件夹,该文件夹将作为您框架的名称。然后,您需要创建一个名为Utils.php的文件,该文件实际上是专门化通用sniffs的函数。为了指导您,只需从如Drupal7/之类的文件夹复制文件即可。
您想要更改的主要函数是is_direct_user_input
,当看到get_param()
时,您希望返回TRUE。
public static function is_direct_user_input($var) { if (parent::is_direct_user_input($var)) { return TRUE; } else { if ($var == 'get_param') { return TRUE; } } return FALSE; }
不要忘记在您的XML基础配置中设置param "CmsFramework"的出现次数,以便选择您新添加的实用程序。
修改对您有用,因为您指定了其他规则的用户输入,但不一定需要自己编写sniffs,您可以使用新创建的目录来这样做。
如果您实施了任何公共cms/framework定制,请提交pull request以帮助项目发展。
烦恼
像任何安全工具一样,这个工具也有其烦恼。最初将专注于查找漏洞,但后来计划有一个阶段,将努力减少烦恼,特别是减少误报的数量。
- 它是误报的生成器。这实际上可以帮助您学习PHP中的哪些函数较弱。当设置为0时,偏执模式将通过大量减少警告来修复。
- 它很慢。在大型Drupal模块和核心中,运行它可能需要很长时间(以及RAM,如果需要,重新配置cli/php.ini以使用512M)来运行。不清楚这是否是由于PHPCS中的错误或这组规则引起的,但将在最后进行调查。同时,您可以配置PHPCS忽略大型贡献模块(并为它们运行另一个PHPCS实例仅用于.info解析)。例如,og可能需要数小时,通常一切都在1-2分钟内完成,有时在5分钟左右。您只能使用一个核心在PHP中,因为没有多线程。可能的解决方案是使用phpcs --ignore=folder来跳过扫描这些部分。
- 对于Drupal警告检查:如果一个模块有多个版本,如果存在较低版本的修复版本,那么您仍然会得到错误或警告,该模块可能是安全的。请按照Drupal网站上推荐的方式,将所有内容更新到最新版本。