Я программирую веб-сайт, на котором вы можете публиковать материалы. Это работает со следующим 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; }