После того как накидал эскиз страницы начал выносить и подключать те части сайта которые не будут меняться такие как меню) но возникла проблема текст из подключаемых файлов сместился вниз.
Подожди, подожди... щас... телепаты устанавливают визуальный контакт с твоими файлами.
him
А не проще писать ошибки в лог, а не вываливать нервным юзверям на экран?
Да и в нормальном коде всегда знаешь, где херня может случиться. Не проще
Прежде всего почитай, как работают сессии. Конечно для каждого браузера открывается своя сессия. Что такое сессия? Это файл на сервере, в котором лежит массив $_SESSION. А имя этого файла (идентификатор сессии) записывается в куку браузера. Если юзер заходит с другого браузера, то это уже неизвестный юзер. Ты стартуешь для него сессию - и опять ты не знаешь кто он. У него есть файл сессии, но он пуст, он только готов для записи.
При выходе юзера не нужно убивать сессию - достаточно сделать ансет той переменной в сессии, по которой ты идентифицируешь юзера.
В файле проверки формы, после того как ты сверил пароль, ты стартуешь сессию и тут же смотришь, есть ли в ней userid. А откуда он там, скажи? Пользователь нажал кнопку входа, значит он неавторизован и у него нет ничего в сессии. Или у тебя авторизованные тоже видят форму входа? Зачем ему форма, если он уже авторизовался? Логично на ее месте показать кнопку "профиль".
Нет смысла держать юзер агент в базе. Авторизовался в одном браузере, заходишь с другого - там ты не авторизован. Закрыл/открыл браузер - все, неавторизован.
Хранить инфу о юзере в сочетании с его id нужно, если ты хочешь чтобы юзер мог залогиниться только в одном браузере. Но учти также, что хранить в базе UserAgent, IP и прочий хлам как есть - чистой воды расточительство. Один только юзер агент около 100 знаков.
Еще учти, что никакие данные извне нельзя вот так просто пхать в запрос. Каждый юзер для тебя не юзер, а хакер, которому нужно разрешить только то, что ты хочешь разрешить. Как минимум mysqli_real_escape_string($link, $_POST["login"]) может в синтаксисе ошибся - не суть, смысл ясен.
Для удобства вынеси подключение к базе в отдельный файл, и там же можно навалять функций для запросов, которые будут сами тебе все экранировать.
И вообще не обязательно использовать сессию. Сессия - это кука. Нет куки - нет сессии - нет авторизации. Почему бы не ставить куку, если уж у тебя есть база, где инфа на юзеров?
Еще раз, перед тем как проверять что-то в сессии, ее нужно запустить.
Вот твой алгоритм:
1. была ли нажата кнопка входа - была
2. запрос к базе по логину
3. равен ли пароль из базы паролю из формы - да, равен
4. теперь внимание! есть нет ячейки user_id в массиве $_SESSION... - конечно нет, потому что и сессии-то нет.
пробовал стартовать сессию сразу после if (isset($_POST['submit']))
то же самое
если зашел с одного браузера и, не нажимая выход, захожу с другого, то !isset($_SESSION['user_id']) истинно. Но ведь сесиия то есть на сервере.
"и если уж ты пользуешься сессией, то зачем юзер агент в базе держишь?" - разве это не способ не пускать пользователя, если сессия активна, и он заходит с другого браузера?
А сессию кто будет стартовать, перед тем как проверять в ней что-то? (Добавление)
и если уж ты пользуешься сессией, то зачем юзер агент в базе держишь?
Предлагаю сделать так: Если независимо от времени 5 раз подряд был введен неверный пароль(с учетом того, что не было успешной авторизации), тогда баним и отправляем почту и подсказываем типа "Забыли пароль?". Если пользователь знает свой пароль, то введет его хотя бы на 5ый раз. Иначе это взлом либо он просто забыл пароль. А если например 4 раза пароль неверный, а на 5-ый удалось авторизоваться, значит обнуляем счетчик и так по кругу.
Ну да, примерно так. После трех попыток показать капчу, после пяти заблокировать и отправить письмо.
Физически узнать конкретного пользователя врядли получится. Как вы сказали выше, это может быть и Вася и Петя и многие другие. Поэтому первое что приходит в голову, это запрещать авторизоваться под этим логином некоторое время.
К примеру если 5 раз к Hapson был введен неверный пароль, то доступ блокируется на час только для Hapson.
Банить айпишник и проверять юзер агенты думаю смысла нет(разве что для статистики)
Не хотел привязываться к логину, но видимо другого варианта нет.
Маша-хакер может перебирать не только пароли, но и комбинации логин/пароль.
И опять косяк...
Допустим Вася узнал логин Пети и начал подбирать пароль. Тут раз - Васю заблочили, а он ни сном и не духом... (Добавление)
Kandiar пишет:
Если у человека статический IP то его нет смысла банить по IP
Не понял смысла сей фразы.
Если у человека статический IP, то его как раз таки можно забанить по IP, но косяк в том, что под этим IP могут сидеть еще пару десятков человек.
Нет смысла банить динамические IP. А так как мы никогда не знаем о том, динамический IP или статический, да и вообще, может это прокси, то смысла банить по IP вообще нет
Столкнулся с такой вот проблемой - как организовать блокировку при N-ном количестве неудачных попыток входа на сайт?
Гуглил много, но ничего путного на эту тему нет. Все сводится к блокировке по IP или что еще хуже по целой подсети.
По сути, когда кто-то стучится в форму входа, то мы знаем UserAgent и IP, и то не факт что знаем. Блокировка по IP, UserAgent или даже их совокупности никак не подходит. Скажем сидят у нас Петя, Вася, Коля и Маша, все используют фаерфокс одной версии и все в одной локальной сети с одним внешним IP. Маша постучалась в форму 5 раз - я ее заблочил по UserAgent и IP. И что? Петя, Вася, Коля тоже получать сообщение что они исчерпали попытки входа.
Есть у кого-нибудь мысли? Или кроме IP ничего нет