参数化/配置php应用程序的最简单方法|人性化的数据序列化


Simplest way to parameterize/configure php application | human friendly data serialization

当开发时间很重要时,其他人所能帮助的只是一个目标。我的PHP应用程序现在是参数化的&配置一个包含文件,该文件包含如下格式的数组:

$config = array(
   'company'            => 'BMC' ,       // the visible company name
   'aplicable_tax'      => .21   ,       // the IVA tax
   'context_arr'        => array(
        'case1'             =>    12,    // the defalul value
        'case2'             =>    13,
        'case3'             =>    14
                           ),
   'EN_welcome_text'       => 'hello',   // do NOT translate on regionalization
   // xx comparation matrix
   'xx_maxref'=> 5,
   'xx_range' => array( 0, 1, 2, 3, 4, 5, 6, 7, 8, 9),
   'xx_comp'  => array( 
    //  V Other V  > I >>   0, 1, 2, 3, 4, 5, 6, 7, 8, 9
        /*  0 */     array( 0, 3, 5, 5, 5, 5, 5, 5, 5, 5),
        /*  1 */     array(-3, 0, 3, 5, 5, 5, 5, 5, 5, 5),
        /*  2 */     array(-5,-3, 0, 3, 5, 5, 5, 5, 5, 5),
        /*  3 */     array(-5,-5,-3, 0, 3, 5, 5, 5, 5, 5),
        /*  4 */     array(-5,-5,-5,-3, 0, 3, 5, 5, 5, 5),
        /*  5 */     array(-5,-5,-5,-5,-3, 0, 3, 5, 5, 5),
        /*  6 */     array(-5,-5,-5,-5,-5,-3, 0, 3, 5, 5),
        /*  7 */     array(-5,-5,-5,-5,-5,-5,-3, 0, 3, 5),
        /*  8 */     array(-5,-5,-5,-5,-5,-5,-5,-3, 0, 3),
        /*  9 */     array(-5,-5,-5,-5,-5,-5,-5,-5,-3, 0),
),

// and so on
// and so on
// and so on
)

但是这种方法是不安全的,因为任何允许的编辑器都可以注入PHP代码或错误。

我的问题:

  • 你能建议一个简单而灵活的格式给三方参数化PHP应用程序的方法吗?
  • 是否有从该格式转换为PHP的脚本?

如果第三方可以访问代码,则无法实现您关于第三方破坏代码的安全性的规范。

目前提供的解决方案都有局限性,在我看来,它们打破了规范中更重要的条款——灵活性可维护性

  • 数据库解决方案可以分离代码中的配置选项,但是你失去了格式的灵活性(例如注释、复杂数据类型)增加复杂性,失去可维护性。此外,如果开发人员可以访问代码,他们可以简单地覆盖配置选项。
  • 编码解决方案 -这包括JSON,序列化和INI -与数据库解决方案相同的问题。限于编码的格式。增加了一层复杂性。具有项目访问权限的开发人员仍然可以覆盖配置选项。
  • 数据库+编码解决方案包含所有相同的问题。

我重申- 如果你能访问代码,你就能破解代码。PHP配置文件是配置项目的一种非常常用的方法。如果你不信任开发者使用它,就不要让他们访问。不要混淆代码,牺牲可维护性。

PHP配置文件更新

如果您正在请求配置PHP应用程序的最简单的方法的答案,那将是一个INI文件。PHP的核心配置来自这些文件。它的格式提供了你需要的所有语法——注释、数组等。它可以用本地函数parse_ini_file()来解析。如果您关心安全性/访问,如上所述,您可以将其从项目中排除或将其保存在单独的位置。相反,如果你想让别人在不访问代码的情况下配置应用程序,他们可以简单地编辑INI文件。

关于nD数组的更新

虽然parse_ini_file()确实不支持多维数组,但是您可以将section与数组结合起来以提供更复杂的配置。在我看来,超出这个范围的任何东西都危险地接近于平面数据文件——而不是配置文件——并且属于其他地方(即数据库)。

