• Взлом или развод?

    flapflapjack
    @flapflapjack
    на треть я прав
    Может ли злоумышленник, получив данные о списках таблиц так же получить и содержимое этих таблиц?


    В зависимости от степени экранирования символов при фильтре какого-то из параметров.

    По сути, скорее всего инъекция была сделана именно на вашем сайте, следовательно запрос выполнялся от имени вашего пользователя, у которого есть все права на БД - следовательно может и удалять и читать любые записи.

    Нужно как-то отследить место SQL-инъекции.

    Я в этом не спец, но например можно посмотреть лог mysql на наличие строки SHOW DATABASES или SHOW TABLES, а так же по поиску слова UNION, коим часто пользуются при создании инъекций. Найдя в логах время исполнения данного запроса можно глянуть в access.log у апача запрошенный адрес сайта, который был запрошен в то же время, что и инъекция в SQL.

    Имея точное расположение скрипта можно поставить вставки функции для логирования $_SERVER['REQUEST_URI'] и определить что за запрос был сделан, и от этого плясать.
    Ответ написан
    1 комментарий
  • Как допиливается Jira?

    @RedPM
    У Jira 2 версии: серверная, которую ставит чаще всего админ (хотя ничего сложного там нет) , и облачная - по подписке оформляется любым, кто в организации заведует бюджетом.
    Вангую, что "кастрированная" — это скорее всего облачная, хотя может и ненастроенная серверная просто.
    Первоначальную настройку обычно проводит всё тот же админ, а дальше - находится инициативный некто, кто собирает запросы с команд и пилит схемы экранов и workflow, цепляет pre- и post- триггеры, интегрируется с репозиториями, Slack-ами и прочими сторонними службами.
    В своей ПМ-ской практике пришлось освоить полный цикл (не то, чтобы это было офигенно сложно, но людей, которые это умеют/хотят делать и делают хорошо не так много, а работу команд мне нужно было организовывать многократно).
    Ответ написан
    1 комментарий
  • Как предотвратить спам через форму обратной связи?

    Zakonoposlushniy
    @Zakonoposlushniy Автор вопроса
    Решил проблему таким способом :
    В форму добавил поле
    <input id="check" name="check" type="hidden" value="" />

    Потом в кнопку, через которую идёт отправка, добавил
    onclick="document.getElementById('check').value = 'secretcode';"

    Вышло что-то вроде этого
    <button onclick="document.getElementById('check').value = 'secretcode';" type="submit">Отправить</button>

    И в php-обработчике, добавил это
    if ($_POST['check'] != 'secretcode') exit('Spam decected');


    Возможно кому-то поможет.
    Удачи!
    Ответ написан
    9 комментариев
  • Документация по Opencart

    XAKEPEHOK
    @XAKEPEHOK
    Аналогично, ничего не нашел, только вот доработка админки opencart'a у меня проблем не вызвала. Писал под себя несколько модулей и расширял базовые функции. Код там вполне нормальный. Архитектура MVC.
    Ответ написан
    3 комментария
  • Как удалить в папке всё, кроме определенной папки?

    Tortway
    @Tortway Автор вопроса
    cd /path/to/general; ls | grep -v 'dir-2' | xargs rm -rf
    Ответ написан
    Комментировать
  • Разве Composer бесполезен в 2017?

    search
    @search
    мама говорит что я особенный
    Композер - это, пожалуй, лучшее что произошло с пхп 5й версии.
    Валить или переубеждать тимлида - это по сути одно и тоже, если присмотреться. Просто демонстрация вашей неспособности брать на себя ответственность.

    Года 3 назад на моей прошлой работе в команду пришел очень толковый проактивный человек, который никого не стал переубеждать. Он просто стал делать правильные вещи. Без объяснений. И без приглашений. Коммитеть юнит тесты. Подключать линтеры. Деклайнить неудачные пулл-реквесты. В итоге он сам стал тимлидом где-то через год.

    Такие дела.

    Не у всех, правда, стальные яйца. Но за проактивность никогда еще не увольняли. Если вы уже создали пулл реквест, то "переубеждение" становится задачей тимлида.
    Ответ написан
    3 комментария
  • Насколько у меня правильный код ООП php?

    @D3lphi
    Здесь плохо всё, к сожалению.

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

    Класс SearchOrder у вас не только выполняет запросы, но еще и работает с данными, хранит состояние этих самых данных, фильтрует данные (strip_tags()). Непорядок. Это все нужно разделять. У вас вообще получаются какие-то богообъекты, которые умеют во все.

    Вы каждый раз повторяете строки с подготовкой запроса, биндингом параметров, отправкой запроса и тд. Не думали, что неплохо бы было написать какую-нибудь обертку и выполнять запросы как-нибудь так:
    $result = $wrapper->select("SELECT * FROM `tablename` WHERE `id` = :id", ['id' => 5]);

    ?

    Вы вызываете connect() в методах. То есть, каждый вызов этого метода будет приводить к установке нового соединения с базой данных, даже если оно уже было установлено. Соединение с базой данных это достаточно дорогостоящая операция.

    Зачем вы используете свойства, если можно обойтись обычными локальными переменными:
    $this->orderID = (int) strip_tags($orderID);
    $this->column = (string) strip_tags($column);
    $this->value = (string) strip_tags($value);

    ?

    Почему вы стриппите тэги у идентификатора? вы настолько не уверены в том, что влетает в функцию:
    strip_tags($orderID);
    ?

    Если вы не используете php 7 и, как следствие, скалярный тайпхинтинг, то должны делать проверки на тип входящего аргумента. Если что-то не так с типом, бросаем исключение (А не приводим его к нужному)! Например:
    if (!is_string($arg)) {
        throw new InvalidArgumentTypeException('string', $arg);
    }

    Это в идеале. Вы не обязаны это делать, конечно же. Но вот такие проверки делают приложение безопаснее. Хотя, опять же, повторюсь, в 2017 нужно начинать новые проекты на php 7.1+.

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

    Кроме всего прочего, почитайте про стандарты оформления кода. Вы им не следуете.

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

    Желаю успехов!
    Ответ написан
    1 комментарий
  • Какую ширину сайта рекомендуется делать в 2016 году?

    Serj-One
    @Serj-One
    i'm sexy and i know it
    Нужно понимать, что ширина сайта (именно контентной части) должна зависеть не от ширины монитора пользователя, а от удобства восприятия. Бегать глазами от одного угла экрана к другому пользователю попросту неудобно. Оптимальное решение - прежние максимальные 1200px для десктопа, и адаптив до 320px.
    Ответ написан
    Комментировать
  • Как сверстать блок со срезанным углом?

    @forgetable
    Node/Flutter/C++
    Не стоит делать Так

    Для подобных вещей лучше всего использовать svg и по ховеру применять к нему filter: shadow.
    Ответ написан
    3 комментария
  • Как сделать интерактивную карту?

    @imhuman
    SVG карту с нужным оформлением и маркерами можно сгенерировать тут pixelmap.amcharts.com
    Ответ написан
    Комментировать
  • Как сделать интерактивную карту?

    bootd
    @bootd Куратор тега CSS
    Гугли и ты откроешь врата знаний!
    svg. Дизайнер рисует тебе карту России в векторе и отмечает на ней точки, а дальше сам. Иначе ищешь векторную карту в интернете. Если на ней нет нужных точек, то открываешь карту в илюстраторе, рисуешь кружки в нужных местах,. Делов то!!

    Есть например такой сервис. Там есть разные карты. Я скинул карту РФ. Но она какая-то не полная, хотя я в географии не силён. Сам часто использовал эту карту
    Ответ написан
    Комментировать
  • Как теперь получить ссылку на mp3 при парсинге vk.com (Вконтакте)?

    @ImIeee
    Обновление.
    Выложил все файлы на Github — алгоритм шифровки, расшифровки, пример использования токена. Здесь будет только последняя версия кода расшифровки на PHP, в соответствии с вопросом.
    Обновление 2.
    Создал репозиторий с кодом получение токена VK, подходящего для Audio API, по GMS ID и GMS токену.
    Обновление 23.11.17
    Теперь адрес аудиозаписи, похоже, привязан к идентификатору пользователя ВКонтакте. Нужно указать его в коде.
    <?php
    
    define('VK_ID', ID_пользователя_в_виде_числа);
    
    function decode($str){
      $vals = explode("#", explode("?extra=", $str)[1]);
      $tstr = vk_o($vals[0]);
      $ops = vk_o($vals[1]);
      $ops_arr = explode(chr(9), $ops);
      $len = sizeof($ops_arr);
      for($i = $len - 1; $i >= 0; $i--){
        $args_arr = explode(chr(11), $ops_arr[$i]);
        $op_ind = array_shift($args_arr);
        switch($op_ind){
          case "v": $tstr = vk_v($tstr); break;
          case "r": $tstr = vk_r($tstr, $args_arr[0]); break;
          case "x": $tstr = vk_x($tstr, $args_arr[0]); break;
          case "s": $tstr = vk_s($tstr, $args_arr[0]); break;
          case "i": $tstr = vk_i($tstr, $args_arr[0]); break;
        }
      }
      return $tstr;
    }
    
    $vk_str = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMN0PQRSTUVWXYZO123456789+/=";
    
    function vk_o($str){
      global $vk_str;
      $len = strlen($str);
      $result = "";
      for($s = 0, $index2 = 0; $s < $len; $s++){
        $sym_index = strpos($vk_str, $str[$s]);
        if($sym_index !== false){
          $i = (($index2 % 4) !== 0) ? ( ($i<<6) + $sym_index) : $sym_index;
          if(($index2%4) != 0){
            $index2++;
            $shift = -2 * $index2 & 6;
            $result .= chr(0xFF & ($i >> $shift));
          } else {
            $index2++;
          }
        }
      }
      return $result;
    }
    
    function vk_s($str, $start){
      $len = strlen($str);
      if($len > 0){
        $cur = abs($start);
        $shuffle_pos = array();
        for($i = $len - 1; $i >= 0; $i--){
          $cur = (($len * ($i + 1)) ^ $cur + $i) % $len;
          $shuffle_pos[$i] = $cur;
        }
        for($i = 1; $i < $len; $i++){
          $offset = $shuffle_pos[$len - $i - 1];
          $prev = $str[$i];
          $str[$i] = $str[$offset];
          $str[$offset] = $prev;
        }
      }
      return $str;
    }
    
    function vk_i($str, $i){
      return vk_s($str, $i ^ (int) VK_ID);
    }
    
    function vk_v($str){
      return strrev($str);
    }
    
    function vk_r($str, $i){
      global $vk_str;
      $vk_str2 = $vk_str . $vk_str;
      $vk_str2_len = strlen($vk_str2);
      $len = strlen($str);
      $result = "";
      for($s = 0; $s < $len; $s++){
        $index = strpos($vk_str2, $str[$s]);
        if($index !== false){
          $offset = ($index - $i);
          if($offset < 0){
            $offset += $vk_str2_len;
          }
          $result .= $vk_str2[$offset];
        } else {
          $result .= $str[$s];
        }
      }
      return $result;
    }
    
    function vk_x($str, $i){
      $xor_val = ord($i[0]);
      $str_len = strlen($str);
      $result = "";
      for($i = 0; $i < $str_len; $i++){
        $result .= chr(ord($str[$i]) ^ $xor_val);
      }
      return $result;
    }
    
    echo decode($argv[1]);
    ?>
    Ответ написан
    93 комментария
  • Что использовать для проектирования и разработки REST API?

    https://github.com/swagger-api/swagger-codegen


    Server stubs: C# (ASP.NET Core, NancyFx), Erlang, Go, Haskell, Java (MSF4J, Spring, Undertow, JAX-RS: CDI, CXF, Inflector, RestEasy), PHP (Lumen, Slim, Silex, Zend Expressive), Python (Flask), NodeJS, Ruby (Sinatra, Rails5), Scala (Finch, Scalatra)


    Сами мечтаем интегрировать генерацию роутинга и DTO-шек по swagger-спецификации прямо в билд-процесс, но пока ещё не можем таким похвастаться)
    Ответ написан
    Комментировать
  • Что использовать для проектирования и разработки REST API?

    webinar
    @webinar Куратор тега PHP
    Учим yii: https://youtu.be/-WRMlGHLgRg
    Ответ написан
    Комментировать
  • Что использовать для проектирования и разработки REST API?

    @zatupok3000
    У нас проект на 100 000 человек в день, мы используем laravel, очень нравится.
    Ответ написан
    Комментировать
  • Можете посоветовать как быть дальше?

    @frozen_coder
    Java-developer
    "Хочу сделать основным Java" - очень расплывчато. Java - это инструмент для разных сфер: android, desktop, web. Я бы советовал в web - наиболее распространенная сфера; ванги говорят, что android-приложения уступят когда-нибудь своё место web. Ну это всё дело вкуса и чего ВЫ хотите. Итак, например, хотим в Java-web:
    1) А Вы уверены, что знаете Java? Может есть нюансы и маленькие пробелы? (пробежаться по Эккелю и Блоху, можно посмотреть статейки о подготовке к сертификации - много мелочей, неочевидностей раскрыто) Разобрать Java 8, особое внимание stream.
    2) Ок, Java SE знаете, а Java EE? Тут можно очень досконально не вникать на первых порах - фреймоворки нам помогут.
    3) Пошли Фреймворки и библиотеки - Семейство Spring: Core, MVC, Boot, Data, Security. Для ORM - Hibernate (можно вместе с Spring Data, можно вместо, посмотреть нужно). Для уменьшения болерплейта - Lombok.
    4) Для тестирования JUnit, потом посмотрите Spock Framework (тут мы знакомимся еще и с Groovy).
    5) Плавно переходим к клиенту. Тут нам Java становится мало. Вспоминаем html и css. Если не знаете JS - узнать. Дальше дело вкуса. Выбираем(пишем своё) библиотеку или модный фреймворк, изучаем пилим клиентскую часть. На этапе разбирательств с клиентом познакомиться(если вдруг чего не знали) с REST, http, https, http 2.0, webSockets, json, ajax что такое DTO.
    6) Для UI тестирования попробуйте Geb.
    7) WebServices! SOAP, Jaxb, SOAP MTOM.
    8) Можете попутно расширить кругозор по БД - попробовать вместо mysql postgres или NoSql базы.
    Вот это был примерный набор инструментов.
    Но главное - практика. Нужен свой учебный проект. Начинаете его делать - появляются проблемы - смотрите как такое можно решить существующими инструментами - тут же применяете теорию на практике.
    Предлагаю писать какой-нибудь корпоративный портал с каким-нибудь реестром, справочником и т.д. Включаем фантазию.
    Начните с малого - сам справочник-реестр с функциями CRUD - создать, прочитать, редактировать, удалить запись. Далее прикрутите систему прав и ролей пользователей(не все могут создавать, редактировать и тем более удалять). Добавьте работу с файлами - скачать, загрузить, экспорт в pdf и exel. Продолжайте накручивать своё приложение функционалом - личка и чат, доска объявлений, имитация отношений начальник - подчиненный (тайм-менеджмент, таск-менеджмент, сбор отчетов каких-нибудь по работе), уведомления (в почту, в системе, м.б. попробовать с смс), напишите другую маленькую систему и заобщайте их между собой по SOAP(например, другая система может читать из справочника и что-нибудь туда писать). Берите какое-нибудь гипотетическое предприятие (склад, магазин, автосервис, школа, больница, завод и т.д.) и представьте, что ему надо свой документооборот перевести в электронный вид и максимально автоматизировать бизнес-процессы.
    Короче, набирайтесь опыта и учитесь через практику, ставьте сами себе задачи и ищите пути их решения. Стажировка и работа вообще на первых порах дают мощный толчок в развитии. Не можете найти стажировку? Идите на собеседования, делайте тестовые задания - тут сразу все пробелы всплывут.
    Ответ написан
    3 комментария
  • Как правильно тестировать адаптивную верстку?

    webirus
    @webirus
    Тыжверстальщик! Наверстай мне упущенное...
    И все отлично работает, но когда дело доходит до реального телефона все плывет, самое больное - это шрифты они больше чем должны быть.

    Решение проблемы с увеличением шрифтов на мобильных устройствах.

    -webkit-text-size-adjust: none;
    -ms-text-size-adjust: none;
    text-size-adjust: none;

    А если у меня его нет? Так же, не буду же я при верстке каждый раз заливать сайт на сервер и чекать его с телефона.

    Используйте gulp.js, с установленным browserSync, который Вам дает локальный адрес сайта.
    Вводите на устройствах 192.168.0.xxx:3000 (адрес выдается browserSync'ом).
    И каждый раз при сохранении страницы или изменении файлов CSS или JS страница обновляется.
    Вы увидите все возможные косяки, не заливая сайт на сервер.

    Также browserSync можно использовать с установленных виртуальных машин с разными браузерами.
    У меня на столе стоит 2 монитора с разными разрешениями и ноут, подключенный по сети.
    Ответ написан
    24 комментария
  • Как лучше создать шаблон битрикса?

    alexyarik
    @alexyarik
    Битрикс разработчик
    1) по папке local - она больше нужна для командной разработки
    dev.1c-bitrix.ru/community/blogs/vad/8646.php
    2) Считается правильно создавать новый шаблон через создание шаблона в админке, но также вы можете его создать локально у себя и потом перенести архивом на хостинг.
    3) не важно что у вас за сайт, принцип разделения header и footer в битрикс не меняется. dev.1c-bitrix.ru/learning/course/index.php?COURSE_...
    Ответ написан
    2 комментария