• Можно ли заменять в SQL запросе ' на "?

    FanatPHP
    @FanatPHP
    Помогаю и новичкам, и старичкам
    Эти функции - какой-то ужас, летящий на крыльях ночи. mysql_real_escape_string - вообще за гранью добра и зла.

    Но главное, что я не могу понять - это какое отношение к mysql и mssql имеет функция xss_clean. Ну то есть я даже представить себе не могу, как можно функцию для защиты от xss применять для любых манипуляций c SQL. Это - я не знаю - как положить деньги в презерватив от грабителей. Он же служит для безопасности. Ну вот деньги и будут в безопасности.

    По теме: ради всего святого, используйте PDO с подготовленными выражениями. Это сделает ненужной всю эту мышиную возню с регулярками. PDO поддерживает как mysql, так и mssql, так что разница будет только в синтаксисе запросов, а сам код работы с запросами будет один и тот же

    $sql = "SELECT TOP 10 * FROM user where mssql.department_id=?";  
    $stmt = $conn->prepare($sql);  
    $stmt->execute([$_GET['department_id']]); 
    $users = $stmt->fetchAll();
    
    $sql = "SELECT * FROM user where mysql.department_id=? LIMIT 10";  
    $stmt = $conn->prepare($sql);  
    $stmt->execute([$_GET['department_id']]); 
    $users = $stmt->fetchAll();


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

    От XSS же надо защищаться совсем в другом месте, и также без всего этого ужаса
    Ответ написан
    1 комментарий
  • Как увеличить лимиты открытых файлов(сокетов) для go программы?

    opium
    @opium Автор вопроса
    Просто люблю качественно работать
    В итоге выяснилось что это дефолтное ограничение, которое накладывается systemd
    В скрипте запуска сервиса надо прописывать

    LimitNOFILE=200000
    LimitNPROC=200000
    Ответ написан
    Комментировать
  • Что за очень странное поведение?

    Поведение как раз не странное. Вот что бывает, когда над итерируемым объектом совершают какие-то преобразования.
    div.children - это NodeList, вы его меняете внутри forEach, и сбиваете итератор тем самым.
    Чтобы этого не происходило нужно получить объект класса Array и выполнять итерацию уже по нему.
    Чтобы это сделать можно использовать либо Array.from, либо Array.prototype.slice.call(div.children)
    Ответ написан
    Комментировать
  • Как создать такого бота в вк?

    @MrGaunt
    Есть готовый конструктор ботов с массовой рассылкой, фильтрами, ответами на команды.
    Ответ написан
    Комментировать
  • Как реализовать PHP (phalcon micro) + angularJs?

    Два репозитрория, два отдельных приложения, отдельно бек, отдельно фронт. Nginx может из корня отдавать статику для фронта, а для бека сделайте поддомен api.local.com и проксируйте тем же нгинксом то, на чем у вас PHP поднят (apache + PHP)
    Ответ написан
    Комментировать
  • Как правильно генерировать псевдослучайные числа?

    kumaxim
    @kumaxim
    Web-программист
    Судя по Вашему комментарию к ответу Ivan Sokolov Вы несколько не понимайте суть своего же вопроса.

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

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

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

    Возьмем, например, функцию rand() из любого языка программирования. Она будет генерировать псевдослучайное число основываясь на метки времени в unixtime. На сколько она предсказуема? Хм, думаю не менее чем на 100%. Хорошо, получается что зная приблизительное время запуска функции rand(), скажем, с точностью до 1 минуты, мы можем получить точно такое же псевдослучайное число. Отлично, т.е. вот от этого нужно и копать.

    Давайте предположим, что мы вытянули список компаний из ЕГРЮЛ по Москве и взяли их ОРГН. Далее, наша функция генерирует unixtime и из него мы вычитаем этот самый ОГРН, причем последние две цифтры в unixtime и ОГРН должны совпадать(к примеру, условие выбора ОГРН может быть любое). Чего мы добились? Зная время работы функции rand() мы не можем сгенерировать второе точно такое же псевдослучайное число. Вы мне можете сейчас возразить, что давайте возьмем тот же ОГРН и повторим процедуру. На этом месте я хочу задать Вам вопрос: а от кого мы вообще строим защиту? Злоумышленник является создателем системы и знает о ней 100%? Я думаю любая защита в этом случае просто бессмысленна.

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

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

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

    xmoonlight
    @xmoonlight
    https://sitecoder.blogspot.com
    Обязательно - не надо ничего кэшировать.
    Дополнение от dimasmagadan : Не забываем про настройку сервера для того, чтобы браузер клиента мог сам кэшировать страницы.

    В идеале, кэшировать надо данные ВСЕХ функциональных блоков, зависящих от входных параметров.
    К ним относятся:
    1. SQL-запросы и ответы
    2. поиск по любой структуре данных и результат этого поиска
    3. файловая структура, находящаяся по определённому пути
    4. данные, полученные для каждого из блоков представления ("список", "выборка", "статистика" и т.д.)
    5. сформированный шаблонизатором контент на основе GET-параметров

    Всегда кэшируйте первым тот блок, который занимает больше времени при обработке данных и т.д. по нисходящей.
    Первые претенденты на кэширование, как правило: блоки с пунктами 2, 3 и 5.

    Дополнение от Алексей Уколов :
    Кеширование - это большая боль для разработчика, на самом деле. И "не надо кешировать" - это именно с этой точки зрения. Любой кеш усложняет приложение в разы, потому что его нужно инвалидировать, обрабатывать ошибки и т.п. Но часто без него не обойтись, это факт.
    Ответ написан
    7 комментариев
  • Как передать id страницы в JavaSript?

    @Vovchikvoin
    Только в hidden инпуте ни каких мета тегов и переменных в js
    Ответ написан
    Комментировать
  • Как передать id страницы в JavaSript?

    atis2345
    @atis2345
    PHP developer
    1. Глобальная переменная на странице
      var pageId = 1;
    2. В форму которую отправляет ajax добавить инпут
      <input type="hidden" name="page-id" value="1"/>

    Правильней было бы в инпуте. Не зачем в глобальную область видимости id страницы пихать
    Ответ написан
    Комментировать
  • Как реализуется кэширование поиска?

    xmoonlight
    @xmoonlight
    https://sitecoder.blogspot.com
    Поиск делится на 2 вида: статический (поиск по чёткому совпадению) и динамический (поиск по нечёткому совпадению).
    Выполняем в 2 этапа:
    1. Сначала - выполняйте поиск по четкому совпадению, (int,boolean) =>
    [список параметров: int,bool & etc.]=>ID:кэш1
    2. Затем из этого списка - ищите по нечёткому (varchar). =>
    varchar +ID:кэш1=>ID:кэш2
    Теперь если текстовый поисковый запрос не менялся, а менялись только настройки - поиск выполняется через обратный реверсивный поиск и если такую комбинацию уже кто-то искал (она есть в кэше1), то результат будет практически моментально получен.

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

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Достаточно $(".tags_cloud div").removeClass("is_active");
    Определить, сколько div'ов имеют класс is_active можно $(".is_active").not("#all-tags").length
    Ответ написан
    Комментировать
  • Для чего предназначен этот код?

    kimono
    @kimono
    Web developer
    function(e) {
      // отменяем привычное действие ссылки
      e.preventDefault();
      // добавляем класс loading
      $(this).addClass("loading");
      // переменной confirm_text присваиваем атрибут ссылки "Выход" с именем data-confirm или false
      var confirm_text = $(this).data("confirm") || false;
      // переменной method присваиваем атрибут ссылки "Выход" с именем data-method или get
      var method = $(this).data("method") || "get";
      // берем адрес ссылки для выхода
      var url = $(this).attr("href");
      // создаем пустой объект, будем использовать его для отправки данных на сервер
      var post_data = {};
      // если метод отправки = post, пробегаемся по всем атрибутам "data-post" ссылки "Выход" и заносим их значения с маленькой буквы в наш объект
      if (method == "post") {
        for (var i in $(this).data()) {
          if (i.indexOf("post") === 0) {
            post_data[i.replace(/^post/, "").toLowerCase()] = $(this).data(i)
          }
        }
      }
      var send = true;
      // если у нас задан атрибут confirm_text (по всей видимости это alert-сообщение типа "Вы уверены что хотите выйти?"), то проверяем нажал ли пользователь "Да"
      if (confirm_text) {
        if (confirm(confirm_text)) {
          send = true
        } else {
          send = false
        }
      }
      // Если пользователь нажал "Да" или атрибут confirm_text не задан, то отправляем данные на сервер
      if (send) {
        $.ajax({
          url: url,
          cache: false,
          dataType: "script",
          type: method,
          data: post_data
        })
      }
    }



    ... а также почему если я перейду по ссылке toster.ru/auth/sign_out будет совсем не то, что я ожидаю (выход из аккаунта).

    Значит на сервере выход из аккаунта не поддерживает метод GET. Иначе, пользователи могли бы вставить в посты изображение со ссылкой <img src="http://toster/sign-out"> и после захода на эту страницу все пользователи автоматом разлогинивались.
    Ответ написан
    Комментировать
  • Насколько правилен такой подход?

    EireenK
    @EireenK
    В любой момент он может загрузить картинку, а затем тут же её убрать. Следовательно она навсегда останется нигде неиспользуемая.

    Можно и не загружать картинки на сервер при редактировании статьи, а показывать их, например, через Blob URLs. А при сохранении уже делать загрузку и заменять эти блоб-урлы на реальные адреса. Здесь можно посмотреть пример использования (кнопка "Import image with Blob URLs")
    Ответ написан
    7 комментариев
  • Насколько правилен такой подход?

    Sivkoff
    @Sivkoff
    Web Developer
    Можно хранить картинки в папках с id статьи. Пример пути к картинке при такой схеме хранения:
    files/images/{article_id}/{file_name}

    Из плюсов:
    • крайне простое удаление изображений - просто удаляем папку, имя которой совпадает с ID статьи
    • можно хранить файлы с осмысленными именами, не боясь коллизий

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

    khipster
    @khipster
    Межсайтовая подделка запроса.

    В hhtp есть косяк, так же как картинку можно загрузить с другого сайта, можно и форму отправить на другой сайт. Т.е. злоумышленник может от твоего имени отправить форму на др. сайт на котором ты залогинен, если ты случайно попадёшь на сайт злоумышленника (пройдешь по ссылке в письме например). Так можно поставить кому нибудь плюс Вконтакте от твоего имени или перевести деньги. Но злоумышленник не может увидеть этот код: 7d5ff819-b9db-4aa4-8bf1-b4c65122c4, поэтому и подделать он его не сможет. Причём код этот всегда разный (используется односторонняя функция), т.е. злоумышленник не может зайти на нужный сайт, скопировать этот код и вставить на свой плохой с которого форма отправляется.
    Ответ написан
  • Как заменить совпадения в тексте?

    27cm
    @27cm
    TODO: Написать статус
    preg_replace_callback()

    $result = preg_replace_callback('/\d/', function ($matches) use ($db) {
        // Запрос к базе данных $db
        return $replace;
    }, '1 2 3');
    Ответ написан
    1 комментарий
  • Как будет правильно, грамотно на php?

    mytmid
    @mytmid
    нормальные люди в тостере хлеб поджаривают :D
    Вариант имеет право на жизнь, не на всех проектах целесообразно использовать шаблонизатор.
    Но стоит внести небольшие изменения, и написать вот так:
    <input type="checkbox" <?php if($a === 1) echo 'checked'; ?> >

    - если $a должна быть равна 1, то так и надо писать
    - любая инструкция заканчивается точкой с запятой
    - если текст не подразумевает использование \n \t \r и т.п., а также не собираетесь вставлять переменные в этот текст: "Hello, {$name}", то следует использовать одинарные кавычки.
    Ответ написан
    1 комментарий
  • Как будет правильно, грамотно на php?

    valerium
    @valerium
    Изобретая велосипед
    PHP сам по себе работает как шаблонизатор. То есть, если этот код вынесен в отдельный файл и не перемешан с логикой, и шаблон остаётся читабельным, то он вполне имеет право на существование.

    Главный плюс в таком подходе — быстродействие. Главный минус — потенциальная уязвимость, но её при должном навыке можно прикрыть.
    Ответ написан
    2 комментария
  • Как будет правильно, грамотно на php?

    OnYourLips
    @OnYourLips
    Чтобы сделать грамотно нужно использовать шаблонизаторы вроде twig?
    Да, тут вы правы.
    Ответ написан
    Комментировать
  • Как поменять ключи и значения в массиве?

    mytmid
    @mytmid
    нормальные люди в тостере хлеб поджаривают :D
    $arr = ['a' => 1, 'b' => 2, 'c' => 1, 'd' => 1];
    $result = [];
    
    foreach( $arr as $key => $value )
    	$result[$value] = isset( $result[$value] ) ? "{$result[$value]},{$key}" : $key;
    Ответ написан
    Комментировать