XML的一个很好的替代方案是YAML。YAML的语法轻巧,易于任何人读/写。另一个重要的一点是,YAML区分了哈希和数组。我建议您使用symfony独立组件:http://fabien.potencier.org/article/40/the-state-of-yaml-in-php

你的文件看起来像:

company: BMC         #the visible company name
aplicable_tax: 0.21  #the IVA tax
context_arr:
    case1: 12       #the defalul value
    case2: 13
    case3: 14
EN_welcome_text: hello #do NOT translate on regionalization
#xx comparation matrix
xx_maxref: 5
xx_range: [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ]
xx_comp:
# V Other V  > I >>   0, 1, 2, 3, 4, 5, 6, 7, 8, 9
    -[  0, 3, 5, 5, 5, 5, 5, 5, 5, 5 ] # [ 0 ]
    -[ -3, 0, 3, 5, 5, 5, 5, 5, 5, 5 ] # [ 1 ]
    -[ -5,-3, 0, 3, 5, 5, 5, 5, 5, 5 ] # [ 2 ]
    -[ -5,-5,-3, 0, 3, 5, 5, 5, 5, 5 ] # [ 3 ]
    -[ -5,-5,-5,-3, 0, 3, 5, 5, 5, 5 ] # [ 4 ]
    -[ -5,-5,-5,-5,-3, 0, 3, 5, 5, 5 ] # [ 5 ]
    -[ -5,-5,-5,-5,-5,-3, 0, 3, 5, 5 ] # [ 6 ]
    -[ -5,-5,-5,-5,-5,-5,-3, 0, 3, 5 ] # [ 7 ]
    -[ -5,-5,-5,-5,-5,-5,-5,-3, 0, 3 ] # [ 8 ]
    -[ -5,-5,-5,-5,-5,-5,-5,-5,-3, 0 ] # [ 9 ]

YAML具有XML的所有优点,甚至更多。

我发现最简单和最灵活的格式是JSON使用php内置的json_encode和json_decode。您的配置数组看起来像这样:

{
    "company" : "BMC",
    "aplicable_tax" : 0.21,
    "context_arr" :
    {
        "case1" : 12,
        "case2" : 13,
        "case3" : 14
    },
    "EN_welcome_text" : "hello"
}

优点是,您还可以将配置存储在其他地方(例如数据库),并且不必让用户直接访问文件系统。

我使用一个DB表,它有一个键,一个值和一个描述。我通过键请求配置值,并在配置页面上显示描述。

保护配置文件的一种方法是请求之前定义的常量,您将在脚本中定义该常量。

将此数据放入XML结构中-保证不需要执行代码,多嵌套级别,任何类型的数据结构,注释。您需要的一切,以及IDE语法突出显示的优势。
用于解析- SimpleXML(作为变体)。

您总是可以使用。ini文件进行配置。它们不仅是非常标准的,而且非常易于阅读,还可以使配置应用程序更容易。此功能可以帮助您:http://php.net/manual/en/function.parse-ini-file.php

但是,你应该记住Jason说过的话:"简单的道理是——如果你能访问代码,你就能破解代码"

考虑到。ini和。xml已被拒绝,我将考虑如下:

  • 删除$config = array(line and);行,只保留键=>值映射&评论
  • 不包含配置文件,执行如下操作:

    eval (" $ config =数组(config.file file_get_contents("+" ')+");");

你应该解析一下config.file,以提供更多的防止注入的保护-我的头,一个未引号/未注释的;是危险的字符,可能还有其他字符。大多数错误只会导致eval失败。

也就是说,如果您不相信第三方不会提供危险的include文件,那么您需要选择不同的方法。您是否可以为第三方提供一个web界面,将配置文件发布给您?注释/提示将以HTML的形式显示在屏幕上,但是您将有一个漂亮、安全的JSON来解析。