• Возможно ли подделать переменную $_SERVER?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Я всегда в любых своих проектах использовал данные из массива $_SERVER напрямую.

    Использовать глобальные переменные - плохая практика. С точки зрения безопасности, тестируемости и надежности вашего кода. На счет суперглобальных: один раз при инициализации вашего приложения вытягиваете нужные для вас данные из них, проверяете и вставляете в некий объект Request, это уже данные, которым вы можете доверять, посему изменять их внутри Request нельзя. Посмотрите symfony.com/doc/current/book/http_fundamentals.html

    require_once $_SERVER['DOCUMENT_ROOT'].'/папка/файл.php'

    Так писать по нельзя. От слова "совсем".
    Используйте Composer. Подключение файлов вручную нужно только в точке входа (обычно это index.php). Опять же с точки зрения безопасности.
    Никто вам не гарантирует, что $_SERVER['DOCUMENT_ROOT'] будет правильным, да и то, что будет создан такой элемент - тоже не гарантирует.

    Исходя из этого возникает вопрос. На сколько это оправдано?

    Со всей силы оправдано.

    Но, что мне делать с массивом $_SERVER?

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

    Каким образом он может быть подменен или в него может быть вставлена инъекция?

    $_SERVER['DOCUMENT_ROOT'] = '/dev/null';
    
    require 'path/to/your/file.php';


    Если запустить скрипт из консоли - куча элементов $_SERVER просто не будут созданы, например QUERY_STRING

    Может быть NetBeans прав?

    Прав

    и действительно нужна обработка.

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

    Рекомендую почитать: Попросили проверить код, на что смотреть нужно?
    Ответ написан
    Комментировать
  • Как скачать базу иного сайта?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Пффф, легко!

    Устраиваетесь на работу в primer.com, подписываете NDA об не разглашении, получаете доступ к БД.
    Сливаете себе копию БД, выплачиваете primer.com штраф за нарушение NDA, согласно договору, что вы подписали. Профит.
    Ответ написан
    1 комментарий
  • Как правильно организовать продажу знаний?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Пфф, легко!

    Делаете канал на ютубе, записываете там базовый материал, распространяете бесплатно. Если человекам понравится - не вопрос, вот доступ на платный контент + консультации по скайпу + вэбинары. Пиаритесь в соц сетях + подключаете "сарафанное радио".

    Можете сделать небольшую акцию в школах: учу на халяву, но при условии, что потом отработаете N месяцев (возможно с доплатой).

    На счет "некоторых навыков по программированию" - обычно спецы так не говорят)). Я искренне надеюсь, что вы не являетесь жертвой эффекта Даннига-Крюгера
    Ответ написан
    Комментировать
  • Можно ли восстановить данные в MySQL?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    https://ru.wikipedia.org/wiki/E.164

    Восстановить не удастся, никак. То, что данные не валидируете перед работой с БД - печаль, будете умнее в следующий раз.
    Ответ написан
    Комментировать
  • Нужно ли запрещать git push origin master -f на уровне репозитория?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    История коммитов на то и история, что бы отображать все изменения в хронологическом порядке.

    нужно ли отключать возможность push'а с форсом?

    Git push должен быть запрещен, по своей сути - это Домоклов меч, только над головами всей команды.
    Несколько раз встречал форсированные пуши после не удачного ребейза. Один раз за коллегой пришлось восстанавливать 2-х недельную историю, не самое приятное занятие.

    Что у Вас делают если в мастера случайно попало что-то, чего там быть не должно?

    revert + комментарий в баг трекере о причине реверта.

    На прошлом проекте релизы были 1 раз утром и опционально днем. Релиз проводился в полу автоматическом режиме, ветки затягивались из багтрекера, а далее намердживались на мастер. В случае конфликта - автоматический реверт. В случае поломки сборки - ручной поиск виновника и ручной реверт.
    Форсированный пуш не нужен. Ребейз при этом не прижился.
    Да, факапы бывали, для этого и были опциональные релизы днем, что бы автор увидев свой косяк на проде мог в тот же день его асапно исправить.
    Ответ написан
  • Есть ли система, которая помогает выявить источник взлома (помимо стандартных логов)?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    сверено с исходниками - все чисто

    И в БД тоже? Я очень давно последний раз трогал MODx и на сколько помню там было в моде часть исходников хранить в БД.
    Надеюсь вы проверяли исходники не вручную? (в смысле через diff в вашей VCS + в БД)

    Есть мысли вынести сайты на уровень выше корня, оставив только точку входа

    Это первое, что нужно делать))

    Как вообще проводится поиск эксплойтов на сайте, если идей никаких нет?

    0 - Если у вас в публичном каталоге не одна точка входа, а весь проект - вы уже себе в ногу выстрелили
    1 - Ищутся CVE в багтрекере CMS
    2 - Проверяются плагины, установленные в системе, они тоже могут содержать уязвимости
    3 - Проверяется возможность загрузить и выполнить файл. Например на uploads (или как там каталог называется) права на запуск должны со всей силы отсутствовать
    4 - Проверяются открытые порты сервера (если наружу торчит mysql, redis, memcached, ... - тогда сами себе злобный буратино)
    5 - Ищутся все возможные точки с eval/include/require/include_once/require_once/exec/shell_exec/... для стороннего кода это потенциальная точка выполнения
    6 - Ищутся возможные sql инъекции по коду cms/плагинов
    7 - Ищутся всевозможные phpmyadmin и тому подобные сервисы, торчащие наружу
    8 - Если в коде активно юзаются глобальные переменные - это потенциальная дыра в безопасности
    9 - Если аргументы методов не проверяются - это тоже потенциальная дыра в безопасности
    10 - Вам стоит убедиться и в том, что отсутствует утечка изнутри. На одном проекте случайно нашел залитый бывшими сотрудниками phpspy
    Ответ написан
    3 комментария
  • Почему mongodb нагружает систему до 100%?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    подскажите куда копать и что делать!

    Для начала отследить, что его так грузит. Если виновник будет найден - простить и понять.

    Если не найден: разделяйте систему между несколькими серверами.

    15к пользователей

    Это rps, или постоянное количество открытых соединений?
    Ответ написан
  • Как выбрать js CMS с файловой базой данных?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Welcome to NodeJS))
    www.sitepoint.com/exploring-different-cms-solution...

    хранением базы данных в файле.

    Обычно так никто не делает. Есть СУБД и вы с ней работаете, а не с файлом.
    Ответ написан
  • Как PM может помочь Open Source? С чего начать?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Вариант А: на основной работе (только согласовав с высшим руководством) пролоббировать публикацию исходников ПО, которое не влияет на бизнес.
    Вариант Б: включиться в развивающийся проект и там пролоббировать публикацию не бизнесовых подсистем.
    Вариант В: искать команду, которая хочет в OS но при этом без менеджера.
    Вариант Г: начать собственный проект, решающий конкретную бизнес задачу с расчетом на публикацию исходного кода + искать однодумцев.
    Вариант Д: тоже, что и [Г], только не однодумцев, а людей за денюшку.
    Вариант Е: вот вы пользуетесь неким СПО? Если есть идеи как улучшить, замечены ошибки и т.д. - пишите об этом в баг трекер разработчика.
    Ответ написан
    1 комментарий
  • Еще раз о ActiveRecord vs. DataMapper, есть ли связи в DM?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Комментировать
  • Как реализовать модульность?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Golang по умолчанию компилируется в 1 бинарь. Да, можно подключать shared либы, да можно собирать, но язык заточен не под это.
    Что бы подключать функционал - гуглите на тему "golang unsafe", "golang load dynamic library". Но вообще говоря - это со всей силы не golang-way.

    каждый модуль использовать как микросервис

    вполне вариант

    представить не могу как расширить функцию парсинга команд

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

    Если же вы хотите нечто эдакое сделать с помощью отдельных микросервисов - потребуется как минимум еще один, который будет распределять действия между остальными. Например через сервер очередей, либо rpc. В любом случае протокол общения между сервисами вам придется спроектировать. А если запуск через консоль - это еще один клиент. Грубо говоря эта штука может выглядеть так:

    [client] <-??-> [client-app] <-rpc|queue|...-> [main-server] <-rpc|queue|...=>[modules]
    Ответ написан
    5 комментариев
  • Поясните про фронтенд и бэкенд?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Как делается взаимосвязь между фронтендом и бэкендом?

    По протоколу HTTP, как транспортному + протоколу общения (API) клиент-сервер конкретно под ваши нужды. Последний вы делаете сами.

    как правильно делать бэкенд, в виде отдельных скриптов или в виде сервиса?

    )) про это книги в N томов пишут, вы правда считаете, что получите полный ответ в виде короткого комментария?

    Серьезно, хотя бы язык укажите, на котором собираетесь бэк писать.
    Ответ написан
    8 комментариев
  • Как сделать инклуд разных php файлов при обновлении страницы?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Ответ написан
    Комментировать
  • Как не попасть в спам ловушки при рассылке писем пользователям?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    не отправлять спам
    Ответ написан
    Комментировать
  • Как настроить окружение для веб-разработки?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Для php web разработки must have:
    - vagrant: https://www.youtube.com/watch?v=3WldiUHkFnw
    - phpStorm
    - git

    И как заливать изменения в проекте на сервер? С помощью GIT?

    Есть много подходов, git pull - один из них. Все зависит от проекта, серверной архитектуры и требований к безопасности.
    Ответ написан
    7 комментариев
  • От чего зависит скорость компиляции?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Скорость сборки в большей части зависит от правил сборки. Можно даже на отличном железе сделать медленную фигню. Очень критично - не пересобирать то, что этого не требует. В остальном - да, cpu.
    Ответ написан
    Комментировать
  • Как инициализировать свойства типа Объект в trait'ах PHP или существует ли возможность регистрации нескольких __construct методов в очередь?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Концепция с дефолтным объектом - это хреновая затея. Подключение к БД вы например как в свойстве класса сделаете (не объекта)?

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

    На счет вашего примера работы с БД: вам трейты тут не нужны, от слова "совсем")). Расширьте ваш Query методами, что вы хотите пихать в трейты. Класс Select вам тоже не нужен, добавьте его функционал как метод в Query. Если я правильно понимаю Query - это объект с состоянием, который в результате должен суметь создать SQL код, дык добавьте в него еще метод getSQL().

    Обратите внимание на защиту от SQL-инъекций. Что будет, если вызвать ваш Select так:

    <?php
    
    $query = new Select(
        [
            'table'  => "1;DROP TABLE products;",
            'fields' => [],
        ]
    );


    Вообще говоря: если цель понаучаться - дерзайте, если таки дело делаете - используйте Doctrine2, не стоит терять время для поделку, которая 99.99% будет хуже существующих аналогов.

    Очень вам рекомендую, почитайте PSR-2

    Чуть не забыл:

    Как инициализировать свойства типа Объект в trait'ах PHP?

    В классе, который подключает трейт, на прямую, или через вызов метода из трейте.
    Ответ написан
    Комментировать
  • Как ждать входящих данных в PHP?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Ответ написан
    Комментировать
  • Нормально ли проверять одни и те же данные по десять раз?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Проверять данные в каждом методе - это вполне отличная практика, по сути это соблюдение интерфейса метода.
    Но возвращать при этом null/false - практика хреновая, если ваш метод на вход требует int, а получил array - надо бросать исключение. Так вы будете знать, что внешний код, который использует ваш метод работает не корректно.

    Для объектов настоятельно рекомендую использовать type hinting:

    public function test(MyObject $object, $id)
    {
        if (!is_int($id)) {
            throw new \InvalidArgumentException('Argument "id" must be int');
        } elseif ($id < 0) {
            throw new \InvalidArgumentException('Argument "id" must be positive');
        }
    ...


    Если пишете на семерке, то и для скаляров и на вывод - тоже стоит указывать type hinting. Правда с выводом не всегда это можно делать, например возврата null, или что-то еще.

    public function checkPositive(int $intData): bool

    Для сокращения проверок можете мой пакет заюзать https://packagist.org/packages/ko-ko-ko/assert, он спроектирован под максимальную производительность и использование в каждом методе.

    Стоит ли продолжать заморачиваться с проверкой передаваемых данных в каждой функции?

    Да. За счет этого вы выигрываете в безопасности, надежности и времени поиска багов.
    Ответ написан
    8 комментариев