PHP. Как сделать переход на главную страницу со страницы входа, при правильном вводе логина и пароля? [дубликат]
Сейчас выполняется проверка, через echo() при правильном вводе логина и пароля появляется ссылка на главную. Как через PHP автоматом при правильном вводе логина и пароля, перенаправлять на главную?
Отслеживать
задан 6 июн 2020 в 15:59
31 6 6 бронзовых знаков
Вы хоть код прикрепите.
6 июн 2020 в 16:01
Прикрепил код php
6 июн 2020 в 16:05
1 ответ 1
Сортировка: Сброс на вариант по умолчанию
header(‘Location: ссылка на главную’)
Отслеживать
ответ дан 6 июн 2020 в 16:03
HTMLProgrammer HTMLProgrammer
1,096 6 6 серебряных знаков 12 12 бронзовых знаков
Вставлять после проверки?
6 июн 2020 в 16:03
да, нужно относительный путь к главной
6 июн 2020 в 16:11
Как понять «относительный путь»? Можешь написать маленький код?
6 июн 2020 в 16:13
относительный никогда не надо писать
6 июн 2020 в 16:57
header(‘Location: /main.php’)
6 июн 2020 в 17:12
Связанные
Похожие
Дизайн сайта / логотип © 2023 Stack Exchange Inc; пользовательские материалы лицензированы в соответствии с CC BY-SA . rev 2023.11.15.1019
Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.
Как после авторизации автоматически перенаправляться на другую страницу?

verdex: Warning: Cannot modify header information — headers already sent by. Ругается на строку header (location).

t_timaa: надеюсь, сайт не «боевой»? Хранить пароли в открытом виде – зашквар. Использовать mysql_ – зашквар.

ПОМОГИТЕ!! Как сделать чтоб после входа перекидывало на новую страницу для авторизованного пользователя c id в ссылке и т.д ?
Вот я выделил код и показал как выглядит, перешли на страницу входа вели данные и даже страница не обновилась показаться мой профиль и выйти там видно а как бы сделать чтоб после входа перекидывало на другую страницу для авторизованного пользователя (чтоб id с быза даных брал и в URL вставлял как своя личная страница получилась и если указать в браузере эту ссылку с айти в юрл то показывался профиль) сразу же нажал войти и перекинуло на другую стр, что впихнуть туда надо чтоб все работало так ?и если можно пример наглядный что куда вставлять нужно или поменять.
Вложения

19,2 КБ Просмотры: 239

9,4 КБ Просмотры: 257

6,2 КБ Просмотры: 183
BaNru
Пацифизжу
Команда форума
Регистрация 13.11.2010 Сообщения 4 117
Как брать ID из вашей «база даных» не скажу, потому что не знаю какая она.
А редирект делается в условие else через header
. else< header('Location: /file.php?id=' . ID_FROM_DB); >
При этом надо учесть, что редирект должен быть в ДРУГОЙ ФАЙЛ, иначе зациклится.
И в общем алгоритм построен неверно. В данном случае не должно быть привязки по ID. Этот ID должен сам обрабатываться согласно куки авторизации в вашем файле file.php и не отображаться в URL.
nikt0
Member
Регистрация 13.02.2020 Сообщения 14
Как брать ID из вашей «база даных» не скажу, потому что не знаю какая она.
А редирект делается в условие else через header
. else< header('Location: /file.php?id=' . ID_FROM_DB); >
При этом надо учесть, что редирект должен быть в ДРУГОЙ ФАЙЛ, иначе зациклится.
И в общем алгоритм построен неверно. В данном случае не должно быть привязки по ID. Этот ID должен сам обрабатываться согласно куки авторизации в вашем файле file.php и не отображаться в URL.
вот бд как теперь брать ID из «базы данных»??
Вложения

