Как я могу предотвратить базу данных, записанную в снова, когда браузер делает перезагрузку/спину?

timeZone = value;

Здесь вы не копируете содержимое, вместо этого вы делаете timeZone для указания на value. Таким образом, timeZone будет указывать на последнее содержимое, хранящееся в value.

Что вы можете сделать, это скопировать содержимое вместо назначения указателя.

Использование strdup.

   timeZone = strdup(value);

или

   timeZone = malloc(strlen(value)+1);
   strcpy(timeZone, value);
5
задан Robert S. 20 November 2008 в 21:20
поделиться

6 ответов

Не используйте ЗАСТАВЛЯЮТ запросы делать модификации! Будьте УСПОКОИТЕЛЬНЫМИ; используйте POST (или ПОМЕСТИТЕ), вместо этого, браузер должен попросить пользователя не перезагрузить запрос. Перенаправление (использование Перенаправления HTTP) к странице получения с помощью нормального ПОЛУЧАЕТ запрос после того, как запрос POST/помещать позволит обновить страницу, не будучи предупрежденным о перепредставлении.

Править:

Я предполагаю, что пользователь зарегистрирован так или иначе, и поэтому у Вас уже есть некоторый способ отследить пользователя, например, сессию или подобный.

Вы могли сделать метку времени (или случайный хеш и т.д.) при отображении формы, хранящей его оба, поскольку, скрытое поле (только помимо анти-маркера Запроса перекрестного Сайта я уверен Вы уже, имеет там), и в переменной сеанса (ведьма хранится безопасно на Вашем сервере), когда Вы получаете запрос POST/помещать на эту форму, Вы проверяете, что метка времени совпадает с тем на сессии. Если это, Вы устанавливаете метку времени на сессии к чему-то переменному и твердому для предположения (метка времени, связанная с некоторой строкой секретного ключа, например) затем, можно сохранить данные формы. Если кто-то повторит запрос теперь, то Вы не найдете то же значение в переменной сеанса и отклоните просьбу.

Проблема с выполнением этого состоит в том, что форма недопустима, если пользователь нажимает назад для изменения чего-то, и это могло бы быть немного к резкому, если это не деньги, Вы обновляете. Таким образом, если у Вас есть проблемы с "глупыми" пользователями, которые обновляют и нажимают кнопку "Назад" таким образом случайно перерегистрация, что-то, просто с помощью POST напомнило бы им не делать это, и перенаправление сделает его менее вероятно. Если у Вас есть проблема со злонамеренными пользователями, необходимо использовать timestampt также, хотя это будет иногда смущать пользователей, хотя, если пользователи сознательно добавляет то же сообщение много раз, вероятно, необходимо найти способ запретить их. Используя POST, имея метку времени, и даже делая полное сравнение целой базы данных для проверки на дублирующиеся сообщения, не поможет вообще, если злонамеренные пользователи просто запишут сценарий, чтобы загрузить форму и отправить случайный мусор, автоматически. (Но защита перекрестного запроса сайта делает это намного тяжелее),

17
ответ дан 18 December 2019 в 05:44
поделиться

Используя POST запрос заставит браузер пытаться препятствовать тому, чтобы пользователь отправил тот же запрос снова, но я рекомендовал бы использовать основанное на сессии отслеживание транзакции некоторого вида так, чтобы, если пользователь игнорирует предупреждения от браузера и повторно отправляет его запрос, Ваше приложение предотвратило дублирование изменений в базе данных. Вы могли включать скрытый вход в форму представления с набором значений к хешу crypto и записи, которые хешируют, если запрос отправлен и обработан без ошибки.

6
ответ дан 18 December 2019 в 05:44
поделиться

Я нахожу удобным отследить количество представлений формы, которые пользователь выполнил на их сессии. Затем при рендеринге формы я создаю скрытое поле, которое содержит то число. Если пользователь затем повторно отправит форму путем нажатия кнопки "Назад", то она отправит старый #, и сервер может сказать, что пользователь уже отправил форму путем исследования того, что находится на сессии к тому, что говорит форма.

Просто мои 2 цента.

4
ответ дан 18 December 2019 в 05:44
поделиться

Если бы Вы уже не используете своего рода управление сеансами (который позволил бы Вам отметить и отследить представления формы), простое решение состояло бы в том, чтобы включать своего рода уникальный идентификатор в форму (как скрытый элемент), который является или частью самой основной транзакции DB, или прослеженный в отдельной Таблице базы данных. Затем когда Вы отправлены форма, Вы проверяете уникальный идентификатор, чтобы видеть, был ли он уже обработан. И каждый раз, когда сама форма представляется, просто необходимо удостовериться, что у Вас есть уникальный идентификатор.

1
ответ дан 18 December 2019 в 05:44
поделиться

В первую очередь, Вы не можете доверять браузеру, таким образом, любой разговор об использовании POST, а не ДОБИРАЕТСЯ, главным образом вздор компьютерного фаната. Да, клиент мог бы добраться, предупреждение вроде "Вас означало повторно отправлять эти данные снова?", но они вполне возможно собираются сказать "да, Теперь оставьте меня в покое, глупый компьютер".

И справедливо так: если Вы не хотите дублирующиеся представления, то это - Ваша проблема для решения, не пользователь.

У Вас, по-видимому, есть некоторая идея, что это означает быть дублирующимся представлением. Возможно, это - тот же IP в течение нескольких секунд, возможно, это - тот же заголовок сообщения в блоге или URL, который был недавно отправлен. Возможно, это - комбинация значений - например, IP-адрес, адрес электронной почты и тематическая рубрика представления формы контакта. Так или иначе при ручном определении некоторых дубликатов в данных необходимо ли смочь найти способ программно идентификации дубликата во время представления и любой установки флага они для ручного одобрения (если Вы не уверены), или просто сообщение submitter, "Вы дважды щелкнули?" (Если информация не является удивительно конфиденциальной, Вы могли бы представить существующую запись, которую Вы имеете для них и говорите, "Это, что Вы означали отправлять нам? Если так, Вы уже сделали это - ура"),

1
ответ дан 18 December 2019 в 05:44
поделиться

Я не полагался бы на предупреждения POST от браузера. Пользователи просто нажимают "OK", чтобы заставить сообщения уйти.

Каждый раз, когда у Вас будет запрос, который должен быть единовременным, например, 'осуществляют платеж', отправляет уникальный маркер вниз, который получает отправленную спину с запросом. Выведите маркер после того, как он возвращается, и таким образом, можно теперь сказать, когда что-то - допустимое представление (что-либо с маркером, который не 'активен'). Истеките активные маркеры после X количества времени, например, когда сеанс пользователя закончится.

(поочередно отслеживайте маркеры, которые возвратились, и если Вы получили его к тому времени, это недопустимо.)

1
ответ дан 18 December 2019 в 05:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: