当开发时间很重要时,其他人所能帮助的只是一个目标。我的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来解析。