Я использую плагин jquery Редактировать на месте, который должен отправлять данные в сценарий, который будет выполнять фактическое обновление базы данных.
URL-адрес этого сценария обновления можно легко просмотреть в исходном HTML-коде, а также в Firebug, поэтому мне нужно добавить какую-то проверку аутентификации перед обработкой обновления. Это, конечно, так, чтобы пользователь не мог просто передать любой старый идентификатор пользователя / поле / значение, которое они хотят, и возиться с записями других людей.
Первоначально я также передавал их имя пользователя и пароль, но это не идеально, так как он находится в запросе GET, поэтому все в URL-адресе. По крайней мере, сам сайт поддерживает SSL, но это все равно не лучшая практика.
Как лучше всего проверить подлинность этого типа обновления?
FWIW, скрипт обновления находится на PHP, а плагин Edit in Place: легкомысленный.
Редактировать: Чтобы уточнить: фактическая полезная нагрузка данных отправляется в скрипт, но плагин редактирования на месте не имеет явного метода аутентификации, поэтому я передавал аутентификацию как часть URL-адреса в скрипт обновления, который затем принимал эти переменные через ПОЛУЧИТЬ и использовать их для проверки.
Изменить 2: Да, я могу получить доступ к информации о сеансе из сценария обновления, поэтому я решил просто извлечь ранее сохраненный идентификатор пользователя и использовать его в операторе обновления базы данных. Казалось бы, это наиболее безопасный метод.






Чтобы передать информацию, вы должны использовать идентификатор сеанса в фактической строке GET. Таким образом, скрипт php может подключиться к сеансу, проверить пользователя и посмотреть, есть ли у пользователя права редактировать то, что он опубликовал. Затем, если у них есть права, продолжайте или возвращайте сообщение об ошибке.
Я считаю, что в javascript вы можете получить идентификатор сеанса, поэтому его не нужно передавать явно.
Я думаю, вам будет лучше переключить скрипт на метод POST, поскольку большинство применений редактирования на месте будут слишком большими для практического использования GET. Вы никогда не должны использовать SessionId или пароль в качестве параметра URL-адреса, и я бы не стал использовать имя пользователя ни для чего, кроме просмотра общедоступного профиля. Если ваш URL-адрес AJAX является файлом PHP, я вполне уверен, что должен сможет получить доступ к сеансу без необходимости передавать его в массиве GET или POST. В качестве дополнительного примечания убедитесь, что вы проверяете и очищаете всю информацию перед обновлением базы данных.
Спасибо за проверку, мабви. Я думал, что ты сможешь, но прошло немного времени с тех пор, как я это сделал.
Обновление (на основе обновлений комментариев и вопросов): Вы можете передать имя пользователя / пароль как параметр 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 для аутентификации.
благодарю за разъяснение. Я соответствующим образом обновил свой ответ.
Разве сайт не уязвим для подделки межсайтовых запросов, если вы просто ищите пользователя в сеансе?
Вы можете выполнить 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, но документация и модульные тесты должны обеспечить хорошую основу для других реализаций.
Да, вы определенно можете получить доступ к сеансу, не передавая session_id при отправке. Я только что сделал это в пятницу.