41,8 КБ Просмотры: 103
BaNru
Пацифизжу
Команда форума
Регистрация 13.11.2010 Сообщения 4 117
Смотрю вы по каким-то урокам изучаете. Там разве нет?
В интернете же полно учебников и статей с такими начального уровня уроками.
PHP: mysqli::query — Manual
$name = $_GET["username"]; $name = htmlspecialchars($name); // Добавим хоть какую-то защиту $mysqli = new mysqli("localhost", "my_user", "my_password", "lesson"); // подключаемся к DB, если этого не делали $result = mysqli_query("SELECT user_id FROM signup WHERE username='$name' limit 1"); $value = mysqli_fetch_object($result); echo $value->user_id;
(В коде могут быть ошибки, не проверял)
nikt0
Member
Регистрация 13.02.2020 Сообщения 14
Смотрю вы по каким-то урокам изучаете. Там разве нет?
В интернете же полно учебников и статей с такими начального уровня уроками.
PHP: mysqli::query — Manual
$name = $_GET["username"]; $name = htmlspecialchars($name); // Добавим хоть какую-то защиту $mysqli = new mysqli("localhost", "my_user", "my_password", "lesson"); // подключаемся к DB, если этого не делали $result = mysqli_query("SELECT user_id FROM signup WHERE username='$name' limit 1"); $value = mysqli_fetch_object($result); echo $value->user_id;
(В коде могут быть ошибки, не проверял)
так как сделать чтоб просто перекидывало на другую страницу для авторизованного пользователя ?
«else header(‘Location: /file.php?id=’ . ID_FROM_DB);
>»
это чет не работает 3-2 фото , а через мету он просто обновляется бесконечно и не перекидывает
Вложения

33,7 КБ Просмотры: 62

10,9 КБ Просмотры: 63

33,8 КБ Просмотры: 58
BaNru
Пацифизжу
Команда форума
Регистрация 13.11.2010 Сообщения 4 117
Вам показывает ошибку, что перед header не должно быть никакого отображаемого кода. То есть всё что выше if надо засунуть в этот самый if.
Или правильнее сделать наоборот сначала проверку с редиректом в самом начале документа
if(isset($_COOKIE['username'])) < header('Location: /file.php?id=' . ID_FROM_DB); exit; // надо чтобы принудительно остановить выполнение кода и не писать else >//далее уже ваш код .
Проблема с метой аналогичная. Она должна быть в хедере (head) по феншую. И возможно надо указать со слешем «/profile.php»
PS Пожалуйста, не плодите одинаковые темы и не пишите КАПСом.
nikt0
Member
Регистрация 13.02.2020 Сообщения 14
Вам показывает ошибку, что перед header не должно быть никакого отображаемого кода. То есть всё что выше if надо засунуть в этот самый if.
Или правильнее сделать наоборот сначала проверку с редиректом в самом начале документа
if(isset($_COOKIE['username'])) < header('Location: /file.php?id=' . ID_FROM_DB); exit; // надо чтобы принудительно остановить выполнение кода и не писать else >//далее уже ваш код .
Проблема с метой аналогичная. Она должна быть в хедере (head) по феншую. И возможно надо указать со слешем «/profile.php»
PS Пожалуйста, не плодите одинаковые темы и не пишите КАПСом.
ну если будите помогать то не буду флудить ))
nikt0
Member
Регистрация 13.02.2020 Сообщения 14
Вам показывает ошибку, что перед header не должно быть никакого отображаемого кода. То есть всё что выше if надо засунуть в этот самый if.
Или правильнее сделать наоборот сначала проверку с редиректом в самом начале документа
if(isset($_COOKIE['username'])) < header('Location: /file.php?id=' . ID_FROM_DB); exit; // надо чтобы принудительно остановить выполнение кода и не писать else >//далее уже ваш код .
Проблема с метой аналогичная. Она должна быть в хедере (head) по феншую. И возможно надо указать со слешем «/profile.php»
PS Пожалуйста, не плодите одинаковые темы и не пишите КАПСом.
кароче чет вообще не робит я сделал как надо не кидает на стр profil.php
Вложения

60 КБ Просмотры: 51

