#ajax #security
#ajax #Безопасность
Вопрос:
Я написал комбинацию PHP и javascript для администраторов, чтобы легко начислять баллы пользователям без перезагрузки страницы. Это мой первый реальный опыт использования Ajax, поэтому я хотел бы получить несколько советов по улучшению кода. Как я могу сделать его более безопасным / эффективным? Кстати, этот код виден в исходном коде html.
P.S: Если есть лучшие практики в отношении такого рода вещей, пожалуйста, дайте мне знать и разместите любые ссылки, которые у вас есть по теме.
// First pass: add the points
function addBonus()
{
document.getElementById('response').innerHTML = '<img src=images/loading2.gif></img>'; // Show that process is taking place
var xmlHttp = getXMLHttp();
xmlHttp.onreadystatechange = function()
{
if(xmlHttp.readyState == 4)
{
verifyPoints(); // Check if points have actually been given
}
}
// Generated by templating system
// Triggers call to PHP page that gives bonus points to user
var url="page.php?id=2amp;a=bonus";
xmlHttp.open("GET", url, true);
xmlHttp.send(null);
}
// Second pass: check the points have been given
function verifyPoints(){
var xmlHttp = getXMLHttp();
xmlHttp.onreadystatechange = function()
{
if(xmlHttp.readyState == 4)
{
HandleResponse(xmlHttp.responseText );
}
}
url="GetPoints.php?i=2"; // Generated by templating system
xmlHttp.open("GET", url, true);
xmlHttp.send(null);
}
function HandleResponse( response )
{
var oldPoints = parseInt(document.getElementById('numPoints').innerHTML);
var currentPoints = parseInt(response);
if( currentPoints == (oldPoints 150) ){
document.getElementById('response').innerHTML = '<img src=images/tick.png></img>'; // Bonus points added: show tick icon
} else {
document.getElementById('response').innerHTML = '<img src=images/cross.png></img>'; // Bonus points not added: show red cross icon
}
document.getElementById('numPoints').innerHTML = currentPoints; // Update points display
}
Ответ №1:
Откуда page.php?id=2amp;a=bonus
известно, что бонусные баллы начисляет настоящий администратор?
Вы думали о XSRF? Другими словами, может ли пользователь разместить что-либо на своем сайте, чтобы при посещении его администратором во время входа в систему отправлялся запрос с файлами cookie администратора, которые непреднамеренно повышают баллы.
Вы не должны использовать запросы GET для изменения вещей, таких как присвоение баллов. От http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html
Разработчики должны знать, что программное обеспечение представляет пользователя при их взаимодействии через Интернет, и должны быть осторожны, чтобы позволить пользователю быть в курсе любых действий, которые они могут предпринять, которые могут иметь неожиданное значение для них самих или других.
В частности, было установлено соглашение о том, что методы GET и HEAD НЕ ДОЛЖНЫ иметь значения для выполнения действия, отличного от извлечения. Эти методы следует считать «безопасными». Это позволяет агентам пользователя особым образом представлять другие методы, такие как POST, PUT и DELETE, чтобы пользователь был осведомлен о том, что запрашивается возможно небезопасное действие.
Все, что вызывает изменение состояния сервера, должно использовать один из неидемпотентных HTTP-методов. Вероятно, ОПУБЛИКОВАТЬ. Кстати, идемпотентная операция — это операция, которая при повторном применении к ее выходным данным дает то же самое. So f
является идемпотентным, если f(x) == f(f(x)) == f(f(f(x))
и т.д.
И, наконец
url="GetPoints.php?i=2"
задает глобальную переменную. Вы, вероятно, хотите var
впереди.
Комментарии:
1. Отличный ответ, Майк. Много информации для меня, чтобы продолжить. На данный момент page.php не проверяет, предоставляет ли администратор бонусы. Я могу либо передать идентификатор, либо превратить страницу в шаблон и выполнить там проверку. Вы правы насчет использования POST вместо GET. Вот хорошая ссылка о межсайтовых атаках: shiflett.org/articles/foiling-cross-site-attacks