Контрольная сумма PHP перед включением () - PullRequest
3 голосов
/ 15 июля 2010

Я работал над приложением, которое позволит создавать сторонние расширения для расширения функциональности приложения. Все это на PHP, конечно. Я хотел добавить немного безопасности, запустив файлы в определенном каталоге с помощью функции контрольной суммы. Если файл не проходит контрольную сумму, файл не «включается», администратор для этой установки получает уведомление, и модуль отключается до тех пор, пока администратор не начнет действовать (повторно включает и записывает исключение или переустанавливает модуль) .

Проблема, с которой я сейчас сталкиваюсь, заключается в возможности запуска этой контрольной суммы всякий раз, когда пользователь запускает функцию include(). Я бы предпочел, чтобы они не запускали две функции друг за другом, чтобы просто включить файл, но если мне нужно, я сделаю это. Не все сторонние расширения будут очень охотно запускать две функции (что-то вроде if(checksum_function($bleh)) include($bleh);), и даже если бы они были, было бы намного проще (и более безопасно) запускать контрольную сумму при каждом выполнении include() вместо удвоения количества строк для include() операторов.

Я немного искал и не нашел много. Идеи? Заранее спасибо!

Ответы [ 4 ]

0 голосов
/ 15 июля 2010

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

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

Тогда вы можете один раз проверить плагин, когда он установлен, и добавить его в список включенных плагинов, прежде чем его можно будет использовать.

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

0 голосов
/ 15 июля 2010

Подумайте над написанием оболочки для include:

function include_safe($library) {
    if(checksum_function($library))
        include($library);
}

Вы не найдете много разработчиков, которые были бы «рады» использовать подобные функции, но вы также не можете изменить язык PHPконструкции (например, include и require).Наличие функции, которая оборачивает все, удобно и быстро, поэтому разработчики, скорее всего, будут ее использовать.

0 голосов
/ 15 июля 2010

На многих платформах мобильного кода часто встречается исполняемый код, подписанный с помощью цифровой подписи RSA . Это позволяет полномочным органам «одобрить» фрагмент кода, который затем может быть распространен третьим лицам, и клиенты знают, что код безопасен. Цифровые подписи используются для предотвращения пиратства в современных консольных видеоиграх. Они также используются для проверки того, что обновление программного обеспечения было получено от поставщика, а не от злоумышленника.

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

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

MD5 очень плох. Если вы храните белый список «безопасных» хэшей файла md5, то это открывает дверь для генерации коллизий . Это идеальная ситуация для использования атаки префикса md5, потому что специально созданные двоичные данные в начале файла не помешают include() выполнить код в тегах php <?php ?>.

CRC даже хуже, чем md5 . CRC не предназначен для усложнения коллизий хешей. CRC предназначен только для обнаружения повреждений от случайного шума. Используя атаку, аналогичную md5, добавляя данные a к сообщению, можно создать коллизию CRC .

sha1 - это безопасная и быстрая хеш-функция, которую вы можете использовать. Существует похожая атака столкновения хешей, которая влияет на sha1. Однако в отличие от md5 никто не генерировал коллизию sha1, и NIST все еще считает его использование безопасным . Хотя sha256 будет более безопасным выбором.

0 голосов
/ 15 июля 2010

Если вы включаете классы, названные в честь определенной системы (например, MyPlugin_Text), вы можете использовать автозагрузку PHP . Автозагрузку можно использовать для автоматического включения файла при первом создании объекта класса.

Чрезвычайно упрощенный пример:

function __autoload($class_name) {

  require_once $class_name . '.php';
}

$myTextPlugin = new MyPlugin_Text(); 

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

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

Мне нравится твоя идея в целом. Однако вычисление контрольной суммы - например, использование crc32() - относительно дорого. Не должно быть слишком много и не слишком много включений, загруженных таким образом. Кроме того, само собой разумеется, что если злоумышленник может изменить файлы PHP в вашей системе, он также может выполнить их напрямую, не нуждаясь в вашем центральном приложении. Фактическое повышение безопасности этого упражнения, вероятно, будет небольшим.

...