13,1 КБ Просмотры: 55
BaNru
Пацифизжу
Команда форума
Регистрация 13.11.2010 Сообщения 4 117
в САМОЕ начало.
Я же специально написал
//далее уже ваш код
Специально привёл самый первый тег документа.
Дальше вместо ID_FROM_DB надо вставить ПЕРЕМЕННУЮ с ID полученную из базы. Как её получить писал в #4 сообщение этой темы.
nikt0
Member
Регистрация 13.02.2020 Сообщения 14
в САМОЕ начало.
Я же специально написал
//далее уже ваш код
Специально привёл самый первый тег документа.
Дальше вместо ID_FROM_DB надо вставить ПЕРЕМЕННУЮ с ID полученную из базы. Как её получить писал в #4 сообщение этой темы.
хоть в самом начало хоть там где щас стоит все равно это пусто
и айди он же сам должен брать тот на который пользователь зарегистрировался
и куда это вставлять $name = $_GET[«username»];
$name = htmlspecialchars($name); // Добавим хоть какую-то защиту
$result = mysqli_query(«SELECT user_id FROM signup WHERE username=’$name’ limit 1»);
$value = mysqli_fetch_object($result);
echo $value->user_id; так что поставил в самое начало все равно пусто где самый первый иф
Последнее редактирование: 15.02.2020
BaNru
Пацифизжу
Команда форума
Регистрация 13.11.2010 Сообщения 4 117
Вы хотите научиться или получить решение?
Если вы хотите учится, то подсказываю вам один лайфхак
В САМОМ начале файлов размещать вот такой код
Этот код будет выводить на экран ВСЕ PHP ошибки.
Со временем вы научитесь их сразу понимать, а до тех пор их можно загуглить или тут спросить.
Разумеется в будущем, когда вы будете выкладывать проект для всеобщего пользования, вывод ошибок надо наоборот запретить или выводить в файл. Но это уже другая история, которую вы узнаете позже.
Вы начали изучение немного не от туда. Изучение взаимодействия с БД надо начинать вторым этапом. Вы не научились даже элементарному синтаксису PHP. Поэтому вас сложно понять многое. Если уж начали, то уроков по написанию АВТОРИЗАЦИИ много, рекомендую парочку прочитать для начала.
хоть в самом начало хоть там где щас стоит все равно это пусто
Значит что-то не так делаете.
и айди он же сам должен брать тот на который пользователь зарегистрировался
Кто он? У вас код берёт ID из БД. Чтобы писать программу надо продумать сначала алгоритм действий, что за чем идёт. Без этого у вас ничего не получится.
Я вам напишу код (примерный), но от этого вы ничего не научитесь, вы даже не понимаете, как ID из базы привязать к переменной.
else < // Или привязываем из GET $name = $_GET["username"]; >$name = htmlspecialchars($name); // Добавим хоть какую-то защиту $mysqli = new mysqli("localhost", "my_user", "my_password", "lesson"); // подключаемся к DB, если этого не делали $result = mysqli_query("SELECT user_id FROM signup WHERE username='$name' limit 1"); // Ищем в БД $value = mysqli_fetch_object($result); // Фильтруем полученные данные, чтобы PHP понимал /* Тут надо бы ещё пароль проверить, но это уже другая история */ $id = $value->user_id; // заносим в переменную if( !empty($id) ) < // проверяем не пустая ли переменная, вдруг ID не нашёлся /* тут надо бы сохранить куку, но это тоже другая история */ header('Location: /profile.php?id=' . $id); // делаем желаемый редирект exit; // надо чтобы принудительно остановить выполнение кода и не писать else >// дальше пойдёт код, если ID не найден > //далее уже ваш код вывода формы авторизации ?> .
Последнее редактирование: 15.02.2020
nikt0
Member
Регистрация 13.02.2020 Сообщения 14
Вы хотите научиться или получить решение?
Если вы хотите учится, то подсказываю вам один лайфхак
В САМОМ начале файлов размещать вот такой код
Этот код будет выводить на экран ВСЕ PHP ошибки.
Со временем вы научитесь их сразу понимать, а до тех пор их можно загуглить или тут спросить.
Разумеется в будущем, когда вы будете выкладывать проект для всеобщего пользования, вывод ошибок надо наоборот запретить или выводить в файл. Но это уже другая история, которую вы узнаете позже.
Вы начали изучение немного не от туда. Изучение взаимодействия с БД надо начинать вторым этапом. Вы не научились даже элементарному синтаксису PHP. Поэтому вас сложно понять многое. Если уж начали, то уроков по написанию АВТОРИЗАЦИИ много, рекомендую парочку прочитать для начала.
Значит что-то не так делаете.
Кто он? У вас код берёт ID из БД. Чтобы писать программу надо продумать сначала алгоритм действий, что за чем идёт. Без этого у вас ничего не получится.
Я вам напишу код (примерный), но от этого вы ничего не научитесь, вы даже не понимаете, как ID из базы привязать к переменной.
else < // Или привязываем из GET $name = $_GET["username"]; >$name = htmlspecialchars($name); // Добавим хоть какую-то защиту $mysqli = new mysqli("localhost", "my_user", "my_password", "lesson"); // подключаемся к DB, если этого не делали $result = mysqli_query("SELECT user_id FROM signup WHERE username='$name' limit 1"); // Ищем в БД $value = mysqli_fetch_object($result); // Фильтруем полученные данные, чтобы PHP понимал /* Тут надо бы ещё пароль проверить, но это уже другая история */ $id = $value->user_id; // заносим в переменную if( !empty($id) ) < // проверяем не пустая ли переменная, вдруг ID не нашёлся /* тут надо бы сохранить куку, но это тоже другая история */ header('Location: /profile.php?id=' . $id); // делаем желаемый редирект exit; // надо чтобы принудительно остановить выполнение кода и не писать else >// дальше пойдёт код, если ID не найден > //далее уже ваш код вывода формы авторизации ?> .
@@@@@вот это@@@@@else < // Или привязываем из GET $name = $_GET["username"]; >$name = htmlspecialchars($name); // Добавим хоть какую-то защиту @@@@обязательно . @@@@ @и $result = mysqli_query("SELECT user_id FROM signup WHERE username='$name' limit 1"); // Ищем в БД $value = mysqli_fetch_object($result); // Фильтруем полученные данные, чтобы PHP понимал /* Тут надо бы ещё пароль проверить, но это уже другая история */ $id = $value->user_id; // заносим в переменную if( !empty($id) ) < // проверяем не пустая ли переменная, вдруг ID не нашёлся /* тут надо бы сохранить куку, но это тоже другая история */ header('Location: /profile.php?id=' . $id); // делаем желаемый редирект exit; // надо чтобы принудительно остановить выполнение кода и не писать else >// дальше пойдёт код, если ID не найден > //далее уже ваш код вывода формы авторизации это в САМОЕ начало ПХП . вот так как на фото Просто может авторизация в if а когда уже пользователь авторизован это else(иначе) и туда может вставить переход и в переходе из бд ади берет и кидает в свой профиль на новую стр со своим ади в стоке ?? @@@@@кароче вот код как правильно покажите я уже закалибался @@@@ else < echo 'Неверные данные - Логин/Пароль.'; >> else < echo 'Неверные данные'; >> > ?> CentPublic.ru
Важно: Входить с одного устройства в разные аккаунты строго запрещено, а иначе бана не избежать!
else < ?>Мой профиль
Выйти()
?> Регистрация
Вход
Отправка данных формы
В этой статье рассматривается, что происходит, когда пользователь отправляет форму — куда передаются данные и как мы их обрабатываем, когда они туда попадают? Мы также рассмотрим некоторые проблемы безопасности, связанные с отправкой данных формы.
| Предварительные знания: |
Базовая компьютерная грамотность, понимание HTML и базовые знания по HTTP и программированию на стороне сервера. |
| Задача: |
Понять, что происходит при отправке данных формы, в том числе получить представление о том, как данные обрабатываются на стороне сервера. |
Куда отправляются данные?
Здесь мы обсудим, что происходит с данными при отправке формы.
О клиентской/серверной архитектуре

