• Адекватная ли фильтрация POST данных?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    ну, эта ваша защита от ничего))

    <?php
    
    use Symfony\Component\HttpFoundation\Request;
    use Symfony\Component\HttpFoundation\Response;
    
    class InvalidRequestParam extends \InvalidArgumentException
    {}
    
    class MyController
    {
        /**
         * @param Request $request
         * @return Response
         */
        public function myAction(Request $request)
        {
            try {
                $intPostParam          = $request->request->get('intPostParam');
                $unsignedIntPostParam  = $request->request->get('unsignedIntPostParam');
                $md5GetParam           = $request->query->get('md5GetParam');
                $optionalDigitGetParam = $request->query->get('optionalDigitGetParam');
    
                if (is_null($intPostParam)) {
                    throw new InvalidRequestParam('"intPostParam" is required');
                } elseif (!is_numeric($intPostParam)) {
                    throw new InvalidRequestParam('"intPostParam" must be numeric');
                }
    
                if (is_null($unsignedIntPostParam)) {
                    throw new InvalidRequestParam('"unsignedIntPostParam" is required');
                } elseif (!ctype_digit($unsignedIntPostParam)) {
                    throw new InvalidRequestParam('"unsignedIntPostParam" must be digit');
                }
    
                if (is_null($md5GetParam)) {
                    throw new InvalidRequestParam('"md5GetParam" is required');
                } elseif (!preg_match('/^[\da-f]{32}$/', $md5GetParam)) {
                    throw new InvalidRequestParam('"md5GetParam" must be correct md5 hash');
                }
    
                if (!is_null($optionalDigitGetParam) && !ctype_digit($optionalDigitGetParam)) {
                    throw new InvalidRequestParam('"optionalDigitGetParam" must be digit or null');
                }
    
                // Тут ваша бизнес логика
    
                return new Response('All params correct');
            } catch (InvalidRequestParam $e) {
                return new Response($e->getMessage(), Response::HTTP_BAD_REQUEST);
            } catch (\Throwable $e) {
                return new Response('Some thing went wrong', Response::HTTP_INTERNAL_SERVER_ERROR);
            }
        }
    }
    Ответ написан
  • Стоит ли привлекать к защите домашних данных виртуальные машины?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Для разработки и экспериментов - это вполне хороший подход. На счет всей остальной деятельности - похоже на паранойю, у вас входной ip все равно общий.
    Правда эту паранойю можно немножко развить, если ваши виртуалки будут:
    * разбросаны по миру
    * не будут содержать информации о вас
    * не будут содержать информации друг о друге
    * в случае попытки взлома будут самоуничтожаться на уровне железа (например с помощью промышленной пиротехники)
    * вы будете пользоваться ими с разных мест разными "однодневными" устройствами
    * пользоваться разными защищенными каналами связи
    * для сообщений будете использовать элементы стеганографии.
    Вот в этом случае вас раскрыть будет довольно трудоемко и дорого.

    -- --

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

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Не надо писать вообще-вообще все)) Если вы хотите расти в направлении ASP.NET то зачем вам возможные предложения связанные с Matlab и PowerPoint?
    С точки зрения работодателя:
    1. Если резюме расписано на NM лет опыта, но пофакту 0 - это очень подозрительно.
    2. Если опять же очень-очень много всего, "расплывается" образ соискателя, в смысле: абсолютно не ясно на каком уровне, что он знает и чем собирается заниматься. Это даже при том, что вы укажете уровень знаний.
    3. Проекты на гитхабе - это большой плюс, это значит, что соискатель умеет в git, если еще бейджиков с тревиса и т.д. налепите - тоже будет плюсом, соискатель умеет в тестирование своего кода.

    Первая работа у вас в любом случае будет для получения опыта и роста, так что не надейтесь на высокий оклад, если рядом с вами будут крутые спецы - ваш рост будет быстрее. Это вы можете узнать на собеседовании и на испытательном периоде (ИП - это как для соискателя, так и для компании). Если вас посадят одного на проект - это плохо, вам не у кого будет учиться.
    Недавно слышал про такую фигню: "тестовый период не оплачивается", если вам такое скажут - попрощайтесь и закройте за собой дверь.
    Ответ написан
    Комментировать
  • Как и где можно получить хороший стиль программирования на PHP?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Читать: Макконнелл "Cовершенный код"
    Учить: Symfony
    НЕ учить: Laravel (почему читаем тут, ответ господину regretful)
    Если будете следовать требованиям выше в ссылке - рост будет быстрее
    Ответ написан
    Комментировать
  • Адекватный ли способ защиты админки?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Защита на глобальных переменных - это не самая хорошая идея. В любой точке кода строка
    $_SESSION['admin'] = 1;
    отключит ее.

    В своей практике наталкивался на случаи, когда даже сами сотрудники добавляют в uploads вредоносный код, под видом невинных файлов (я уже молчу про анонимусов, которым захочется вас взломать). А в вашем случае взлом будет еще и нереально легким.
    -- --
    Контроль доступа как правило имеет смысл делать в экшнах, а не в конструкторе контроллера.
    -- --
    echo $e->getMessage(); - вот это плохая идея. Не выводите клиенту текст исключения, прописывайте его явно. Что будет, если словите исключение с куском SQL? Будете показывать структуру вашей БД кому попало?
    -- --
    Бросание исключения после редиректа обычно бессмысленно. Вы уже знаете ответ для клиента, завершайте процесс.
    -- --
    Кстати, фатальные исключения - это не круто, это признак говнаря, не делайте так.
    Ответ написан
  • Как противодействовать воровству контента?

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

    Не публиковать, увы только так.

    Вдумайтесь: вы отдаете клиенту ваш контент (при скачивании он уже делает копию), что бы тот его посмотрел, и при этом не хотите, что бы он его копировал, не находите противоречий?

    Цель любой защиты - сделать взлом не выгодным, не более того.

    Можете конечно выводить в виде не удобном для копирования, например в виде svg-шки, сгенерированной на сервере c кривыми, вместо текста. Да, копирование текста это затруднит, но от принтскрина + распознавания символов - не спасет.

    Для видео - можно использовать потоковое вещание, например на базе rtmp, но от записи с экрана - не спасет.

    В общем тот, кому надо скопировать - это сделает, тот кому не надо - не будет париться.
    Ответ написан
    Комментировать
  • Как убедить клиента заказать сайт в кризис?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Вы наверняка провели детальный анализ прибыли, которую приносит сайт к тому же вы рассчитали прибыль, которую принесет ваша переделка, раз так говорите. Дык в чем тогда проблема? Покажите результаты вашего анализа и прогноза заказчику, он сразу заключит с вами контракт.

    Если же анализа нет - ваши заявления с точки зрения заказчика выглядят так: "ссышь, паря, дай денег!"
    Ответ написан
    5 комментариев
  • Какими знаниями должен обладать Middle и Senior php developer?

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

    Что ж - тогда нужно столкнуться. Мидл отличается от Джуна не некими "мистическими знаниями", а опытом решения не стандартных задач.

    Что касается используемых фреймворков вами - чем раньше перейдете на Symfony - тем быстрее вырастите. Безусловно, для своих задач yii - не плох, но это средне-маленькие проектики, для больших - это скорее плохой выбор, чем хороший (экспоненциальное разрастание моделей в случае больших команд - это убийственная практика). Kohana на пару с CodeIgniter - вообще учат тому, как писать не стоит((

    Собственно чего я набросил на kohana?
    1. Фреймворк не должен меняться, и не должен быть "в перемешку" с вашим кодом. Слишком велик соблазн что-то поменять во фреймворке. Как следствие - обновление части кода с фреймворком усложнится.
    2. Явная инициализация всех подсистем проекта при загрузке. Зачем? Велика вероятность, что вообще все что там на каждый запрос не нужно.
    3. Больше автолоада богу автолоада. Есть принятые стандарты PSR-0 и PSR-4, используйте их. Поймете зачем нужны неймспейсы. А кукули типа My_Very_Perfect_Controller - это практика 2000-х.
    4.
    <?php defined('SYSPATH') or die('No direct access allowed.');

    Эта защита имеет смысл только в случае, если ваш код в публичном доступе, чего вообще-то быть не должно. По хорошему в публичном каталоге должен быть только один исполняемый php файл index.php
    5. Статика - это путь к бесконтрольной связности проекта. Код с ее использованием тяжело поддается тестированию и изменению.
    6. ActiveRecord для больших проектов - это самоубийственная практика, увы. Передавая модель куда-то вы передаете не только данные, но и подключение к БД. Как следствие код, который со всей силы не должен иметь возможность делать запросы к БД - может это делать и будет.

    Почитайте на досуге Попросили проверить код, на что смотреть нужно?
    Ответ написан
    1 комментарий
  • Можно ли написать балансировщик на PHP?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    php для балансировки отдачи файлов... это хреновая затея, это ж stateless язык! А вот для контроля доступа, но балансировкой nginx-ом - это норм. Файлы можно шардировать через mogilefs, через php вытягивать урл шарда, а отдачу производить уже nginx-ом через X-Accel-Redirect
    Ответ написан
    Комментировать
  • PHP | Что по вашему мнению не так в функции получения IP пользователя?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    @ - это плохо, очень. используйте array_key_exists + валидация по типу. В глобальных и суперглобальных переменных может быть что угодно((
    Ответ написан
  • Почему форматирование по стандартам code style в PhpStorm и eclipse разное?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    PSR + дополнительные соглашения, не противоречащие PSR.
    Pear - стандарт как и сам подход с либами уже устарел, не стоит его ворошить.

    При внедрении CS - быть демократии не может. Если код не проходит проверку - не вливается.
    Код ревью пост фактум - это практика, которая ни к чему не приведет, не повторяйте чужих ошибок.

    На счет IDE: все равно в чем пишет программист, хоть в vim. Если проверка через PHP_CodeSniffer не проходит - ветка не будет вмерджена до исправления, увы, только так. Иначе - на ваш код стайл будет класться вооотакенный таёжный прибор.

    У того же phpStorm очень гибкая система настройки CS, которую можно спокойно распространить по компании.
    Ответ написан
    Комментировать
  • Как правильно и грамотно писать код?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Например, всегда думал как разделить html от php...

    Смотрите Twig, Smarty.

    Без использования фреймворков конечно.

    Данное утверждение как правило не имеет смысла. Фреймворк - это скелет вашего приложения и далеко не факт, что вы сможете написать лучше.
    Смотрите Symfony.

    Что-что, а вправлять мозг этот фреймворк умеет, оч. рекомендую. Ну и книжки типа Макконнелла "Соврешенный код" почитайте.
    Ответ написан
    Комментировать
  • Что такое микросервис?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Микросервис

    Система с фиксированным API (чаще всего сетевым), с "отдельной самодостаточной функциональностью".

    Сервис

    Сервис - это некий обособленный конкретный функционал. Может быть встроенным, может быть и микросервисом.

    Система

    Набор сервисов с некой общей обвязкой, представляющий собой нечто единое.

    Крупнота проекта зависит от требований к проекту и выделенным ресурсам. Это довольно абстрактные разделения.
    Ответ написан
    5 комментариев
  • Как разместиться правильно на github?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    1. вместо /v1.0/ используйте теги гита
    2. test | tests | ... - обычно это каталог для авто тестов
    3. build | release | ... - это каталоги для собранных (релизных) файлов, тот же jquery.min.js например
    4. external | vendor | ... - каталоги с внешними зависимостями текущего проекта
    5. src | lib | ... - сам код проекта
    6. bin - каталог с исполняемыми файлами для проекта
    7. var | tmp | ... - каталог для временных файлов
    8. Makefile - настройка для консольной утилиты make
    9. bower.json - зависимости bower
    10. package.json - зависимости npm
    ...

    Видите ли, сейчас одно-файловые скрипты особо никто не пишет (не берем в расчет тривиальные на полторы строки).
    Ответ написан
    Комментировать
  • Как некоторые файлы php хранить на отдельном сервере?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    На отдельных серверах в контексте php хранятся отдельные web сервисы, а не php-файлы.
    Если вам нужно именно файлы:
    - для скачивания и отдачи, как обычные файлы: бросаете линк на них, права 0644 и на всякий случай серверу запрещаете выполнять php.
    - для включения через require/include: ОЧЕНЬ ХРЕНОВАЯ ИДЕЯ. Подключив сетевую файловую систему вы себе яйца отстрелите, причем разрывными патронами.
    - для включения через file_get_contents+eval: ни чем не лучше предыдущей, любой мидл увидев это первым делом выпилит, как дыру в безопасности.

    оффтоп: переходите на нормальный фреймворк, мир давно не инклудит файлы руками, а юзает composer))
    Ответ написан
    Комментировать
  • Взлом сайта, как понять почему так происходит?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    С чем это может быть связано?

    Вас взломали.

    Какие промахи в безопасности такое производят?

    Вопрос из серии: "что я сделал не правильно?".
    Это могут быть:
    * доступ на основе популярных логинов/паролей
    * похищение пароля админа, через XSS
    * слабо защищенный FTP/SFTP
    * SQL инъекции
    * загружаемые файлы имеют право на выполнение
    * загружаемые файлы могут быть включены в основной код
    * сайт на CMS со включенным debug режимом
    * встречал случаи взлома "изнутри" когда взломщиком является коллега
    * возможно взломали на самом деле хостера, а вам просто не повезло
    * наружу торчат открытые порты доверенных сервисов: mysql, memcached, redis,...
    * ...

    Смотрите логи, может что полезное будет
    Ответ написан
    Комментировать
  • PHP, или как не научиться неактуальному?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    как возобновить обучение, но использовать все новые функции, а не продолжать читать про богом забытый PEAR?

    Не читайте про PEAR, смотрите пакеты на https://packagist.org/

    Где искать самую актуальную литературу?

    php.net

    Чьи видеоуроки смотреть, пусть даже с самого начального уровня, но с учетом всех нововведений PHP 7?

    Ни чиьи, про самое новое пишут статьи обычно. Читайте https://habrahabr.ru/, парни из Zfort делают вполне не плохие дайжесты https://habrahabr.ru/company/zfort/
    Ответ написан
    Комментировать
  • Как загрузить сразу все изображения в одно поле в БД?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Вы пытаетесь отстрелить себе яйца, причем разрывными патронами((

    1. explode - для работы с "прогнозируемыми" строками вполне норм, у вас же файлы, могут быть вообще бинарные, например картинки. В случае попадания на delimiter посреди файла - получите кучу мусора. "explode" в смысле "взрыв" - это очень подходящее слово.

    2. В БД хранить файлы - не хорошо, вы будете ушатывать БД просто так. Самое интересное - как вы бэкапы планируете делать)) Объемы будут расти очень быстро.

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

    4. Отдача файлов, вот тут тоже веселье: допустим получив мега строку вы разделите ее на куски и вытащите таки свой заветный файл, потом будете отдавать его через echo, это будет на порядок дольше, чем через web сервер на прямую.

    5. Память на php: что будет, если ваша мега строка занимает 500мб? PHP с настройками по умолчанию сдохнет, даже не дочитав его.

    В общем: для хранения файлов используйте БД специально спроектированную для хранения файлов. Это файловая система. Если очень хочется шардирования для снижения нагрузки - можете посмотреть в сторону решений на базе mogilefs.
    В MySQL при этом стоит хранить только нужную дополнительную информацию о файле, например: путь, md5, некий идентификатор,...
    Сам файл лучше при сохранении приводить к такому виду:
    1. Берем md5 хэш от файла md5_file, допустим он у нас получился 01230000000000000000000000000000
    2. Перемещаем его в каталог: {UPLOAD_ROOT}/01/23/0000000000000000000000000000. Тут смысл в том, что при большом количестве файлов в одном каталоге будут проблемы с файловой системой по части производительности. В принципе можно оставить оригинальное расширение, тогда шаг 4 не нужен.
    3. В БД храним md5 хэш, путь к файлу и MIME-тип, можно еще и оригинальное имя.
    4. При запросе на вашу страницу - отдаем через x-accel-redirect, или x-sendfile
    Ответ написан
    2 комментария