#php #html #mysql #forms #security
#php #HTML #mysql #формы #Безопасность
Вопрос:
Я разрабатываю форум, подобный веб-сайту, используя php и mysql. Пользователь может задать вопрос, а другие пользователи могут ответить на него. Итак, структура таблицы моей базы данных выглядит следующим образом.
Две таблицы вопросы и ответы:
Теперь я разработал страницу для просмотра вопроса, ответов и публикации другого ответа. Поэтому, когда я вставляю строку в таблицу ответов, я также должен передать идентификатор вопроса. Этого можно просто добиться, передав идентификатор вопроса через скрытый элемент в форме. Но это небезопасно, потому что пользователь может изменить скрытое значение, и ответ закончится неправильным вопросом. Другое решение — использовать переменную сеанса для хранения идентификатора вопроса, который пользователь просматривает в данный момент. Но это также невозможно, потому что пользователь может открывать несколько вкладок, что вызовет проблемы с переменной сеанса.
Итак, как мне решить эту проблему? Я был бы очень признателен, если бы вы могли дать мне идею.
PS — Как известные форумные сайты решают эту проблему?
Комментарии:
1. зашифруйте идентификатор или разместите аутентификацию сообщения, которая привязывает его к определенной форме. Как и все веб-разработчики, считайте входные данные веб-формы ненадежными.
2. Да, я мог бы зашифровать идентификатор. Но все же оно должно храниться в скрытом элементе формы. Таким образом, пользователь все еще может манипулировать. (Возможно, он тоже мог бы расшифровать идентификатор). Не могли бы вы объяснить, что такое аутентификация сообщений?
Ответ №1:
есть еще один скрытый элемент, который имеет хэшированную версию идентификатора, на серверной части проверьте, совпадает ли хэш (так же, как вы проверяете пароль на db, я предполагаю, что вы знаете, как это работает, но я могу объяснить, если вы этого не сделаете)
Почему это имеет значение, если пользователь редактирует запрос, чтобы прокомментировать другой вопрос? единственная причина, о которой я могу думать, заключается в том, что некоторые вопросы ограничены, чтобы разрешить none / определенные комментарии, в этом случае вы уже должны обрабатывать это в серверной части.
как прокомментировал данблэк, вы всегда должны предполагать, что вводимые пользователем данные ненадежны, вы всегда должны обрабатывать подобную проверку на серверной части.
Комментарии:
1. Я мог бы хэшировать идентификатор. Но если пользователь поймет это, он может изменить как идентификатор, так и хэшированный идентификатор. Так что это все равно приведет к неправильному вопросу. Да, есть ограниченные вопросы, но я справился с этим в серверной части. Единственная проблема в том, что пользователь может изменить идентификатор вопроса, и он окажется не в том месте. Я думаю, это немного ошибочно.
2. как вы справляетесь с ограниченными вопросами в серверной части? это то, что нужно будет исправить. как правило, проверка внешнего интерфейса выполняется в интересах пользователя (сообщите им, что они пропустили поле и т. Д.), Но проверка бэкэнда в ваших интересах, вы никогда не должны полагаться на проверку внешнего интерфейса для такого рода проблем
3. Вопросы с ограниченным доступом означают, что их могут просматривать только администраторы и пользователь, задавший вопрос. Когда кто-то отправляет ответ на ограниченный вопрос, я получаю текущего пользователя через сеанс и проверяет, имеет ли он право опубликовать ответ.
4. затем запускайте эту проверку каждый раз, когда кто-то публикует комментарий в любом месте, если это неограниченный вопрос, тогда разрешенными пользователями будут все. в ограниченных и неограниченных вопросах используются одни и те же формы, верно?
5. Но проблема здесь в том, что пользователь может изменить идентификатор, и этот ответ окажется в другом общедоступном вопросе.