WEB основан на очень простой клиент-серверной архитектуре, которую можно обобщить следующим образом: клиент (обычно веб-браузер) отправляет запрос на сервер (в основном веб-сервер, такой как Apache, Nginx, IIS, Tomcat, и т. д.), используя протокол HTTP. Сервер отвечает на запрос, используя тот же протокол.
На стороне клиента HTML-форма — это не более чем удобный способ настройки HTTP-запроса для отправки данных на сервер. Это позволяет пользователю предоставлять информацию для доставки в HTTP-запросе .
Примечание: Для получения более полного представления о том, как работают клиент-серверные архитектуры, ознакомьтесь с модулем «Первые шаги в программировании на стороне сервера».
На стороне клиента: определение способа отправки данных
Атрибут action
Этот атрибут определяет, куда отправляются данные. Его значение должно быть действительным URL. Если этот атрибут не указан, данные будут отправлены на URL-адрес страницы, содержащей форму.
В этом примере данные отправляются на абсолютный URL — http://foo.com :
form action="http://foo.com">form>
Здесь мы используем относительный URL — данные отправляются на другой URL на сервере:
form action="/somewhere_else">form>
form>form>
Многие старые страницы используют следующий синтаксис, чтобы указать, что данные должны быть отправлены на ту же страницу, которая содержит форму; это было необходимо, потому что до появления HTML5 атрибут action был обязательным. Это больше не нужно.
form action="#">form>
Примечание: Можно указать URL, который использует протокол HTTPS (безопасный HTTP). Когда вы делаете это, данные шифруются вместе с остальной частью запроса, даже если сама форма размещается на небезопасной странице, доступ к которой осуществляется через HTTP. С другой стороны, если форма размещается на защищённой странице, но вы указываете небезопасный URL-адрес HTTP с атрибутом action , все браузеры выдают пользователю предупреждение о безопасности при каждой попытке отправки данных, поскольку данные не шифруются.
Атрибут method
Этот атрибут определяет способ отправки данных. Протокол HTTP предоставляет несколько способов выполнить запрос; Данные HTML-формы могут передаваться несколькими различными способами, наиболее распространёнными из которых являются метод GET и метод POST .
Чтобы понять разницу между этими двумя методами, давайте вернёмся назад и рассмотрим, как работает HTTP. Каждый раз, когда вы хотите получить доступ к ресурсу в Интернете, браузер отправляет запрос на URL-адрес. HTTP-запрос состоит из двух частей: заголовка, который содержит набор глобальных метаданных о возможностях браузера, и тела, которое может содержать информацию, необходимую серверу для обработки конкретного запроса.
Метод GET
Метод GET — это метод, используемый браузером, который говорит серверу, что нужно отправить назад данный ресурс: «Эй, сервер, я хочу получить этот ресурс». В этом случае браузер отправляет пустое тело. Поскольку тело пустое, если форма отправляется с использованием данного метода, данные, отправляемые на сервер, добавляются к URL-адресу.
Рассмотрим следующую форму:
form action="http://foo.com" method="get"> div> label for="say">What greeting do you want to say?label> input name="say" id="say" value="Hi" /> div> div> label for="to">Who do you want to say it to?label> input name="to" id="to" value="Mom" /> div> div> button>Send my greetingsbutton> div> form>
Поскольку используется метод GET , вы увидите URL www.foo.com/?say=Hi&to=Mom , который появится в адресной строке браузера при отправке формы.

