Задать вопрос
  • Как сделать временную ссылку не на скачивание?

    @granty
    Технически, есть 2 варианта:

    1. Отдавать скачиваемое на PHP. Для генерации временной ссылки можно использовать:

    A) класс NoDirectLinks. Временные ссылки надо складывать в БД и проверять их "валидность" и периодически чистить.

    B) делать временную ссылку вида "ID_ValidDate", которую шифровать методом обратимого шифрования. Если периодически менять ключ кодирования (и алгоритм), такую ссылку невозможно взломать и подделать.
    Внешне ссылка выглядит как хэш 56af5b4C..., но на сервере её можно декодировать обратно в "ID скачиваемой записи по БД" и "время жизни ссылки". Если время жизни истекло - контент не отдаётся. Вместо ID можно запаковывать и имя файла.

    В обоих вариантах делается файл типа get.php, который проверяет "валидность" временной ссылки и отдаёт контент.
    В вашем случае это плохо - при медленном интернете у юзера, загрузка видео/аудио будет идти долго, PHP-скрипт будет висеть и жрать ресурсы.


    2. Делать временную ссылку средствами операционной системы, например, через symlink() на PHP.
    Тогда медиа-файл будет отдаваться веб-сервером без участия PHP, что намного лучше.
    Всё-равно придется хранить эти ссылки в БД и решать вопрос их устаревания и чистки.


    Но временную ссылку, как уже отметили выше, лучше делать не для страницы, а для самого скачиваемого файла (вам же просто надо чтобы ваши видео не транслировались с вашего хостинга на чужие сайты). Иначе поисковики наиндексируют тонну дублей это страницы. Или придётся закрыть страницу с этими временными URL от индексации.

    PS: Я в своё время делал вариант 1 B) для платного скачивания документации - работало неплохо.

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

    @granty
    Можно, судя по топикам на staskoverflow:
    ReCaptcha: How to autosubmit the form when the cap....
    Google ReCaptcha 2 auto submit но для reCaptcha 2 почему-то делают проксирование через свой сервер.
    Ответ написан
    Комментировать
  • Как правильно взять IP адрес пользователя?

    @granty
    Обычно, подобные вашему глюки возникают при использовании ELB (Elastic Load Balancer) хостером. Или когда сайт работает за реверс-прокси сервером (например, CloudFlare или хостеровский nginx).
    Там в $_SERVER['HTTP_X_FORWARDED_FOR'] прилетает строка из нескольких IP:
    "223.190.123.220, 66.102.6.83"
    "2402:3a80:10d3:e19f:e7e1:8c35:fb4a:b49c, 66.102.6.89"
    И, похоже, Yii::$app->request->userIP не знает как с ними поступать (в строке по сути невалидный IP, и filter_var($ip, FILTER_VALIDATE_IP) на нём обламывается).

    Как правильно определять IP посетителя в таких случаях (и какие ещё грабли вас поджидают), отлично изложено на Хабре: REMOTE_ADDR vs HTTP_X_FORWARDED_FOR.
    Вам надо узнать в какой переменной хостер присылает реальный IP посетителя, если он тупо добавляет её в $_SERVER['HTTP_X_FORWARDED_FOR'] - надо хотя бы узнать в начало или в конец. И выцеплять её оттуда.

    PS: Я с Yii не работал, но скорее всего его можно "настроить" под вашу конкретику, там наверняка это предусмотрено. Посмотрите echo '<pre>'.print_r($_SERVER, true).'</pre>'; что и под какими именами прилетает, может ваш хостер использует нестандартные заголовки для передачи реального IP посетителя.

    PPS: HTTP_X_FORWARDED_FOR в принципе нельзя использовать как IP-адрес. Если пользователь работает через свой прокси (или публичные Google-прокси, прокси Opera-mini и тп) - там бывает 3 IP-адреса и более, включая IPv6.
    Ответ написан
    Комментировать
  • Не могу запустить browserSync в gulp из-за Content Security Policy в браузере Chrome?

    @granty
    У вас где-то на сервере издаётся заголовок:
    Content-Security-Policy: default-src 'self';
    Или через PHP-шную header(), или заголовок прописан в .htaccess или в конфиге Апача/nginx/Denver тп. Технически, его могут издавать и браузерные расширения/плагины, в том числе и вредоносные.

    Или уберите этот заголовок совсем, или добавьте в него директиву script-src:
    Content-Security-Policy: default-src 'self'; script-src 'self' 'unsafe-inline' appmakedev.xyz linkangood.com;


    Также у вас загружается 8 картинок, но у них неправильно указан src: . Когда укажите его правильно, в заголовок CSP придётся добавить директиву img-src 'self' (и возможно добавить туда домены, с которых загружаете картинки).

    Если не уберёте заголовок, потом будете добавлять в этот заголовок все сторонние хосты(домены), с которых загружаете скрипты и картинки (и CSS стили, и шрифты, и много чего ещё).


    PS: Странно, что вы катите бочку только на Chrome, в Firefox должно быть то же самое. Если, конечно, у вас Content-Security-Policy: default-src 'self'; издаётся не браузерным плагином.
    Ответ написан
    Комментировать
  • Как индексировать одну страницу, но в поиске держать другую?

    @granty
    Клоакинг - это метод обмана поисковых систем, при котором посетителю сайта показывается одно содержимое страницы, а роботам поисковых систем — другое. Карается баном в ПС.

    Классический клоакинг делается по IP (нужно собрать IP подсетей поисковых систем). На сервере проверяется $_SERVER['REMOTE_ADDR'], и в зависимости от него отдаётся различный контент.
    Но роботы Яндекса для проверки клоакинга периодически ходят с IP других провайдеров (чаще всего - Корбины). Кроме того, клоагинг спалят посетители с Яндекс-браузером (он автоматически настучит куда надо).

    Старые варианты клоакинга по UserAgent давно не работают, тк боты ПС могут прийти с любым (по ссылке ниже есть вариант клоакинга для .htaccess).
    Удачи вам в осваивании дорвейных технологий (имхо - это пустая трата времени).

    PS: Имейте в виду, что существуют легальные способы клоакинга.
    Ответ написан
    Комментировать
  • Почему на сайте нет трафика?

    @granty
    1. Подумайте, по каким запросам на ваш должны приходить посетители.

    2. Вбейте эти запросы в Яндекс, и сразу получите:
    ответ на ваш вопрос
    5e4e503fdeac0228794054.jpeg
    Поисковики сами отвечают на те вопросы, по которым "теоретически" может иметь трафик ваш сайт.

    И вторая причина(ы)
    В выдаче много сайтов, аналогичных вашему, но:
    - у них больше контента
    - на них есть есть внешние ссылки
    - они лучше оптимизированы под поисковые запросы
    - они появились десятилетием раньше:
    calc.ru, например, с 2001 года
    translatorscafe.com - с 2002
    unitjuggler.com - с 2008
    ru.wikipedia.org - вообще молчу, это витальный сайт для многих запросов, поэтому в SERP Яндекса википедий сразу 2 штуки(и может быть больше).

    Вы же не думаете, что ПС подвинут в выдаче википедию и другие серьёзные сайты, чтобы поставить ваш сайт на их место?
    Ответ написан
    Комментировать
  • Время интернет-магазинов прошло?

    @granty
    Время интернет-магазинов прошло?
    Спросите у Амазона, Алиэскпресса, Ебея, или Озона. На "тлетворном западе" вообще всё продаётся через интернет магазины, включая повседневную еду. Каждая сеть супермаркетов имеет свой интернет-магазин.

    Российскому малому бизнесу достаточно группы вконтакте, интернет магазин ему не нужен в принципе. Никто в здравом уме не будет покупать через интернет у неизвестной фирмы, да ещё в Рассее.

    Бизнес поигрался в эти интернет-магазинчики, и быстро понял, что без нормально работающего законодательства и доставки, всё это не работает.
    Ответ написан
  • Из textarea перевести массив с новой строки и записать в mysql все?

    @granty
    $new_coupon->code = $this->request->post('new_code', 'string');
    $arr =  preg_split("|[\r\n]|s", $new_coupon->code, -1, PREG_SPLIT_NO_EMPTY); // Все и непустые

    далее в цикле строки из $arr заносить в БД.
    Ответ написан
    Комментировать
  • Как убрать символ?

    @granty
    В PHP для этого предусмотрена функция stripslashes().
    Ответ написан
    Комментировать
  • Как узнать время загрузки страницы?

    @granty
    таким образом что бы у него приходило уведомление об этом
    у него, или от него?
    Время загрузки у конкретного пользователя будет зависеть от "толщины" его Интернета и сколько закладок он одновременно открыл в браузере. И насколько загружен его комп, может он биткойны майнит параллельно.

    И определитесь, что конкретно вы имеете в виду под "временем загрузки страницы".
    В статье на Хабре как измерить время открытия страницы рассмотрены аспекты того, когда можно считать, что страница загружена.
    Ответ написан
    Комментировать
  • Действительно ли код индусов так плох?

    @granty
    1. Я не знаю, кого вы называете "индусами", но если жителей Индии, то:
    - Индия запустила в космос сразу 104 спутника, установив мировой рекорд.
    - Индия запустила спутник RISAT-2B, такую систему радиолокационной разведки имеют только США, КНР и Япония».
    И софт для своей космической отрасли "индусы" пишут сами. В итоге: Индия - полноценная космическая держава, РФ - уже нет.

    2. Почему вы решили, что пишете код лучше "индусов"? Каковы критерии сравнения? Microsoift недавно открыла код Калькулятора Windows, народ уже подсчитал в нём баги.

    PS: Пока вы начёсываете тут своё ЧСВ, "индусы" вас уделывают по всем фронтам.
    Ответ написан
    1 комментарий
  • Права пользователь?

    @granty
    1). Решение - правильное для небольшого проекта.

    2). Вы же авторизуете пользователя, и именно по таблице users. И наверняка авторизацию храните в сессии. Добавьте в сессию поле is_admin и проверяйте его на входе в админ панель.
    Надо:
    - убрать ненужные пункты меню
    - проверять is_admin в скриптах из этих убранных пунктов меню. Ибо ссылку на них можно ввести и руками.

    PS: По уму надо делать списки скриптов, и привязывать привилегии пользователей к разрешенным им скриптам. И в начале всех скриптов проверять привилегии.
    Ответ написан
    Комментировать
  • Как называется такой сервис для сайта?

    @granty
    Любите лазить по интернету, залогиненным в аккаунты соцсетей?

    Это называется Clickjacking. Сайт проверяет, что вы залогинены в соцсети, и может, например, узнать адрес вашей страницы в VK и емайл.

    Уязвимости выше закрыли под давлением общественности, но постоянно находят новые. И я вполне допускаю слив базы vk.com, тогда будет доступен и номер телефона.

    PS: если вы авторизуетесь на сайте через аккаунты в соцсети - они вообще штатно получают инфу о вас безо всяких кликджакингов.
    Ответ написан
    Комментировать
  • Как узнать откуда был загружен iframe?

    @granty
    Откуда был загружен iframe никак не узнать (узнать-то можно, но в вашем случае это не поможет).

    1. яваскрипт не сработает, тк политика «Одинакового источника» (Same Origin Policy) запрещает доступ из ифрейма к window.top.location.href, если они имеют разные происхождения (грубо говоря - разные домены).
    Проверить window.top != window.self браузер даёт, а доступ к фактическому url из window.top - нет.

    2. на сервере проверять переменную $_SERVER['HTTP_REFERER'] (кто запросил загрузку страницы) смысла тоже нет - если у ифрейма установлен атрибут referrerpolicy:
    <iframe referrerpolicy='no-referrer'>
    реферер не будет прислан (будет, но только в IE/Edge и Safari_IOS).


    Но сделать то, что вы хотите - можно легко. На странице надо издать HTTP-заголовок CSP с директивой frame-ancestors:
    header( "Content-Security-Policy: frame-ancestors https://ваш_сайт.ru http://ваш_сайт.ru https://www.facebook.com https://facebook.com https://www.google.com https://google.com;" );

    это разрешит открывать эту страницу в ифрейме с собственного домена ваш_сайт.ru(без поддоменов!) по http:/https:.
    И сайтам facebook.com и google.com с www или без (но только если фэйсбук/гугль загружены по https: - а их и невозможно загрузить по http:).

    PS: если ваш сайт доступен и по www - добавьте в "волшебную" строку:
    https://www.ваш_сайт.ru http://www.ваш_сайт.ru
    Ответ написан
    Комментировать
  • Как устроены сайты с поиском времени в опр.городе?

    @granty
    Была уже тема Существует ли API времени?.
    Могут добавить (сам не пользовался):
    - https://worldtimeapi.org/
    - Dater, коды есть на гитхабе

    Лучше избегать API сервисов, которые не обновляются - сейчас модно отменять переход на зимнее/летнее время. За всеми странами надо постоянно следить.

    Если нужны виджеты/информеры на сайт
    - https://yandex.ru/time/
    - https://time.is/widgets
    Ответ написан
    5 комментариев
  • Использовать ли буксы/ботов в SEO?

    @granty
    То, что поведенческие факторы работают в Яндексе, косвенно свидетельствует топик на Серче бан Яндекса на 6 месяцев за накрутку поведенческих.

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

    Есть интересная статья 2014 Как я «крутил» поведенческие факторы, там видно насколько сложно всё сделать правильно. Особенно, когда не знаешь, что надо делать - у поисковиков-то накоплена полная статистика поведения реальных пользователей.

    Ну, и пробежаться по топу - там много полезного можно найти.

    PS: Имхо, накручивать поведенческие факторы, не зная что это такое - глупо. А у молодого сайта с низкой посещаемостью - глупо в двойне (они у него просто не работают, ибо у ПС нет статистики).

    SEO-парадокс

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

    В СЕО - вообще много мифов, поскольку технически прощупать принципы ранжирования поисковых систем сейчас уже невозможно. Но всегда найдутся желающие заработать на "доверчивых верующих", а потом объяснить, почему конкретно вам не получилось выйти в ТОП.
    Ответ написан
    1 комментарий
  • Как правильно экранировать символы в SQL запросы, если нужно отправить HTML-код?

    @granty
    Никита Гуриев, сделайте
    $sql = "INSERT INTO `ваша_таблица`  data='".mysql_real_escape_string($data)."' WHERE ваше условие вставки";

    всё должно вставиться. Имя поля и имя таблицы поставьте ваши, $data из каммента Александра выше(полученные через Heredoc).

    Без Heredoc у вас не работало, потому, что вы строку брали в двойные кавычки ", и внутри неё использовали " без экранирования в:
    "src": '$NewFileDir',
    и переносы строк внутри " " могли отрабатываться неправильно.


    Есть железобетонный вариант вставить всё что угодно (если размера поля БД хватит):
    $sql = "INSERT INTO `ваша_таблица`  data='".base64_encode( gzcompress($data) )."'";

    а когда достаёте из БД - надо распаковать обратно:
    $data = gzuncompress( base64_decode( $row['data' ] ) );

    Из минусов:
    - доп нагрузка на запаковку-распаковку, но для вашей строки это ерунда. base64_encode() увеличивает размер данных примерно в 1.5 раза, но zip жмёт сильнее.

    Из плюсов:
    - SQL-инъекции отсутствуют как класс
    - ничего не надо экранировать.
    - кодировка данных - по барабану, вставится даже UTF8-данные в таблицу cp1251. Главное, потом их отдать в правильной кодировке (когда вытащите из таблицы и будете отправлять в браузер)
    Ответ написан
    Комментировать
  • Можно однозначно определить, что пользователь является владельцем организации?

    @granty
    Стандартная проверка - выписка из ЕГРЮЛ/ЕГРИП не страше 3-масяцев + копия свидетельства о регистрации юрлица.

    Если у организации есть сайт - пусть регистрируются с почты в их официальном домене.

    UPD: В Яндекс.Справочнике используется подтверждение прав владения организацией по телефону. Они требуют, чтобы официальный номер телефона был на сайте фирмы или в её группе в соцсетях.
    На код на телефон присылается голосом (на мобильные можно по СМС).

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

    При регистрации на сервисе требовать указать ФИО, ОГРН/ОГРНИП и страницу сайта(группу в соцсетях) где указаны номера телефонов фирмы. ОГРН/ОГРНИП пробиваются онлайн на сайте налоговой (что фирма не ликвидирована).

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

    @granty
    Методом последовательных проходов.

    1. Делаете опорный список городов/поселков/хуторов и тп (я опирался на OKTMO из Общероссийского классификатора территорий)
    Определяетесь как распознавать преффиксы населённых пунктов: жд. ст / пос. / пгт. / д. / с. / х. (они есть в ОКТМО)

    2. Собираете опорный список правильных названий улиц по каждому городу
    Улицы надо нормализовать по единому принципу:
    Кооперативный 5-й проезд
    или
    5-й Кооперативный проезд

    определяетесь с сокращениями
    пер. -> переулок
    пр. -> проезд или проспект

    делаете первый проход с вашими паттернами, если правильно определились город и улица - заносите их (и оставшийся номер дома) в БД.

    3. Убираете правильно определившиеся из исходной базы.
    Смотрите, что осталось, правите паттерны под оставшиеся и делаете следующий проход.

    Оставшиеся в сухом остатке - под ручной разбор. Готовьтесь столкнуться с тем, что некоторых улиц/переулков нет на картах Яндекса/Гугла, а на самом деле они есть. Я такие сомнительные названия улиц помечал в БД флагом Trusted=0 чтобы разобраться с ними потом.

    Ели опираться на карты openstreet/Яндекс/Google - у них некоторые улицы называются немного по-разному:
    Улица 850 лет Москвы
    850-летия Москвы
    но карты вам всё-равно потребуются, ибо иметь адреса без привязки к гео-координатам - мало проку.

    PS: С номерами домов по-любому будет полная засада - 40/1 может быть и 40 к1 и 40 копр.1
    Ответ написан
    Комментировать