更改 url 时 Opencart 显示错误

Opencart showing error when changed the url

我正在使用 opencart 2.0.2.0。我只是在检查一些随机技巧,然后将 url index.php?route=common/home 写入 index.php?route=common/home%00。它向我显示了一个错误 Warning: is_dir() expects parameter 1 to be a valid path, string given in \system\engine\action.php on line 18 不明白为什么会这样。任何人都可以帮助我知道为什么会发生此错误以及我该如何解决?

经过一些研究,我发现它实际上是 PHP 中的一个错误(报告 here @ 2/4/2015 并且已经修复)

你的问题是什么?
空字节 (%00) 导致 PHP 字符串被截断(我认为这很正常,因为 PHP 字符串是通过 c 字符串实现的)

那么OC发生了什么?

  • 打开文件<OC_ROOT>\system\engine\action.php(你报错的那个),class Action就在里面,负责解析路由参数,确定合适的控制器loaded + 该控制器中的哪个函数调用并保留方法参数以便稍后在执行期间传递
  • 在那一行
    $file = DIR_APPLICATION . 'controller/' . str_replace(array('../', '..\', '..'), '', $path) . '.php';
    你会注意到控制器文件是通过将 .php 附加到 $path 构造的变量来加载的解析路由参数,因为你在路由中添加了一个额外的空字节,$file 看起来像这样:bla bla bla/common/home[=17=].php[=18=] 导致剥离 .php,这导致一个不存在的文件路径,这就是 OC 加载错误页面的原因

如何解决
只需关闭项目的警告,如果你的意思是 "how can i solve it?" 让它工作,那么在解析它之前从路由参数中删除空字节(在同一个文件中),但我不建议你这样做,因为这是一个经过处理的 hack,您将对其进行处理 :D

这只是针对此 opencart 版本的警告。为了快速解决,您将在 __construct 函数中添加 "error_reporting(0);"。

谢谢。