Данные добавляются в URL как последовательность пар имя / значение. После того, как URL веб-адрес закончился, мы добавляем знак вопроса ( ? ), за которым следуют пары имя / значение, каждая из которых разделена амперсандом ( & ). В этом случае мы передаём две части данных на сервер:
- say , со значением Hi
- to , со значением Mom
HTTP-запрос имеет следующий вид:
GET /?say=Hi&to=Mom HTTP/2.0 Host: foo.com
Примечание: вы можете найти этот пример на GitHub — смотрите get-method.html (see it live also).
Метод POST
Метод POST немного отличается. Браузер использует этот метод для связи с сервером при запросе ответа с учётом данных, представленные в теле HTTP-запроса: «Эй, сервер, взгляни на эти данные и отправь мне соответствующий результат». Если форма отправляется с использованием этого метода, данные добавляются в тело HTTP-запроса.
Давайте рассмотрим пример — это та же самая форма, которую мы рассматривали в разделе GET выше, но с атрибутом method , установленным в post .
form action="http://foo.com" method="post"> div> label for="say">What greeting do you want to say?label> input name="say" id="say" value="Hi" /> div> div> label for="to">Who do you want to say it to?label> input name="to" id="to" value="Mom" /> div> div> button>Send my greetingsbutton> div> form>
Когда форма отправляется с использованием метода POST , данные добавляются не к URL-адресу, а включаются в тело запроса. HTTP-запрос имеет следующий вид:
POST / HTTP/2.0 Host: foo.com Content-Type: application/x-www-form-urlencoded Content-Length: 13 say=Hi&to=Mom
Заголовок Content-Length указывает размер тела, а заголовок Content-Type указывает тип данных, отправляемых на сервер. Мы обсудим эти заголовки позже.
Примечание: вы можете найти этот пример на GitHub — смотрите post-method.html (see it live also).
Просмотр HTTP-запросов
HTTP-запросы никогда не отображаются пользователю (если вы хотите их видеть, вам нужно использовать такие инструменты, как Firefox Network Monitor или Chrome Developer Tools). Например, данные формы можно увидеть на вкладке Сеть (Network) в Chrome следующим образом (после отправки формы):
- Нажмите F12
- Выберите Network
- Выберите «All»
- Выберите «foo.com» во вкладке «Name»
- Выберите «Headers»
Затем вы можете получить данные формы, как показано на рисунке ниже.

