Самый простой способ параметризации/настройки php-приложения|сериализации данных, удобных для человека


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

7 answers

Отличной альтернативой 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
Author: isra17, 2011-05-05 16:18:16

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

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

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

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

ОБНОВЛЕНИЕ, КАСАЮЩЕЕСЯ КОНФИГУРАЦИОННОГО ФАЙЛА PHP

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

ОБНОВЛЕНИЕ ЧТО КАСАЕТСЯ массивов nD

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

 4
Author: Jason McCreary, 2011-05-05 16:11:32

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

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

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

 2
Author: Daff, 2011-04-27 16:26:53

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

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

 1
Author: Pablo Rodríguez, 2011-04-27 16:33:04

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

 0
Author: OZ_, 2011-04-30 08:56:32

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

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

 0
Author: Klaus S., 2011-05-01 00:18:32

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

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

    Eval("$config =массив("+file_get_contents('файл конфигурации')+");");

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

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

 0
Author: Phil Lello, 2011-05-04 04:30:08