Модификация контента для диапазонов ip

Аватар пользователя solar25 solar25 19 февраля в 11:58

Всем привет!
Возможно кто-то сталкивался с решением кейса или подскажет в каком направлении рыть. Мне необходимо, чтобы для посетителей с определенных диапазонов ip адресов происходила подмена части контента, выводимого из БД через views на drupal 7.
Plz help!

Лучший ответ

Аватар пользователя bsyomov bsyomov 20 февраля в 21:18

Конечно, определить ip пользователя можно совсем не только на стороне клиента.
За cloudflare и другими reverse proxy, надо смотреть заголовок x-forwarded-for.
Ну и соответственно, если всё делать на бекэнде, то пользователь и без всяких попыток спрятать JS код ничего не сможет узнать. Smile

Комментарии

Аватар пользователя solar25 solar25 19 февраля в 21:31

Определить ip посетителя можно только JavaScript, который исполняется на стороне пользователя.
Также мне нужно было, чтобы при открытии дебаггера браузера пользователь не мог видеть условия модификации (если окажется разумным, что редкость, но все же).
Поскольку ресурс за CloudFlare - сначала изучил возможности там. Это можно сделать с помощью Workers и кастомного скрипта, который не будет виден юзеру. При достижении квоты - платно.
Решил делать средствами Drupal, показалось проще, ну и бесплатно.
Ставим модуль Views PHP
В поля вьюхи добавляем "Глобальный-PHP", там в output code JS, который определяет ip пользователя и php скрипт, который в зависимости от результата отработки JS выводит/не выводит поле из БД (привожу только js с php разберетесь):

<script  type="text/javascript">window.onload = function() {
jQuery.getJSON('https://api.ipify.org?format=json', function(data) {
a=data.ip;
b=a.match(/^192.168.16./);
if (b) {
document.getElementById("resultdiv").innerHTML="Да";
  } else {
document.getElementById("resultdiv").innerHTML="Нет";
  }
});
}
</script>

Чтобы умники не видели ваш js скрипт (с масками ip адресов), обфусцируем на https://www.obfuscator.io/
Наш скрипт превращается в забавный код:

<div id=resultdiv></div>
<script  type="text/javascript">var _0x404e=['match','innerHTML','559927vuqhBX','19sHTVGs','948377QSxYPU','onload','getElementById','Нет','1518096UIPEEo','185865LeNWYx','273842DIXvfI','4dEcCFn','464530ZzKceX','getJSON','136195XrkPZc','resultdiv','https://api.ipify.org?format=json'];var _0x62c0=function(_0x3f9ca1,_0x44b636){_0x3f9ca1=_0x3f9ca1-0x9f;var _0x404e9e=_0x404e[_0x3f9ca1];return _0x404e9e;};var _0xd12574=_0x62c0;(function(_0x3a1b70,_0x103dc3){var _0x3bedea=_0x62c0;while(!![]){try{var _0x1c5334=parseInt(_0x3bedea(0xaa))+-parseInt(_0x3bedea(0xab))+parseInt(_0x3bedea(0xa6))+-parseInt(_0x3bedea(0xae))+parseInt(_0x3bedea(0xad))*parseInt(_0x3bedea(0xac))+parseInt(_0x3bedea(0xa4))+-parseInt(_0x3bedea(0xa5))*parseInt(_0x3bedea(0x9f));if(_0x1c5334===_0x103dc3)break;else _0x3a1b70['push'](_0x3a1b70['shift']());}catch(_0x1b0362){_0x3a1b70['push'](_0x3a1b70['shift']());}}}(_0x404e,0xd7bd4),window[_0xd12574(0xa7)]=function(){var _0x42a3ff=_0xd12574;jQuery[_0x42a3ff(0xaf)](_0x42a3ff(0xa1),function(_0x1d354c){var _0x406d23=_0x42a3ff;a=_0x1d354c['ip'],b=a[_0x406d23(0xa2)](/^5.35.13./),console['log'](b),b?document['getElementById']('resultdiv')[_0x406d23(0xa3)]='Да':document[_0x406d23(0xa8)](_0x406d23(0xa0))['innerHTML']=_0x406d23(0xa9);});});
</script>

Профит)

Аватар пользователя bsyomov bsyomov 20 февраля в 21:18

Конечно, определить ip пользователя можно совсем не только на стороне клиента.
За cloudflare и другими reverse proxy, надо смотреть заголовок x-forwarded-for.
Ну и соответственно, если всё делать на бекэнде, то пользователь и без всяких попыток спрятать JS код ничего не сможет узнать. Smile

Аватар пользователя solar25 solar25 21 февраля в 2:02

Cloudflare в принципе не кэширует динамический контент, в т.ч. html, генерируемый views, если в настройках кэширования это явно не задано. И да, умеет.

Аватар пользователя solar25 solar25 21 февраля в 0:45

Конечно, но True-Client-IP Header в CloudFlare доступен только для непубличного тарифа Enterprise. Предыдущий перед ним в линейке 200 $/месяц, для данного ресурса это экономически нецелесообразно

Аватар пользователя solar25 solar25 21 февраля в 2:39

Проверил настройками nginx как описано по ссылке в предыдущем сообщении. Все замечательно работает. Оговорка - только для некэшируемого контента (что собственно и требовалось). IP посетителя определяется без применения JS - бэкендом. Во вьюхе сравнивая значение $user->hostname с нежелательными ip, либо выводим поле из БД, либо нет.

Аватар пользователя gun_dose gun_dose 21 февраля в 0:29

Вообще-то, даже в обфусцированном коде видно, что скрипт обращается на сторонний сервис, и меняет контент в элементе resultDiv. А ещё можно отключить js на странице и увидеть немодифицированный контент. А ещё, если у юзера поменяется IP-адрес, то скрипт не сработает. К слову, он меняется в среднем минимум раз в сутки, если не подключена услуга статического айпишника.
Updated:
А ещё, вы ловите айпишник из локальной сети))) очень сомнительно, чтобы локальный сайт работал за cloudflare.
А ещё, вовсе не надо ставить Views PHP, чтобы добавить скрипт на страницу.

Аватар пользователя solar25 solar25 21 февраля в 1:06

Можно обфусцировать с опцией high и будет ничего не понятно.
Вы пишете примеры, которые недоступны среднестатистическому юзеру, с таким же успехом можно заявить "а еще можно сломать админку или мускул". Для моих задач имеется список конкретных шлюзов, через которые ходят нежелательные посетители, поэтому вариант вполне рабочий. Локальный ip прописан от балды в целях соблюдения конфиденциальности ) View php ставится для того, чтобы php скриптом выдергивать нужные поля непосредственно из БД.
Не притягивайте за уши, лучше расшифруйте обфусцированный код))