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

    @sergey_privacy
    Админ со стажем, начинающий DevOps
    Самый надежный вариант очевиден:
    1. При нажатии на кнопку сабмита отсылаем аякс-запрос к серверу
    2. Он возвращает открытый ключ
    3. флэш или ява шифруют пароль открытым ключом на стороне браузера, отсылают серверу
    4. Сервер расшифровывает, хеширует и заносит в базу. Или не расшифровывает, а хеширует и хранит в базе пару: хешированный зашифрованный пароль и закрытый ключ.
    Ответ написан
    2 комментария
  • Как защитить пароль при передаче формы на сервер?

    Если вы хотите добиться той же надежности что и при передаче по https, то да - вариант один - реализация асимметрично шифрованного канала на уровне ajax. Не знаю есть ли библы такие.
    Если же речь идет не о регистрации (допустим первая передача пароля у вас всегда защищена) то варианты есть.
    Например сервер генерит рандомную строку и передает ее пользователю. Пользовтель вычисляет хэш от своего пароля и используя этот хэш как ключ шифрует эту рандомную строку блюфишем например (реализация на js есть точно) и передает вам обратно. Вы со своей сторны используя хэш хранимый на сервере, так же шифруете эту рандомную строку блюфишем. Сравниваете.
    Злоумышленнику придется атаковать ключ блюфиша по рандомному исходному тексту и шифротексту. Задача не из простых.
    Ответ написан
    6 комментариев
  • Как защитить пароль при передаче формы на сервер?

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

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

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

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

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

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

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

    @CAMOKPYT
    Если процессор поддерживает, то достаточно включить виртуализацию в биосе и в вбоксе все будет работать
    Ответ написан
    3 комментария
  • Как поправить "Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)" ?

    @CAMOKPYT
    Надо включить MySQL
    Ответ написан
    Комментировать
  • Почему нет ругани на модификацию стороннего куска памяти?

    Запись по невалидному указателю - это UB (undefined behavior), т.е. по стандарту произойти может что угодно. На деле просто пишется туда, куда сказали, что может вызвать как структурное исключение (SEH, не путать с обычными исключениями C++) на Windows или SIGSEGV на Unix'ах, а может и не вызвать, если по данному указателю запись возможна. Т.о. try-catch не решение по двум причинам:
    1. Исключение даже если и будет, то не C++ (хотя, к примеру, студия позволяет SEH'и ловить "обычным" catch)
    2. Исключение не гарантировано

    Проверять, что память доступна для записи в общем случае бессмысленно, так как она вполне может быть доступна, но по адресу лежит не массив, а какие-то другие данные, которые тем не менее можно перезаписать, поломав программу. Решение заключается в том, чтобы не писать туда, куда не нужно, т.е. сводить к минимуму манипулирование голыми указателями без должной осторожности и понимания.
    Ответ написан
    24 комментария
  • Объясните что это за домен will.i.am?

    @asdz
    это домен 3 уровня. т.е. узел will в домене i.am
    Ответ написан
    Комментировать
  • Как задать папку приложения в .bat?

    @386DX
    cd C:\path\to\
    start C:\path\to\file.exe
    Ответ написан
    Комментировать
  • Зачем использовать кирилические домены?

    Wimbo
    @Wimbo
    Странный вопрос.
    А почему используют разные зоны?
    https://www.reg.ru/domain/new/ вот например, зачем столько зон? Сидел бы весь рунет только в зоне .ru и норм было бы
    Ответ написан
    Комментировать
  • Как исправить ошибку с array?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Как улучшить код for? - вы начали аккаунты уже к вопросам создавать?
    Ответ написан
    2 комментария
  • Почему такая конструкция не допустима?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    ну типа да, нужно бы прогнать через strip_tags/htmlentities хотя бы при выводе. Фильтровать нужно не только пользовательский ввод, но и то вывод пользовательских данных. Пользователям, знаете ли, нельзя доверять.
    Ответ написан
    Комментировать
  • Как в PDO значение LIMIT при запросе сделать INT?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Хороший вопрос. Как раз показывает убогость стандартной системы плейсхолдеров.
    В моей библиотеке для работы c MySQL тип указывается самым простым и эффективным способом - прямо в плейсхолдере:
    //первый запрос (лимит здесь не нужен)
    $id = $db->getOne("SELECT id FROM users WHERE mail = ?s AND pass = ?s", $mail, $pass);
    // второй запрос
    $sql  = "SELECT id, name FROM news WHERE category = ?s AND subcategory = ?s LIMIT ?i";
    $news = $db->getIndCol('id', $sql, $cat, $subcat, $limit);

    Как видно из этих примеров, тип ставится в самом плейсхолдере и все входящие данные обрабатываются корректно.

    Вернемся теперь к несчастному PDO.
    Цикл с подстановкой в bindParam?

    Цикл, увы, не поможет. Потому что мы не знаем, какой тип использовать для привязки. То есть, все сведется к дефолтному PARAM_STR и в итоге мы получим то же самое execute() с массивом, только в профиль.
    Если вдруг возникнет идея определять тип по составу переменной, то делать это НИ В КОЕМ СЛУЧАЕ НЕЛЬЗЯ. Если бы мог, я бы выделил ещё большим шрифтом и красным цветом. Потому что практически каждый продвинутый пользователь похапе рано или поздно наступает на эти грабли. Если число, хранящееся в MySQL, всегда можно безопасно сравнивать со строкой, то наоборот - это будет катастрофа: MySQL будет пытаться привести содержимое поля к числу. То есть, если взять пример из вопроса, и пытаться определить тип привязки по содержимому переменной, то при введенном пароле 12345 ctype_digit() скажет нам использовать INT и в итоге пароль 12345 подойдет к любому паролю вида "12345буквы".
    Так что цикл - не вариант.

    Я читал, что можно еще отключить режим эмуляции, но я не знаю, как это повлияет на безопасность

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

    Так что либо в параметрах DSN, либо с помощью
    $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, FALSE);

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

    И последнее замечание.
    Функцию для выполнения запросов писать в общем-то нет смысла. PDO достаточно лаконичен и сам по себе. Единственное, что мешает писать однострочники - это дурацкая execute(), которая возвращает не себя, а булево значение. Но это легко исправить, и в итоге код получится ненамного длиннее, чем при вызове функции, но гораздо более гибким (ненавижу скроллинг, поэтому выношу параметры на другие строчки):
    // с функцией
    $sql   = 'SELECT `user_pass` FROM `users` WHERE `user_mail` = :mail LIMIT :lim';
    $param = array(':mail' => 'vlad-dub1994@mail.ru', ':lim' => 1);
    $data  = select($sql,$data);
    // с патченым PDO
    $data = DB::prepare($sql)->execute($data)->fetch();
    
    // или другой вариант записи
    $data = DB::prepare('SELECT user_pass FROM users WHERE user_mail = :mail LIMIT :lim')
    	->execute([':mail' => 'vlad-dub1994@mail.ru', ':lim' => 1])
    	->fetch();

    Всего на пару слов больше, но зато можно исполнять любые запросы (INSERT к примеру):
    $sql   = 'INSERT INTO users VALUES(?,?,?)';
    $param = array(NULL, 'vlad-dub1994@mail.ru', 'pass');
    DB::prepare($sql)->execute($data); //OK
    select($sql,$data); // ошибка из-за fetch()

    и использовать любые варианты получения данных, которые поддерживает PDO:
    $sql = 'SELECT id FROM tree WHERE parent_id=?';
    $subcat = DB::prepare($sql)->execute([$parent])->fetchAll(PDO::FETCH_COLUMN);
    Ответ написан
    1 комментарий
  • Где и за сколько можно закодировать код в Где и за сколько можно закодировать код в IonCube??

    opium
    @opium
    Просто люблю качественно работать
    идете на сайт ионкуба и покупаете кодер цены там все в открытом виде
    раскодировать уже средний проект почти не реально, вернее по цене привести раскодированный обфусцированный код будет стоить дороже чем написать свой такой же.
    Ответ написан
    Комментировать
  • Как осуществить регистрацию доменов в зоне .ru с оплатой через paypal?

    kmx
    @kmx
    Не так давно RU стало можно зарегистрировать у Godaddy.com
    Там как раз есть оплата картой/PayPal
    Ответ написан
    Комментировать
  • При рекламе сайта, рекламируется контент сайта или его домен?

    Nidora
    @Nidora
    Бонус 200 руб всем новым клиентам! VDS - 149 руб
    От смены хостинга ничего не изменится. Изменится, если сервер тупить будет, тогда только он-лайн падать будет.
    Ответ написан
    Комментировать
  • Как перенести купленные приложения с ios в Android?

    savostin
    @savostin
    Еще один программист
    Нет. Это разные, к тому же конкурирующие, компании.
    Ответ написан
    Комментировать
  • Подскажете ноутбук с долгим временем автономной работы?

    oia
    @oia

    0
    Не посоветуете ноутбук с длительным временем автономной работы?
    так и быть не скажем не используй ноутбук )
    Ответ написан
    4 комментария
  • Почему так не работает?

    Taraflex
    @Taraflex
    Ищу работу. Контакты в профиле.
    Ответ написан
    Комментировать