Единственное, что отображается пользователю — вызываемый URL. Как упоминалось раннее, запрос с методом GET позволит пользователю увидеть информацию из запроса в URL, а запрос с методом POST не позволит. Две причины, почему это может быть важно:
- Если необходимо отправить пароль (или любую другую важную информацию), никогда не используйте метод GET , иначе рискуете отобразить эту информацию в URL-строке, что небезопасно.
- Если необходимо отправить большой объем информации, POST -метод является предпочтительным, так как некоторые браузеры ограничивают длину URL. К тому же, многие сервера так же ограничивают длину обрабатываемых URL.
На стороне сервера: получение данных
Какой бы HTTP вы не выбрали, сервер возвращает строку, которая будет последовательно проанализирована для получения данных в формате листа с парами ключ/значение. Способ получения доступа к этому листу зависит от платформы разработки или особенностей фреймворка, который вы можете использовать. Технологии, которые вы используете, определяют, как обрабатываются скопированные ключи. Часто, приоритетным является последнее полученное значение для данного ключа.
Пример: Чистый PHP
PHP предлагает несколько глобальных объектов для доступа к данным. Например, вы используете POST -метод, в приведённом ниже примере данные просто получаются и показываются пользователю. Разумеется, как использовать данные — решать только вам. Вы можете отобразить эти данные, поместить в базу данных, отправить по почте или передать эти данные куда-либо ещё.
// The global $_POST variable allows you to access the data sent with the POST method by name // To access the data sent with the GET method, you can use $_GET $say = htmlspecialchars($_POST['say']); $to = htmlspecialchars($_POST['to']); echo $say, ' ', $to; ?>
Пример показывает страницу с данными, которые мы отправили. Вы можете посмотреть это в действии в нашем файле с примером: php-example.html — который содержит те же данные, которые вы видели раньше: method : post и action из php-example.php . Когда данные переданы на отправку (submit), они переданы в форму php-example.php, которая содержит PHP код из примера выше. Когда код будет выполнен, браузер выведет (output) обработанное сообщение: Hi Mom .

