• Как защитить пароль при передаче формы на сервер?

    FanatPHP
    @FanatPHP
    Чебуратор тега PHP
    Три ответа и куча лайков.
    Что характерно, если тех же самых людей спросить, надо ли хэшировать пароли на сервере - все дружно, строем и хором ответят - НУЖНО!

    При этом мысль, как совместить обе технологии, не приходит в голову ни одному из них. А они не совмещаются. Если "сервак со своей стороны так же солит пароль и считает хэш" то это значит... что пароли хранятся в открытом виде!

    Это квинтессенция подобныйх сайтов. Ответ почему-то всегда даётся самый буквальный. При этом вопрос никогда не подвергается сомнению или хотя бы минимальной проверке на осмысленность. Такое ощущение, что отвечающие воспринимают вопрос как экзамен что ли? Или как челендж - ответить любой ценой, пусть даже и неимоверных извращений и ГАРАНТИРОВАННЫХ граблей в будущем. Или - как сейчас - ценой СНИЖЕНИЯ защищенности! Но зато ответ буквальный. И так не только здесь - так практически в любом ответе. Ну никогда ни у кого не твремени задуматься над вопросом - все торопятся отвечать.

    Я не знаю, что с этим делать. Такой подход очень вредит как самому сайту, так и тем, кто задает вопросы. Вместо того, чтобы показать правильный подход, ему старательно, сопя и напрягая остатки извилин, помогают выстрелить себе в ногу.

    Возможно, одна из причин в том, что в голове у отвечателей отсутствуют реальные знания, а стоит органчик, в который записано несколько прочитанных когда-то ответов. И один из этих ответов выстреливается сразу после прочтения заголовка - даже не углубляясь в текст вопроса. Таких "отвечателей" надо гнать поганой метлой. Пусть самоутверждаются в другом месте. Тем же, кто хочет ответить, рекомендую придерживаться правила:

    Перед тем как отвечать, НАДО СНАЧАЛА ПОДУМАТЬ. Посчитать на ход вперед - "а что будет, если сделать, как я советую?" Посчитать на ход назад - "а зачем ему нужно это? Не похож ли этот вопрос на мой собственный, который я когда-то задавал от недостатка знаний?" И попробовать ответить так, чтобы РЕАЛЬНО помочь спрашивающему, а не просто выдать зазубренный ответ.

    Возвращаясь к вопросу: нет, нельзя без SSL. Хэширование на сервере важнее.
    Можно эмулировать SSL для передачи пароля, но куда проще воспользоваться готовым механизмом. На дворе 2014 год, все основные сайты перешли на шифрование всего трафика вообще. Пора переставать бояться SSL.
    Ответ написан
  • Div or tables ?

    Mithgol
    @Mithgol
    Пока в большинстве браузеров не реализован CSS3 Flexible Box Layout Module, вёрстка элементами <div> должна уступать место табличной вёрстке всякий раз, когда возникнет необходимость создать двумерную структуру, подобную классической таблице, то есть содержащую ряд столбцов и строк с ячейками равной ширины и высоты, особенно если ячейки эти должны переменять ширину и высоту по мере необходимости (то есть после появления в них длинного слова, высокого текста, широкой или высокой иллюстрации) — и тотчас, в равной степени, должны переменять высоту всех своих соседей по строке да ширину всех своих соседей по столбцу.

    Элементы <div> способны противостоять увеличению своих размеров (например, уменьшать попавшую внутрь их иллюстрацию, если она превосходит некоторый предел, или создавать полосы прокрутки для содержимого, выходящего за пределы элемента), элементы <div> способны составлять собою сложные двумерные структуры нетабличного вида, иногда более полезные и красивые, чем таблицы (например, последовательность строчных блоков с CSS-свойством «display: inline-block», способная переменять размеры блока, не затрагивая размеры соседних строк, и переставлять блоки со строки на строку; или, например, результат работы jQuery-плагина Masonry, встык заполняющего прямоугольными блоками некоторое двумерное пространство), но настоящую таблицу элементы <div> пока что заменить не способны.

    Рано или поздно в большинстве браузеров будет реализован CSS3 Flexible Box Layout Module, и тогда появится возможность укладывать элементы <div> в такую структуру, которая во всём подобна таблице, а кое в чём и превосходит её. Но до тех пор таблицы рано сбрасывать со счетов.
    Ответ написан
  • Эмуляция пропусков и других БСК через NFC

    @Wallos
    Зависит от того, какую бесконтактную смарт-карту вы хотите эмулировать.

    Если речь идет о HID prox, EM-Marin и им подобные(кстати, Clamshell это всего-лишь разновидность корпуса карты), работающие на частоте 125 КГц, то ничего не выйдет.

    Эмулировать карты Mifare можно:
    Ultralight и Classic - только при наличии поддержки чипсетом аппарата. Для Classic-а потребуются ключи.
    DESFire - все несколько сложнее, но в принципе можно, если вы напишете эмулятор SAM-а, и у вас также будут все необходимые ключи.

    Теперь что касается высказывания предыдущего корреспондента относительно метро.
    В метро используются преимущественно Mifare Ultralight и никаких "проприетарных" карт там нет. Mifare является стандартом дэ факто и везде одинаков. Безусловно, Ultralight - карта тупая, но совсем не ReadOnly. У нее читаются все сектора без каких-либо трудностей. Если скачать прогу от NXP TadInfo в маркете, то можно увидеть дамп любой метрошной карты.

    В реальной жизни основная проблема копирования Mifare Classic и Ultralight состоит в том, что UID на этих картах прошивается на заводе, он уникален для каждой карты и не изменяем. И даже есть у вас есть белый пластик и есть все ключи(для Classic-а), то повторить его полностью вы не сможете из-за того же UID-а.
    Таким образом, если ваш чипсет поддерживает работу с произвольными UID-ами, то вы можете эмулировать карты Mifare при условии, что самостоятельно напишете программный эмулятор верхнего уровня.

    EMV-карты также прекрасно эмулируются, т.к. работают на той же ISO 14445 и на то есть общеизвестные приложения.

    P.S. Если я правильно понял, вопрос именно об эмуляции карт, а не об их взломе. Эмуляция подразумевает, что вся необходимая информация(ключи, идентификаторы. дампы) у вас уже есть.
    Ответ написан
  • Как на C++ нарисовать простой график или рисунок?

    RiseOfDeath
    @RiseOfDeath
    Диванный эксперт.
    Никто на современной ОС не даст вам просто так рисовать где вздумается. Это все делается через средства системы. На любом ЯП вам придется исползовать средства системы прямо (WinAPI или framebufer под *nix) или косвенно, через сторонние библиотеки и фреймворки.

    Раз уж вы пользуетесь VS - ну так и рисуйте с помощью MFC (или какой там более современный приемник у него, я малость не в теме).

    Плохой совет:
    Если вам на 1 раз, то можете пребегнуть к некрофилии и взять какой-нибудь Borland C++ Builder 6. Пользовался им на 1-м курсе - нарисовать линию на форме это 2 или 3 строчки кода.

    Хороший совет:
    Возьмите какой-нибудь актуальный фреймворк (Qt - если вам нужна мультиплатформенность, или MFC, если вам нужна только винда) и читайте его документацию.
    И у Qt и VS отличная документация.
    Ответ написан
  • Можно ли вызвать функцию из конструктора класса C++?

    jcmvbkbc
    @jcmvbkbc
    http://dilbert.com/strip/1998-08-24
    можно ли вызвать функцию из конструктора класса?

    Конечно. Есть, правда, некоторые тонкости с виртуальными функциями.

    Students::Students(std::string name, std::string last_name) 
    {                                                                                            
        Students::set_name(name); // Вызываем(создаем) функцию с фактическим параметром
        Students::set_last_name(last_name); // тоже самое. Можно ли так делать?
    }

    Имя класса (Students::) можно не добавлять к вызовам внутри функции-члена класса.

    Поля можно проинициализировать в списке инициализации конструктора. Например так:
    class Students
    {
    ...
        std::string name_;
        std::string last_name_;
    ...
    };
    
    Students::Students(const std::string& name, const std::string& last_name): name_(name), last_name_(last_name)
    {                                                                                            
    }
    Ответ написан
  • Область применения C, C++, C#?

    @larionov_n
    GameDevelopment - Enterprise.
    System Programming.
    Compilers Programming.
    Unix command line tools programming (streaming, sockets, wan, lan).
    Optimizations.
    Software Development (DB, OS, Hardware Drivers, IO, etc)

    Учитесь лучше :) не ассемблер же дают.
    Ответ написан
  • Как избавится от 'unresolved overloaded function type [int]' при работе с формами?

    vt4a2h
    @vt4a2h Куратор тега C++
    Senior software engineer (C++/Qt/boost)
    Что делать?

    Почитать документацию на функцию addItem и понять, что double она как минимум не принимает. А еще книгу просто по C++ почитать перед тем как браться за Qt.
    Ответ написан
  • Как подключить Boost к Qt Creator?

    @JustSokol Автор вопроса
    newby programmer
    В общем все решилось тем что надо было правильно записать все в файл проекта (*.pro) и нажать qmake.
    При этом хоть изначальная библиотека (asio) основана только на header`ах и имплементациях, но использует другие библиотеки Boost и соответственно подключает/включает их при подключении соответствующего .hpp .
    То есть необходимо было собрать предварительно весь буст своим компилятором в либы, либо скачать уже готовые под винду с офф сайта .
    В итоге в файл .pro добавляется
    INCLUDEPATH += C:/WORK/boost_1_59_0
    LIBS += "-LC:\WORK\boost_1_59_0\lib64-msvc-12.0"

    жмется qmake и дальше все собирается.

    ПС: получилось что сам спросил - сам ответил.
    но надеюсь зато в следующий раз кто-то быстро найдет в поисковике проблему и увидит решение.
    Ответ написан
  • Возможно ли получить в объекте «e» (error) переменную с ошибкой при использовании try catch?

    k12th
    @k12th
    console.log(`You're pulling my leg, right?`);
    Массивы в JS динамические, выйти за их пределы невозможно. Отлов undefined — ну ок, а что если в массиве и лежит undefined?
    Проще следить, чтобы индекс не превышал заданное число, с помощью обертки (обернув весь массив или сделав функцию для доступа):

    var myArr = [1, 2, 3];
    myArr.get = function (index) {
        if (index > this.length - 1) {
            throw new RangeError();
        } else {
            return this[index];
        }
    }
    Ответ написан