• Как лучше хранить изображения для сайта?

    Negash
    @Negash
    Невнимателен, Технарь
    Использовать объектное хранилище типа s3 или minio, дальше это поможет в масштабировании
    Ответ написан
  • Как обновить кэш у пользователя сайта?

    wapster92
    @wapster92 Куратор тега CSS
    Для css и js в пути файла можно подставлять версию после знака "?" <script src="/js/main.js?123456789"></script>

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

    @entermix
    Используйте структуру каталогов на основе хеша

    Примерно так:
    // Convert path to hash structure while preserving directory and extension.
    	function hash($path, $random = FALSE)
    	{
    		$hash = ($random) ? md5(time() + rand()) : md5($path);
    		
    		$path = pathinfo($path);
    
    		$segments = array();
    		
    		if ($path['dirname'] != '.')
    		{
    			$segments[] = $path['dirname'];
    		}
    		
    		$segments[] = substr($hash, 0, 2);
    		$segments[] = substr($hash, 2, 2);
    		$segments[]	= $hash . ((isset($path['extension'])) ? '.' . $path['extension'] : '');
    		
    		return implode('/', $segments);
    	}
    
    
    $storage_path = hash(date('/Y/m/d/').basename($file).'/', true);


    P.S
    https://medium.com/eonian-technologies/file-name-h...

    P.P.S.
    Чем грозит большое количество папок?
    Ответ написан
  • Как лучше хранить статьи для сайта в БД?

    @necrodeflorator
    Да в принципе всё правильно думаете.
    Вы же парсить будете исходный текст, искать в нем ключевые конструкции? Проще это один раз сделать при сохранении статьи и выводить готовый хтмл.
    Ответ написан
    Комментировать
  • Почему я не могу вытащить изображения из input type file на js?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    Потому-что инстанс jQuery не является DOM нодой
    Скорее всего на этой строке у Вас вообще ошибкаfilesLength = control.files.length;
    Извлеките реальную DOM ноду:var control = $('#images').get(0);
    Ответ написан
    Комментировать
  • Если клиент потерялся, а потом объявился и захотел вернуть деньги за уже выполненую и принятую работу, то что делать?

    CityCat4
    @CityCat4
    Внимание! Изменился адрес почты!
    Нет договора - нет проблем :)

    Вы на добровольных началах согласились сделать ему работу забесплатно :) А он добровольно согласился подарить Вам денег :) Взаимных обязательств у вас не возникло :) Слова к делу не пришьешь, переписка доказательством не является.
    Ответ написан
    4 комментария
  • Что делать, если идею сайта и его часть скопировали?

    xmoonlight
    @xmoonlight
    https://sitecoder.blogspot.com
    На бэке храните все расчёты.
    Одни лишь тексты - ничего не дадут без серверной логики.
    Ответ написан
    Комментировать
  • Что делать, если идею сайта и его часть скопировали?

    @Legal2019
    Всё в имени моём... и радость и печаль...
    Текст (контент) защищается точно так же как и книги, фото, музыка и т.п., в т.ч. коды эвм.
    Вопрос в другом - как часто вы готовы заниматься поиском плагиата и отработку судебных разбирательств?
    Ответ написан
    Комментировать
  • Что делать, если идею сайта и его часть скопировали?

    DevMan
    @DevMan
    есть ровно один способ - быть лучше других.
    как минимум в маркетинге.
    Ответ написан
    Комментировать
  • Что делать, если идею сайта и его часть скопировали?

    Curosio
    @Curosio
    Бездельник широкого профиля
    С сайтом такая штука, что защитить его нельзя. А раскрутить можно. Вот если ваш сайт будет первый по этой тематике и раскрученным, тогда все будет ок - пусть копируют. Знаете сколько раз копировали Вконтакте и Одноклассники? И где они все?
    С тех пор, как идея опубликована остается только фора, которую дает право первого и конкурентная борьба. Так что вы просто ставите вопрос не в той плоскости.
    Ответ написан
    2 комментария
  • Насколько безопасно использование сессий в php?

    @granty
    Сессия - это Кука с именем PHPSESSID (по умолчанию, его можно изменить) и значением вида 8jae35cosacp2f5qv6g2uqe6i7. Все данные сессии (массив $_SESSION) хранятся на стороне сервера в файле с именем 8jae35cosacp2f5qv6g2uqe6i7 в формате JSON (можно хранить и в БД).
    То есть, вам надо не дописывать 1, а угадывать это имя, что нереально.

    У Куки можно установить флаг HttpOnly - такие Куки не видны браузерному коду (яваскрипту), а только отправляются на сервер. Внедрённый на страницу вряжеский яваскрипт не сможет получить доступ к такой Куке.

    Куку можно перехватить во время передачи по сети, для защиты от этого есть механизмы:

    - установить заголовок HSTS, это заставит браузер работать только по HTTPS, те Кука будет зашифрована при передаче по сети.

    - в самой сессии можно хранить IP адрес(привязка сессии к IP). Тогда даже с правильной Кукой не залогиниться, поскольку не совпадет IP (который хранится в $_SESSION на стороне сервера). Неудобно если провайдер меняет IP при каждом переподключении.

    - можно в сессии хранить User Agent (все равно Кука - она только для этого браузера). Но при автоматическим апдейте браузера придётся авторизоваться заново, и у кого хватило ума перехватить Куку - перехватит и имя User Agent-а.

    - можно в сессии хранить fingerprint браузера (или даже всего компа), только надо придумать как безопасно передавать его на сервер, чтобы сохранять в сессии (и для сравнения при авторизации). Его же тоже могут перехватить.

    - при каждой авторизации по Куке, и через каждые ## секунд можно(и нужно) делать session_regenerate_id (меняется 8jae35cosacp2f5qv6g2uqe6i7 на другое), там по ссылке есть пример как это сделать прямо внутри сессии. То есть, угнанная Кука быстро перестаёт работать.

    - можно делать "сессионную" Куку (не указывать её время жизни). Такая Кука живёт до закрытия браузера, но после закрытия браузера придётся заново вводить логин/пароль

    Можно добавить своей безопасности - например отправлять email пользователю при каждой авторизации по Куке, если не было активности Пользователя более 12 часов.

    PS: Если пользоваться сессиями правильно - они достаточно безопасны, практически вся авторизация в интернетах построена на них.
    Ответ написан
    Комментировать
  • Насколько безопасно использование сессий в php?

    MichaelAniskin
    @MichaelAniskin
    Немного в себе
    Система достаточно надежна но есть одно НО. Время жизни сессии. Обычно она составляет 1440 секунд. Я реализовал это оставляя куку с идентификатором сессии и временем жизни месяц, при посещении проверял наличие куки и если поменялось то сравнивал пользователя куки если это тот же самый то обновлял эту переменную. Так же реализовал механизм авториризации после гостевого режима с переписыванием корзины на пользователя. Главное это пользователь а сессия вторична.
    Ответ написан
    Комментировать
  • Насколько безопасно использование сессий в php?

    myks92
    @myks92 Куратор тега PHP
    Нашёл решение — пометь вопрос ответом!
    Просмотрев видео ответите на все вопросы.
    Ответ написан
    Комментировать
  • Как сделать генерацию случайных символов?

    Sander_Li
    @Sander_Li
    Backend developer
    function getString($count = 17){
        $result = '';
        $array = array_merge(range('a','z'), range('0','9'));
        for($i = 0; $i < $count; $i++){
            	    $result .= $array[mt_rand(0, 35)];
        }
     return $result;
    }
    Ответ написан
    7 комментариев
  • Может ли пользователь изменить значение переменной Javascript?

    @Power
    Да: с помощью всяких developer tools, например.
    Ответ написан
    Комментировать
  • Обновление reCaptcha без перезагрузки страницы, как?

    @burov0798 Автор вопроса
    Пытаюсь изучать php\js
    Решил проблему: grecaptcha.reset();
    Ответ написан
    Комментировать
  • Почему не работает position sticky?

    SkiperX
    @SkiperX Куратор тега CSS
    блок прилипает внутри родителя
    jsfiddle.net/eo4nsfrt/1

    еще может не работать из-за overfloy: hidden в родительских блоках
    Ответ написан
    6 комментариев
  • Чем куки отличаются от сессии в PHP?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Нууу давайте разбираться.

    Для начала почитайте про HTTP на той же вики. Досканально знать не нужно, но стоит минимально понимать структуру запросов/ответов, понимать что у запроса и ответа есть заголовки и тело (тела может и не быть, зависит от типа запроса/ответа).

    Так вот. Куки. Куки живут на стороне браузера. Они передаются HTTP заголовком на каждый запрос на сервер (даже если вы за картинками полезли). Есть просто куки, есть http-only куки. Куки могут быть разграничены по хосту и пути. Все это дает нам гибкость и помогает с секьюрностью. В PHP содержимое $_COOKIE предоставляет нам SAPI. Когда PHP получает на обработку запрос, SAPI используемое (php-fpm, cgi, mod_php имеют свои реализации SAPI) в данный момент берет заголовки и тело запроса, парсит их и заполняет все эти суперглобальные массивы типа $_SERVER, $_GET и в том числе и $_COOKIE. Все что прислал нам клиент (что-то что делает запросы это клиент, что-то что их обрабатывает - сервер), а куки шлет нам браузер только те что можно исходя из того куда шлется запрос. Устанавливаются куки заголовком Set-Cookie в ответе, то есть тут больше нужно читать в принципе про HTTP а не про PHP. PHP просто позволяет вам работать с этим добром. Вы можете сэтить куки напрямую работая с заголовками ответа при помощи функции header. Более того, если выставить время жизни куки в 0, то как раз таки они а не сессия будет сбрасываться при закрытии браузера так как тот будет забывать все такие куки.

    Вот... сессии... В PHP сессия обычно это файл. Просто какой-то файл с рандомным именем. Если скажем в php.ini указано session.autostart или делается вызов session_start то создается файл под сессию пользователя (можно переместить в рэдис или мемкэш, свое хранилище и т.д в зависимости от нужд. Так же данные можно шифровать, что по умолчанию и происходит). Этот файл имеет ID, просто какая-то рандомная строка. И если при обработке запроса не нашлась сессия с предыдущего запроса - создается новая.

    И вот мы подошли к самому интересному - как PHP связывает сессию с предыдущего запроса с текущей. И тут все довольно просто - куки. Когда пользователю присваивается сессия, автоматически сэтится http-only (что бы нехорошие люди не могли из js увести нашу сессию) кука, в которую записан идентификатор сессии. В дебагере браузера можете посмотреть есть ли у вас кука PHPSESSID (название можно менять в настройках, да и вообще сессии можно не только через куки связывать, но это уже загоны по секьюрности) когда будете эксперементировать с сессиями.

    Когда запрос обрабатывается SAPI, при наличии session.autostart, перед тем как начинать создавать новую сессию, пых все же смотрит а есть ли у нас кука с идентификатором сессии, проверяет есть ли у него такая, и если есть успокаивается и не создает новую. Поскольку сессия привязывается через куки, то можно выставить время жизни этой самой куки (в php.ini) и таким образом регулировать время жизни сессии.

    Вот... когда использовать куки а когда сессии? Желательно понимать, что чем больше данных в куках (а у них есть лимит к слову) - тем больше данных мы передаем на каждый запрос. То есть это не круто когда что бы получить 1 килобайт данных мы должны в заголовках передать пару килобайт кук. Люди, повернутые на оптимизации, даже картинки хранят на отдельных cookie-less доменах что бы уменьшить количество трафика и пакетов (обычно простенький HTTP запрос влазит в размеры одного TCP пакета). Если вам нужно работать с этими данными из JS на любой странице, например локаль выбранноую пользователем для того что бы применять переводы еще и в JS, то стоит использовать куки. Для всео остального лучше конечно же использовать сессии. Во всяком случае на начальных этапах когда что-то сильно сложное вам делать не придется.
    Ответ написан
    2 комментария