Как я могу улучшить этот Ajax-скрипт?

#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