Самый простой способ параметризации / настройки PHP-приложения |удобная для человека сериализация данных - PullRequest
5 голосов
/ 27 апреля 2011

Когда время разработки имеет значение, все, что другие могут помочь, это цель. Мое 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 ]

4 голосов
/ 27 апреля 2011

Ваша спецификация, касающаяся защиты от постороннего взлома кода , не может быть достигнута, если стороннее лицо имеет доступ к коду.

Все представленные решения имеют ограничения, которые, на мой взгляд, нарушают более важные элементы вашей спецификации - гибкость и ремонтопригодность .

  • База данных Решение может отделить параметры конфигурации из кода, но вы теряете гибкость формата (например, комментарии, сложные типы данных) и увеличивать сложность, теряя ремонтопригодность. Кроме того, если разработчик имеет доступ к коду, он может просто перезаписать параметры конфигурации.
  • Решение для кодирования - включает JSON, сериализацию и INI - те же проблемы, что и решение для базы данных. Ограничено форматом кодировки. Добавлен слой сложности. Разработчик с доступом к проекту может перезаписывать параметры конфигурации.
  • База данных + Решение для кодирования содержит все те же проблемы.

Повторяю - если вы можете получить доступ к коду, вы можете взломать код . Конфигурационный файл PHP - очень распространенный способ настройки вашего проекта. Если вы не доверяете разработчикам, не предоставляйте им доступ. Не запутывайте код и не жертвуйте ремонтопригодностью.

ОБНОВЛЕНИЕ ОТНОСИТЕЛЬНО ФАЙЛА PHP CONFIG

Если вы запрашиваете ответ для простейшего способа конфигурирования a PHP приложения , то это будет INI-файл , Основная конфигурация PHP происходит из таких файлов. Этот формат предлагает весь синтаксис, который вам требуется - комментарии, массивы и т. Д. Он может быть проанализирован с помощью встроенной функции - parse_ini_file () . Если вы обеспокоены безопасностью / доступом, как отмечалось выше, вы можете исключить его из проекта или оставить в отдельном месте. И наоборот, если вы хотите разрешить кому-либо настраивать приложение без доступа к коду, он может просто отредактировать INI-файл.

ОБНОВЛЕНИЕ ОТНОШЕНИЯ nD Массивы

Хотя это правда parse_ini_file() не поддерживает многомерные массивы, вы можете комбинировать секции с массивами для обеспечения более сложной конфигурации. Все, что за этим, на мой взгляд, опасно близко к плоскому файлу данных, а не к файлу конфигурации, и принадлежит в другом месте (например, базе данных).

2 голосов
/ 04 мая 2011

Отличной альтернативой 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 и даже больше.

2 голосов
/ 27 апреля 2011

Я считаю, что самым простым и гибким форматом является JSON с использованием встроенных PHP json_encode и json_decode .В этом случае ваш конфигурационный массив выглядит так:

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

Преимущество заключается в том, что вы также можете хранить конфигурацию где-то еще (например, в базе данных) и не должны предоставлять пользователям прямой доступ к файловой системе.

1 голос
/ 27 апреля 2011

Я использую таблицу БД, которая имеет ключ, значение и описание. Я запрашиваю значение конфигурации по его ключу, и описание отображается на странице конфигурации.

Одним из способов защиты вашего конфигурационного файла является запрос предварительно определенной константы, которую вы определите в своих скриптах.

0 голосов
/ 04 мая 2011

Учитывая, что .ini и .xml были отклонены, я бы подумал:

  • Удалите массив $ config = (line and);строки, сохраняя только ключ => сопоставления значений и комментарии
  • Вместо включения файла конфигурации выполните что-то похожее на:

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

Вам нужно немного разобрать config.file, чтобы обеспечить большую защиту от инъекций - с макушки головыбез кавычек / без комментариев ; является опасным персонажем, могут быть и другие.Большинство ошибок просто приводят к сбою eval.

При этом, если вы не доверяете сторонней организации не предоставлять опасный включаемый файл, вам нужно выбрать другой подход.Можете ли вы предоставить стороннему веб-интерфейс, который отправляет вам файлы конфигурации?Комментарии / подсказки будут отображаться на экране в HTML, но у вас будет хороший, безопасный JSON для анализа.

0 голосов
/ 01 мая 2011

Вы всегда можете использовать .ini файлы для конфигурации.Мало того, что они в значительной степени стандартны и очень удобочитаемы, это облегчит настройку вашего приложения.Эта функция может помочь вам: http://php.net/manual/en/function.parse-ini-file.php

Но вы должны помнить, что сказал Джейсон: «Простая истина в том, что если вы можете получить доступ к коду, вы можете взломать код»

0 голосов
/ 30 апреля 2011

Поместите эти данные в структуру XML - гарантировано без выполнения кода, многоуровневых уровней, любого типа структуры данных, комментариев.Все, что вам нужно, и синтаксис IDE выделяются как преимущество.
Для анализа - SimpleXML (как вариант).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...