Nano Hash - криптовалюты, майнинг, программирование

Каков эффективный способ создать безопасную область переменных во включаемом файле PHP?

Вот очень упрощенный пример настройки:

включает/form.php

$secret_var = 'Mind blowing secret';
return '<form></form>';

страница.php

echo include('includes/form.php'); // Notice the unusual way of including
echo $secret_var;

Результат

<form></form>
Mind blowing secret

Как видите, я не возвращаю $secret_var, но он все еще открыт!

Каков наиболее эффективный способ создать область действия для всех переменных в этом includes/form.php, чтобы они автоматически отключались PHP?

Конечно, я знаю, что могу запустить unset($secret_var);, но есть много форм с множеством переменных в каждой, и разные разработчики постоянно их меняют. В долгосрочной перспективе этот метод будет означать 100% вероятность ошибок. Мне нужно сделать это как-то автоматически (как переменные внутри функции), но в данном случае без использования именованной функции (файл может быть включен более одного раза). Также крайне важно оставить код внутри page.php без изменений, так как это будет означать множество изменений в системе.

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

03.08.2013

  • Тогда не include так ;-) Почему это, по-видимому, не вариант? 04.08.2013
  • +1 к delnan - я сам сбит с толку, почему нормальная форма табу! 04.08.2013
  • Это было сделано с целью вернуть сгенерированный HTML, вместо того, чтобы напрямую повторять его или создавать новую переменную внутри каждого form.php. Потому что иногда повторно используемая форма сначала объединяется с другим HTML и только потом эхом. надеюсь понятно.. 04.08.2013

Ответы:


1

Вместо

echo include('includes/form.php'); // Notice the unusual way of including
echo $secret_var;

использовать

echo call_user_func(function(){
    // secret var's scope is only valid in this block...
    // while the return '<form></form>'; is... returned.
    include('includes/form.php');
});
echo $secret_var;

и посмотреть, как это происходит.

PS: Не echo include. Это означает echo bool;, а не возврат в нем.

PPS: И вы не используете включения должным образом, как это и предполагалось... но я даже не собираюсь начинать с этого.

03.08.2013
  • Да! Чтобы оставить page.php без изменений, я могу обернуть все внутри include/form.php в call_user_func() и вуаля! Оно работает! Спасибо. О вашем PS: Почему он работает, если он неверен? И как тогда сделать эхо правильно? Нравится это echo (include('includes/form.php')); ? О PPS: Есть ли у него известные недостатки? или просто редкость? 04.08.2013
  • @Alph.Dev include() — это функция. То, что находится в файле, выполняется, но само возвращает значение bool. Так что не стоит повторять это. Если это сработало здесь, то только из-за странного способа, которым вы используете include. Не рекомендуется ставить return в include. Это 99% гарантированный способ возникновения проблем, которые очень трудно отследить позже, поскольку код после include() не будет выполняться. returns входят в функции. возвраты не включаются. Это хак, а не правильный :) 04.08.2013
  • Провел еще несколько исследований на эту тему. Из руководства по PHP ссылка Можно выполнить оператор return внутри включенного файла, чтобы завершить обработку в этом файле и вернуться к сценарию, который его вызвал. Кроме того, можно возвращать значения из включенных файлов. Вы можете использовать значение вызова include так же, как и для обычной функции. Это звучит достаточно надежно. Единственное ограничение касается удаленных файлов, но мы не будем их использовать в этом проекте. 04.08.2013
  • Возможно, это что-то новое. Я старый пес, как только я правильно выучу трюк, я буду его придерживаться :) Я использовал его с require и return прервал поток файла, который required он . Но я этого не делаю, потому что функции существуют именно по этой причине. Объявите функцию или несколько во включении и используйте ее. Как будто это предназначено. Есть много хакерских/сомнительных вещей, которые вы можете делать во время программирования, но вы не должны этого делать. --- Мама, МОГУ я курить? МОЖНО , НО НЕ МОЖЕТЕ :) 04.08.2013
  • Возможно, вы не написали дерьмовое включение, но вам придется с этим смириться. 15.10.2015
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

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

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

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..