Intereting Posts
Можно ли использовать PDT для отладки через туннель с помощью XDebug? Использование glob () для отображения изображений из каталога, в то время как echo'ing уникальное первое изображение Как изменить действие woocommerce_before_cart PHP разделяет строку на целочисленный элемент и строку Отправить действие кнопки в зависимости от того, совпадает ли поле с другой формой Получение imagegrabscreen для работы Сообщение было сброшено в CakePHP 2.2 CakePHP: Как получить данные из двух таблиц с помощью внутреннего соединения? Вкладки Drupal $, не включая редактирование / ревизии / рабочий процесс Устранение неполадок «Нет такого файла или каталога» при запуске «php app / console doctrine: schema: create` Определить URL-адрес вызова Ajax Как получить доступ к индексу массива при использовании функции explode () в той же строке? Echo некоторый строковый и многомерный элемент массива в одной строке кода Как проксировать другую страницу в PHP Присвоение значений, напечатанных PHP CLI, переменными оболочки

таймер php, позволяющий пользователю вводить только каждые две секунды

Я программирую веб-сайт, на котором вы можете публиковать материалы. Это работает со следующим jQuery ajax:

$.ajax({ type: 'POST', url: 'action/post.php', data: 'posttext='+posttext+'&imageurl='+imageurl, success: function(feedback){ $('#feedback').val(feedback); } }); 

Теперь я задаюсь вопросом: кто-нибудь мог написать свой собственный аякс, чтобы опубликовать что-то на сайте и делать это снова и снова. Как я могу это предотвратить? Я уверен, что мне понадобится какая-то проверка безопасности в post.php – я уже слышал о HTTP-реферере, но это может быть изменено, поэтому на самом деле это не заслуживает доверия.

Кроме того, я хотел бы добавить таймер в post.php, который гарантирует, что сообщение с одного и того же ip-адреса может быть отправлено только каждые x секунд и сбрасывает таймер, если сообщение отправляется ниже x секунд (вроде переполнения стека делает это с комментариями).

Кто-нибудь знает, как защитить ajax, а также как установить таймер? Или любые другие идеи, как обеспечить механизм публикации?

Спасибо!

Деннис

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

 ipAddress, submitDate, postText, imageUrl 

По получении проверьте, есть ли запись в БД для текущего IP-адреса. Если это так, сравните дату отправки записи с текущей датой и, если она превысит ваш порог, разрешите отправку. В противном случае выпустите сообщение об ошибке и перенаправите пользователя.

Однако это все еще не является надежным, поскольку IP-адрес также может быть подделан или пользователь может скрываться за прокси-сервером.

просто сохраните IP-адрес и время запроса в файле журнала. Затем проверьте файл журнала на каждый запрос на наличие этого IP-адреса и сравните время хранения.

Вот простой скрипт, который разрешает только запрос от одного и того же IP через 10 секунд:

 $waitSeconds = 10; if (allowRequest($waitSeconds)) { // allowed echo "Welcome."; } else { // not allowed echo "Please wait at least $waitSeconds after your last request."; } echo '<hr /><a href="#" onclick="location.reload(true);return false">try again</a>'; function getLastRequestTimeDiff($ip = null, $logFile = null) { if ($ip === null) { // no specific ip provided, grab vom $_SERVER array $ip = $_SERVER["REMOTE_ADDR"]; } if ($logFile === null) { // no specific log file taken $logFile = "./lookup.log"; } if (!is_file($logFile)) { // touch file_put_contents($logFile, serialize(array())); } // read content $logContent = file_get_contents($logFile); // unserialize, check manual $lookup = unserialize($logContent); // default diff (fe for first request) $diff = 0; // current timestamp $now = time(); if (array_key_exists($ip, $lookup)) { // we know the ip, retrieve the timestamp and calculate the diff $diff = $now - $lookup[$ip]; } // set the new request time $lookup[$ip] = $now; // serialize the content $logContent = serialize($lookup); // and write it back to our log file file_put_contents($logFile, $logContent); // return diff (in seconds) return $diff; } // encapsulate our function in a more simple function (allow yes/no) function allowRequest($allowed = 10, $ip = null, $logFile = null) { $timeDiff = getLastRequestTimeDiff($ip, $logFile); return $timeDiff >= $allowed; }