Как я могу улучшить этот сценарий Ajax? - PullRequest
0 голосов
/ 10 апреля 2011

Я написал комбинацию PHP и javascript для администраторов, чтобы без проблем давать пользователям очки без перезагрузки страницы.Это мой первый опыт использования Ajax, поэтому я хотел бы получить несколько советов по улучшению кода.Как я могу сделать его более безопасным / эффективным?Между прочим, этот код виден в html-источнике.

PS: Если есть рекомендации по такого рода вещам, пожалуйста, дайте мне знать и опубликуйте любые ссылки на эту тему.

// 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=2&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 Ответ

1 голос
/ 10 апреля 2011

Как page.php?id=2&a=bonus узнает, что настоящий админ дает бонусные баллы?

Задумывались ли вы о XSRF ?Другими словами, может ли пользователь разместить что-то на своем сайте, чтобы, если администратор зашел на него, во время входа в систему, запрос отправлялся с файлами cookie администратора, которые непреднамеренно накапливали баллы.

Вы не должны использовать GETзапросы на изменение вещей, таких как назначение очков.От http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html

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

В частности, было установлено, что методы GET и HEAD НЕ ДОЛЖНЫ иметь значение действия, отличного от поиска.Эти методы следует считать «безопасными».Это позволяет пользовательским агентам представлять другие методы, такие как POST, PUT и DELETE, особым образом, чтобы пользователь знал о том, что запрашивается небезопасное действие.

Все, что вызывает изменение состояния сервера, должно использовать один из неидемпотентных методов HTTP.Вероятно, ПОСТ.Кстати, идемпотентная операция - это операция, которая при повторном применении к ее выводу дает то же самое.Так что f является идемпотентом, если f(x) == f(f(x)) == f(f(f(x)) и т. Д.

И, наконец,

url="GetPoints.php?i=2"

устанавливает глобальную переменную.Вы, вероятно, хотите var впереди.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...