Изменить безопасность сценария обновления на месте

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

URL-адрес этого сценария обновления можно легко просмотреть в исходном HTML-коде, а также в Firebug, поэтому мне нужно добавить какую-то проверку аутентификации перед обработкой обновления. Это, конечно, так, чтобы пользователь не мог просто передать любой старый идентификатор пользователя / поле / значение, которое они хотят, и возиться с записями других людей.

Первоначально я также передавал их имя пользователя и пароль, но это не идеально, так как он находится в запросе GET, поэтому все в URL-адресе. По крайней мере, сам сайт поддерживает SSL, но это все равно не лучшая практика.

Как лучше всего проверить подлинность этого типа обновления?

FWIW, скрипт обновления находится на PHP, а плагин Edit in Place: легкомысленный.

Редактировать: Чтобы уточнить: фактическая полезная нагрузка данных отправляется в скрипт, но плагин редактирования на месте не имеет явного метода аутентификации, поэтому я передавал аутентификацию как часть URL-адреса в скрипт обновления, который затем принимал эти переменные через ПОЛУЧИТЬ и использовать их для проверки.

Изменить 2: Да, я могу получить доступ к информации о сеансе из сценария обновления, поэтому я решил просто извлечь ранее сохраненный идентификатор пользователя и использовать его в операторе обновления базы данных. Казалось бы, это наиболее безопасный метод.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
2
0
1 229
4

Ответы 4

Чтобы передать информацию, вы должны использовать идентификатор сеанса в фактической строке GET. Таким образом, скрипт php может подключиться к сеансу, проверить пользователя и посмотреть, есть ли у пользователя права редактировать то, что он опубликовал. Затем, если у них есть права, продолжайте или возвращайте сообщение об ошибке.

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

Я думаю, вам будет лучше переключить скрипт на метод POST, поскольку большинство применений редактирования на месте будут слишком большими для практического использования GET. Вы никогда не должны использовать SessionId или пароль в качестве параметра URL-адреса, и я бы не стал использовать имя пользователя ни для чего, кроме просмотра общедоступного профиля. Если ваш URL-адрес AJAX является файлом PHP, я вполне уверен, что должен сможет получить доступ к сеансу без необходимости передавать его в массиве GET или POST. В качестве дополнительного примечания убедитесь, что вы проверяете и очищаете всю информацию перед обновлением базы данных.

Да, вы определенно можете получить доступ к сеансу, не передавая session_id при отправке. Я только что сделал это в пятницу.

MattBelanger 28.10.2008 04:51

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

VirtuosiMedia 28.10.2008 04:59

Обновление (на основе обновлений комментариев и вопросов): Вы можете передать имя пользователя / пароль как параметр submitdata в Jeditable, например:

$(".edit_area")
    .editable("http://www.example.com/save.php", { 
         submitdata: { userid:'johnsmith',  passwd:'god' }
         // ..other settings, etc.
      });

Решение Quick и грязный - грязное, потому что оно раскрывает личные данные пользователя в виде открытого текста (через View Source).

Поскольку у вас делать есть доступ к идентификатору пользователя / идентификатору сеанса на сервере, использование этого, безусловно, наиболее разумного варианта.

Хм ... поскольку вы говорите, что Jeditable использует GET, я могу только предположить, что вы используете опцию loadurl (поскольку Jeditable использует $.post() для сохранения изменений, а $.post()всегда использует POST).

Итак, пробовали ли вы переключить настройку Jeditable loadtype на «POST» и отправить имя пользователя / пароль, как раньше?

$(".edit_area")
    .editable("http://www.example.com/save.php", { 
         loadurl: 'http://www.example.com/load.php',
         loadtype: 'POST'
         // ..other settings, etc.
      });

Это звучит как быстрое и грязное решение - при условии, что у вас нет стандартной обработки пользователя / сеанса на стороне сервера.

Фактическая полезная нагрузка данных публикуется. Я просто передавал дополнительные данные через GET для аутентификации.

ila 28.10.2008 05:00

благодарю за разъяснение. Я соответствующим образом обновил свой ответ.

Már Örlygsson 28.10.2008 05:26

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

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

Пример:

$(".edit_area")
  .editable("http://www.example.com/save.php", { 
    submitdata: { 
      userid: 'johnsmith',
      pageid: '123',  // or other value unique to the page
      timestamp: '1324354657',  // time when page loaded
      hash: '0bee89b07a248e27c83fc3d5951213c1' }
    // ..other settings, etc.
});

Хеш может быть, например, MD5 'johnsmith$123$1324354657$' + $secret_salt. Перед сохранением убедитесь, что он совпадает. При желании отклонить, если прошло слишком мало или слишком много времени.

ditch-pycrypto ветвь django-magicforms реализует это как повторно используемый базовый класс формы для Django. Это напрямую не применимо к запросам AJAX, но документация и модульные тесты должны обеспечить хорошую основу для других реализаций.

Другие вопросы по теме