Проблемы безопасности и архитектура в PHP

Моя небольшая программа, основанная на PHP, MySql, JQuery и Ajax, предоставляет логин и отображение данных из базы данных. Login.html → check-login.php → success-login.php ↔ show-data.php

Мои вопросы:

  • любые конторы безопасности, о которых я должен беспокоиться или вообще улучшить.
  • относительно $_SESSION, возможно ли, что кто-то добавляет $_SESSION['mytime'] в php файл на удаленном компьютере и делает вид, что является авторизованным пользователем?
  • Я видел видео на Youtube, утверждающее, что 80% логинов могут быть сломаны (через словарь прокси и пароля), я должен установить максимальное время, когда пользователь может войти в систему, чтобы предотвратить его или другие предложения?
  • Я могу форматировать данные на MySQL или php (на стороне сервера) или на javascript (на стороне клиента), я всегда буду делать это на стороне клиента или, например, если у вас 10 функций, 8 на стороне клиента и 2 на стороне сервера и т.д.

Мои коды перечислены ниже:

login.html(call check-login.php)

check-login.php

// connect database by PDO
// if username and password (in md5) are matched
session_start();
$_SESSION['mytime'] = time();
header('location:success-login.php');

Успех-login.php

session_start();
if(!isset($_SESSION['mytime'])) {
 header('location:login.html');
 exit;
}
//use Jquery and Ajax to fetch data from database in show-data.php

Шоу-data.php

session_start();
if(!isset($_SESSION['mytime'])) {
 header('location:login.html');
 exit;
}
//PDO database operation and return data in JSON
2 ответа

  • Существует множество проблем безопасности, таких как: Пять распространенных уязвимостей веб-приложений
  • Невозможно, чтобы пользователь установил/изменил вашу переменную $_SESSION сам.
  • Вы можете запретить пользователю выбирать простой пароль, или вы можете поместить captcha, например, за пять раз неверный ввод пароля. (Yahoo! делает) и так далее...
  • Я не получил то, что вы точно ищете.


Есть много вещей, которые вы должны иметь в виду, когда разрабатываете такое приложение. В зависимости от чувствительности данных, отображаемых в базе данных, вы можете начать использовать HTTPS-соединения вместо простого HTTP. Это то, что я обычно делаю, чтобы повысить безопасность:

  • Создайте зашифрованные сеансы - используйте mcrypt и сохраните ключ, необходимый для дешифрования сеанса на стороне клиента через файл cookie. Таким образом, даже если у кого-то в конечном итоге есть некоторый доступ к пути, где сеансы хранятся на сервере, он не сможет декодировать сеансы, потому что ключи хранятся на стороне клиента.
  • Не используйте какой-либо SQL в URL-адресах и ВСЕГДА проверьте, действительны ли представленные данные, т.е. если существует идентификатор записи, введенные данные действительны и т.д.
  • Остерегайтесь межсайтового скриптинга
  • ВСЕГДА используйте шифрование паролей, и если у вас есть конфиденциальные данные, попробуйте также шифровать.

Относительно ваших других вопросов:

  • Я не знаю, каков ваш вопрос. $_SESSION хранится на стороне сервера. Его можно изменить только сценариями, которые запускаются на этом сервере или вручную (если вы вручную отредактируете файл $_SESSION)
  • Использовать captcha (reCaptcha), когда пользователь не может войти в X раз. Если вы хотите добавить блокировку - если пользователь не сможет войти в систему в 5 раз, пользователь будет заблокирован, и электронное письмо с инструкциями разблокировки будет отправлено на адрес электронной почты пользователя.
  • Я не знаю, что именно вы подразумеваете под format (это синтаксический анализ или стилизация). Если бы я отвечал на запросы AJAX, я бы форматировал данные и выводил только данные, которые необходимо отобразить. Например, если я показываю информацию о пользователе, я бы выводил его username, first_name, last_name, email, но не его password, password_salt, bank_account и любые другие чувствительные данные.
  • В соответствии с пунктом 3 - при форматировании данных со стороны сервера вам будет показано, как отображать его. Вы можете сделать это через JavaScript или вы можете напрямую вывести его в ответ на запрос AJAX. Это зависит от вас.

Код, который вы нам предоставили, - это то, что я бы не использовал, потому что он не проверял действительного пользователя. Если пользователь имеет сеанс с переменной mytime, он предполагает, что пользователь имеет значение. Я бы сохранил user_id и password (зашифрованный) в сеансе, а затем проверить, соответствуют ли эти значения в базе данных. Таким образом, если пользователь будет удален или изменит свой пароль, все его другие сеансы станут недействительными.

licensed under cc by-sa 3.0 with attribution.