Примечание: Этот пример не будет работать, когда вы загружаете его в браузер локально — браузер не может интерпретировать PHP код, после отправки данных из формы, браузер просто предложит загрузить PHP файл. Чтобы пример заработал, необходимо отправить его на PHP сервер. Для тестирования PHP на локальных серверах можете пробовать MAMP (Mac and Windows) и/или AMPPS (Mac, Windows, Linux).
Пример: Python
Этот пример показывает, как вы можете использовать Python для решения той же задачи — отобразить отправленные данные на странице. В этом примере используется Flask framework для визуализации шаблонов, поддерживающих форму отправки данных (смотри python-example.py).
from flask import Flask, render_template, request app = Flask(__name__) @app.route('/', methods=['GET', 'POST']) def form(): return render_template('form.html') @app.route('/hello', methods=['GET', 'POST']) def hello(): return render_template('greeting.html', say=request.form['say'], to=request.form['to']) if __name__ == "__main__": app.run()
Два шаблона из коде выше взаимодействуют так:
- form.html: Та же форма, что и выше The POST method , только с использованием action к > . (Это Jinja2 шаблон, который изначально HTML, но может содержать вызовы Python кода в фигурных скобках, которые запустятся веб-сервером. url_for(‘hello’) буквально говорит: после отправки данных переадресуй их в /hello .)
- greeting.html: Этот шаблон просто содержит строку, которая отображает два бита данных, переданных ему при отображении. Это сделано с помощью функции hello() , указанной выше, которая выполняется, когда запрос направляется в /hello URL.
Примечание: Опять же, этот код не будет работать, если вы просто попробуете загрузить его прямо в браузер. Python работает немного иначе, чем PHP — чтобы запустить этот код, нужно установить Python/PIP, потом установить Flask используя команду: pip3 install flask . После этого, вы сможете запустить файл из примера, используя команду: python3 python-example.py , потом открыть localhost:5000 в своём браузере.
Другие языки и фреймворки
Существует множество других серверных технологий, которые вы можете использовать для работы с формами, включая языки Perl, Java, .Net, Ruby, и прочее. Выбирайте тот, который нравится больше. К тому же, использовать вышеупомянутые технологии непосредственно, без использования фреймворков, может быть сложно. Лучше использовать один из множества высококачественных фреймворков, таких как:
- Django для Python (немного тяжеловеснее, чем Flask, но больше инструментов и опций)
- Express для Node.js
- Laravel для PHP
- Ruby On Rails для Ruby
- Phoenix для Elixir
Стоит отметить, что использование фреймворков и работа с формами — это не всегда легко. Но это намного легче, чем пытаться написать аналогичную функциональность с нуля, и это определённо сэкономит время.
Примечание: Обучению фреймворкам и работе с серверами не входит в рамки этой статьи. Если хотите узнать больше, ссылки ниже помогут в этом.
Особый случай: отправка файлов
Отправка файлов с помощью форм HTML — это особый случай. Файлы — это бинарные данные или рассматриваются как таковые, в то время как все остальные — это текстовые данные. Поскольку HTTP — это текстовый протокол, есть особые требования для работы с бинарными данными.
Атрибут enctype
Этот атрибут позволяет конкретизировать значение в Content-Type HTTP заголовок, включённый в запрос, при генерировании отправки формы. Этот заголовок очень важен, потому что указывает серверу, какой тип данных отправляется. По умолчанию это: application/x-www-form-urlencoded . На человеческом это значит: «Это форма с данными, которые были закодированы в URL параметры.»
Если хотите отправить файл, нужно сделать следующие три шага:
- Указать method атрибут POST , поскольку содержимое файла, как и сам файл, не могут быть отображены в URL параметрах.
- Установить в enctype значение multipart/form-data , потому что данные будут разбиты на несколько частей: одна часть на файл (две части на два файла), и одна часть на текстовые данные (при условии, если форма содержит поле для получения тестовых данных).
- Подключите один или более File picker (en-US) виджетов, чтобы позволить своим пользователям выбрать, какие и сколько файлов будут загружены.
form method="post" enctype="multipart/form-data"> div> label for="file">Choose a filelabel> input type="file" id="file" name="myFile" /> div> div> button>Send the filebutton> div> form>
Предупреждение: Многие сервера имеют заданные ограничения на размер загружаемых файлов и запросы от пользователей, чтобы защититься от возможных злоупотреблений. Важно проверять эти ограничения у администратора сервера, прежде чем загружать файлы.
Проблемы безопасности
Каждый раз, когда вы отправляете данные на сервер, вы должны учитывать безопасность. HTML-формы являются наиболее распространёнными векторами атак на серверы(места, где могут происходить атаки). Проблемы вытекают не из самих форм HTML, а из-за того, как сервер обрабатывает данные из этих форм.
В зависимости от того, что вы делаете, вы можете столкнуться с некоторыми очень известными проблемами безопасности:
XSS «Межсайтовый скриптинг» и CSRF «Подделка межсайтовых запросов»
Межсайтовый скриптинг (XSS «Cross Site Request Forgery») и подделка межсайтовых запросов (CSRF «Cross-Site Scripting») — это распространённые типы атак, которые происходят при отображении данных после ответа сервера или другого пользователя.
Межсайтовый скриптинг (XSS «Cross Site Request Forgery») позволяет злоумышленникам внедрить клиентский скрипт в веб-страницы, просматриваемые другими пользователями. Подделка межсайтовых запросов (CSRF «Cross-Site Scripting») может использоваться злоумышленниками для обхода средств контроля доступа, таких как одна и та же политика происхождения. Последствие от этих атак может варьироваться от мелких неудобств до значительного риска безопасности.
CSRF-атаки аналогичны XSS-атакам в том, что они начинаются одинаково — с внедрения клиентского скрипта в веб-страницы — но их конечные цели разные. Злоумышленники CSRF пытаются назначить права пользователям с более высоким уровнем прав доступа(например, администратору сайта), чтобы выполнить действие, которое они не должны выполнять (например, отправка данных ненадёжному пользователю). Атаки XSS используют доверие пользователя к веб-сайту, в то время как атаки CSRF используют доверие веб-сайта к пользователю.
Чтобы предотвратить эти атаки, вы всегда должны проверять данные, которые пользователь отправляет на ваш сервер, и (если вам нужно отобразить их) стараться не отображать HTML-контент, предоставленный пользователем. Вместо этого вы должны обработать предоставленные пользователем данные, чтобы не отображать их слово в слово. Сегодня почти все платформы на рынке реализуют минимальный «фильтр», который удаляет элементы HTML , (en-US) и (en-US) полученных от любого пользователя. Это помогает снизить риск, но не исключает его полностью.
SQL — вброс
SQL -вброс представляет собой тип атак, при которых осуществляется попытка выполнения действия с базой данных, используемой целевым веб-сайтом. В этих случаях обычно осуществляется отправка SQL-запроса в надежде, что сервер выполнит этот запрос (обычно при попытке сервера приложения сохранить данные, отправляемые пользователем). Данный вид атак является одним из самых направленных атак на веб-сайты.
Последствия могут быть ужасающими, начиная от потери данных и заканчивая утратой контроля над всей инфраструктурой веб-сайта за счёт повышения привилегий. Это очень серьёзная угроза, поэтому никогда не сохраняйте данные, отправляемые пользователем, без выполнения фильтрации данных (например, с помощью mysqli_real_escape_string() .
Вброс HTTP-заголовка и email
Эти виды атак могут проявляться, когда ваше приложение создаёт заголовки HTTP или электронные почтовые адреса на основании данных, введённых пользователем в форму. Такие атаки напрямую не повреждают сервер или пользователей, однако создают уязвимость для таких угроз, как перехват сессии, или для фишинговых атак.
Такие атаки являются самыми незаметными, но при этом могут превратить ваш сервер в зомби.
Будьте параноиком: никогда не доверяйте вашим пользователям
Как вы боретесь с такими угрозами? Этот вопрос выходит далеко за рамки данной статьи, но есть несколько общих правил, которые следует всегда соблюдать. Самое важное из них — никогда не доверяйте вашим пользователям, в том числе себе; даже проверенный пользователь может быть атакован.
Все данные, поступающие на ваш сервер, необходимо проверять и санитизировать. Все и всегда. Без исключений.
- Избегайте потенциально опасных символов. Конкретные символы, с которыми следует соблюдать осторожность, зависят от контекста, в котором используются данные, а также от используемой платформы. Однако, все языки на стороне сервера имеют соответствующие функции для обеспечения такой защиты.
- Ограничьте входящий объем данных для поступления только реально необходимых данных.
- Помещайте загруженные файлы в песочницу (храните их на другом сервере и предоставляйте доступ к файлам только через отдельный поддомен или даже через совершенно другое доменное имя).
Соблюдая эти три правила, вы сможете избежать многих/большинства проблем. При этом следует помнить, что периодически необходимо проводить анализ защищённости, желательно квалифицированной сторонней организацией. Не считайте, что вы уже сталкивались со всеми возможными угрозами.
Примечание: В статье Безопасность веб-сайта нашего раздела серверного обучения приведено подробное обсуждение упомянутых угроз и возможных способов их устранения.
Заключение
Как мы увидели, отправлять формы просто, однако защитить приложение может быть довольно трудно. Просто помните, что фронтенд разработчики не должны задавать модель безопасности для приложения. Да, как мы увидим далее, мы можем проверить данные на стороне клиента, однако сервер не может доверять этой проверке, потому что он никогда не может по-настоящему узнать что происходит на стороне клиента.
Смотрите также
Если вы хотите узнать больше об обеспечении безопасности веб-приложений, вы можете использовать следующие источники информации:
- Первые шаги в программирование веб-сайтов на стороне сервера
- Открытый проект обеспечения веб-безопасности приложений (OWASP)
- Веб-безопасность от Mozilla
- Назад (en-US)
- Обзор: Forms
- Далее (en-US)
В этом модуле
- Ваша первая HTML-форма (en-US)
- Как структурировать HTML-форму
- Предопределённые виджеты (en-US)
- Отправка данных формы
- Валидация данных формы
- Как создавать кастомные виджеты
- Отправка форм с помощью JavaScript
- HTML-формы в старых версиях браузеров (en-US)
- Стилизация HTML-форм
- Продвинутая стилизация для HTML-форм (en-US)
- Таблица совместимости свойств виджетов форм (en-US)
Found a content problem with this page?
- Edit the page on GitHub.
- Report the content issue.
- View the source on GitHub.
This page was last modified on 3 авг. 2023 г. by MDN contributors.
Your blueprint for a better internet.