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

时间:2011-04-27 16:18:56

标签: php text customization

当开发时间很重要时,其他人可以帮助的是一个目标。我的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的转换脚本?

7 个答案:

答案 0 :(得分:4)

如果第三方有权访问代码,则无法实现有关来自第三方破坏代码的安全性的规范。

到目前为止,所提供的解决方案都存在局限性,在我看来,这些限制会破坏您的规范中更为重要的项目 - 灵活性可维护性

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

我重申 - 如果你可以访问代码,你可以破解代码。 PHP配置文件是配置项目的一种非常常见的方式。如果您不信任开发人员,请不要授予他们访问权限。不要混淆代码并牺牲可维护性。

更新PHP配置文件

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

关于nD阵列的更新

虽然它是真的parse_ini_file()不支持多维数组,但您可以将节与数组组合以提供更复杂的配置。在我看来,除此之外的任何事情都非常接近于平面数据文件 - 而不是配置文件 - 并且属于其他地方(即数据库)。

答案 1 :(得分:2)

我使用JSONjson_encode中内置的PHP找到了最简单,最灵活的格式json_decode。您的配置数组如下所示:

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

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

答案 2 :(得分:2)

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优势,甚至更多。

答案 3 :(得分:1)

我使用的数据库表有一个键,一个值和一个描述。 我通过密钥请求配置值,并在配置页面上显示说明。

保护配置文件的一种方法是询问一个以前定义的常量,您将在脚本中定义该常量。

答案 4 :(得分:0)

将此数据放入XML结构中 - 保证无需代码执行,多嵌套级别,任何类型的数据结构,注释。所有您需要的东西,IDE语法都突出了优势 用于解析 - SimpleXML(作为变体)。

答案 5 :(得分:0)

您始终可以使用.ini文件进行配置。它们不仅非常标准,而且非常易读,因此可以更轻松地配置应用程序。此功能可以帮助您:http://php.net/manual/en/function.parse-ini-file.php

但是,你应该记住Jason所说的:“简单的事实是 - 如果你能访问代码,你可以破解代码”

答案 6 :(得分:0)

鉴于.ini和.xml被拒绝,我会考虑这个:

  • 删除$ config = array(行和);线条,只保持键=>价值映射&评论
  • 不要包含配置文件,而是执行以下操作:

    eval(“$ config = array(”+ file_get_contents('config.file')+“);”);

你应该稍微解析一下config.file以提供更多防止注射的保护 - 一个不带引号/未注释;是危险的角色,可能还有其他人。大多数错误只会导致eval失败。

那就是说,如果你不相信第三方不提供危险的包含文件,那么你需要选择一种不同的方法。你能为第三方提供一个可以发布配置文件的网络界面吗?评论/提示将以HTML格式显示在屏幕上,但您可以使用漂亮,安全的JSON进行解析。