Как разрешить загрузку PHP только с одного домена? - PullRequest
5 голосов
/ 06 сентября 2011

В HTML-форме, которую я написал, пользователь может загрузить файл, который отправляется при отправке с использованием ajax. Сценарий находится на exampledomain.com/upload.php.

Я хочу избежать ситуации, когда кто-то собирается создать свою собственную форму с действием, указывающим на upload.php, и начать рассылать на мой сервер несанкционированные файлы.

Каждый может заполнить мою HTML-форму, поэтому защита логина / пароля для загрузки мне не подходит. Есть ли эффективный способ убедиться, что upload.php будет запускаться только из HTML-формы на моем веб-сайте?

Одним из способов решения этой проблемы было бы использование сессий, но я не уверен, насколько хорошо он работает с ajax. Есть предложения?

Ответы [ 5 ]

3 голосов
/ 06 сентября 2011

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

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

Однако это не помешает спамерам атаковать ваш сайт, удалив одноразовые значения с вашего сайта, то есть притвориться вашими пользователями и использовать ваши настоящие формы. Для этого вы, вероятно, захотите изучить различные методы, такие как CAPTCHA s, черные списки и другие проверки.

Лично я думаю, что если вы не собираетесь использовать аутентифицированных пользователей (под которыми я подразумеваю, по крайней мере, требование CAPTCHA плюс подтверждение адреса электронной почты для регистрации пользователя, а затем требование аутентификации перед загрузкой), тогда я бы скажем, у вас будет , чтобы использовать хорошую систему CAPTCHA, возможно, в сочетании с регулярной проверкой необычной активности и выборкой загрузок для борьбы с неизбежным спамом и атаками. К сожалению, большинство популярных веб-сервисов требуют этих проверок.

(Между прочим, сеансы работают нормально с Ajax - просто убедитесь, что вы используете тот же код обработки сеансов на странице, которая отвечает на запрос Ajax. Но без аутентифицированного пользователя сеансы ничего не купят в насколько я вижу, это безопасный способ. Спамбот отлично справляется с сессиями.)

1 голос
/ 06 сентября 2011

Я хочу избежать ситуации, когда кто-то собирается создать свою собственную форму с действием, указывающим на upload.php, и начать рассылать на мой сервер несанкционированные файлы.

Это невозможно.

Как разрешить загрузку PHP только с одного домена?

Чтобы вы знали, файлы загружаются не из "домена", а просто с компьютера пользователя.

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

0 голосов
/ 06 сентября 2011

Вы также можете рассчитать размер файла, загруженного в килобайтах, присоединить это целое число к переменной сеанса и проверить эту переменную на следующей целевой странице после входа в систему!

0 голосов
/ 06 сентября 2011

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

Отправленное вычисленное значение должно совпадатьрассчитанное значение в файле upload.php, позволяющее отправить файл.

Это все еще не останавливает спам через ваш сайт.

0 голосов
/ 06 сентября 2011

лучший способ защиты от спамеров - это капча (попробуйте recaptcha). другие приемы, которые следует иметь в виду, - это уникальный код в скрытой форме (хорош для защиты от атак clrf), проверьте доменное имя с помощью $ _SERVER [''], но сравнительно легко противостоять

...