#java #mysql #database #query-string
#java #mysql #База данных #строка запроса
Вопрос:
Если бы я взял строку запроса из входящего запроса HTTP в веб-приложении, сохранил ее непосредственно в базе данных MySQL, а затем использовал ее позже для повторного создания исходного URL-адреса запроса, считалось бы это нормальным?
Мне интересно, есть ли какие-либо «подводные камни», такие как специальные символы или многобайтовые символы в строке запроса, которые могут потребовать от меня кодирования данных или чего-то еще перед их сохранением.
Заранее благодарю вас.
РЕДАКТИРОВАТЬ: Мой конкретный вариант использования был бы примерно следующим. Хотя меня больше беспокоит, могут ли какие-либо специальные символы в строке запроса вызвать неожиданные проблемы.
- Пользователь отправляет форму.
- Во время обработки формы мы определяем, что пользователю необходимо подтвердить свой адрес электронной почты
- Мы отправляем пользователю электронное письмо для подтверждения и сохраняем исходную строку запроса в базе данных, потому что мы всегда хотим перенести все параметры строки запроса, которые были в запросе.
- После того, как пользователь подтвердит свой адрес электронной почты, мы перенаправляем его обратно на исходный URL формы и добавляем исходную строку запроса, чтобы обеспечить передачу параметров строки запроса.
Комментарии:
1. вам следует подробнее остановиться на вашем варианте использования и привести пример
Ответ №1:
Я не вижу в этом ничего изначально неправильного, но для меня имеет больше смысла хранить проанализированные значения вместо данных в формате querystring. Это может немного улучшить ее в будущем, например, если вы позже измените имя параметров строки запроса в своем приложении.
Разработка:
Вместо сохранения «?param1=Aamp; param2=B amp; param3 = C» в поле с именем «querystring», вероятно, было бы лучше сохранить A, B и C в трех полях с именами «Param1, Param2 и Param3.
Обновить:
Исходя из варианта использования, который вы добавили к своему вопросу, в частности, из части о том, что эти данные нужно хранить только временно, пока пользователь не подтвердит свою учетную запись, я не думаю, что есть что-то неправильное в сохранении строки запроса в формате raw. Если вы намеревались хранить эту информацию в течение длительного времени, моя первоначальная рекомендация остается в силе.
Комментарии:
1. Не могли бы вы, пожалуйста, подробнее остановиться на этом? Я не понимаю, что вы имеете в виду, говоря «хранить проанализированные значения вместо данных в формате querystring».
2. Спасибо за предложение! Я думал, что простое сохранение самой строки было своего рода «перспективным» в том смысле, что если в будущем к URL-адресу будут добавлены дополнительные значения строки запроса, мне не придется добавлять дополнительные поля для поддержки новых параметров.
3. @Jason: Это зависит от того, что означают параметры. Планируете ли вы извлекать их значения непосредственно из базы данных или планируете использовать строку исключительно для восстановления URL?
4. @Jack Рассмотрим эту строку запроса:
name=Johnamp;age=30
. Тогда вы бы хранили не саму строку, а значенияJohn
для propertyname
и30
для свойстваage
.5. Я полагаю, это в некоторой степени зависит от того, какова именно цель хранения параметров в контексте вашего приложения. Это может пойти любым путем, но я все еще думаю, что в этой ситуации лучше не хранить информацию о форматировании в БД. При таком подходе вы получаете дополнительное преимущество в том, что можете легко запрашивать параметры независимо. Кроме того, зачем использовать дополнительное пространство базы данных для имен параметров, которые предположительно не меняются?
Ответ №2:
Я бы обязательно использовал привязки к сохраненным запросам.
INSERT INTO TABLE_OF_QUERIES (field1, field2, field3) VALUES (?,?,?);
Комментарии:
1. Хорошо, я предполагаю, для предотвращения атак sql-инъекций?
2. Да 🙂 И вам не придется беспокоиться о том, что другие кавычки или специальные символы внутри вашего сохраненного запроса будут мешать работе остальной части вашей оболочки insert
Ответ №3:
Зачем останавливаться на строке запроса? Если вы хотите сохранить часть заголовка, почему бы не сохранить всю информацию заголовка, включая файлы cookie, данные post и т.д..
Комментарии:
1. Хммм … очень интересная мысль. В правильной ситуации, которая сработала бы, я просто размышляю, помогло бы это мне или нет.
Ответ №4:
Вовсе нет. Я работал в финансовом учреждении, где каждая произошедшая транзакция хранилась в базе данных, включая SQL-запрос. Это использовалось для аудита транзакций, использовалось для аудита и генерации отчетов. Кроме того, это дает хорошую историю транзакций пользователя.
Ответ №5:
Зависит от того, для чего на самом деле.
Если вы имеете дело с другим сервером, и строка запроса — это все, что у вас есть для идентификации запроса (ну, URI, но, по-видимому, вы делаете ставку на то, что остальное статично, возможно, проверьте это предположение), тогда идеально использовать то, что по сути является идентификатором, в качестве идентификатора.
Если ваш код находится на сервере, обрабатывающем сам запрос, то он не будет идеальным для многих целей, хотя может использоваться для ведения журнала и некоторых видов кэширования.
Если ваш код имеет дело с фактическими параметрами запроса, то, вероятно, нет.