2011-04-09 2 views
0

필자는 관리자가 페이지를 다시로드하지 않고도 포인트를 원활하게 제공 할 수 있도록 PHP와 javascript를 조합하여 작성했습니다. 이것은 Ajax를 사용하면서 처음으로 시도한 것이므로 코드 개선에 대한 조언이 필요합니다. 어떻게하면보다 안전하고 효율적으로 만들 수 있습니까? Btw,이 코드는 html 소스에서 볼 수 있습니다.이 Ajax 스크립트를 개선하려면 어떻게해야합니까?

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=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

어떻게 page.php?id=2&a=bonus 진짜 관리자가 보너스 포인트를주는 하나라는 것을 알고 있나요?

XSRF에 대해 생각해 보셨나요? 즉, 사용자가 사이트에 무언가를 넣어 관리자가 로그인 한 상태에서 실수로 포인트를 올린 관리자의 쿠키와 함께 요청이 전송되도록 할 수 있습니다.

포인트 지정과 같은 변경 작업에는 GET 요청을 사용하지 않아야합니다. http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html에서

구현자는 소프트웨어가 인터넷을 통해 상호 작용에서 사용자를 나타낸다는 것을 알고 있어야하고, 사용자가 예기치 않은 의미를 가질 수 그들이 취할 수있는 모든 행동을 인식 할 수 있도록주의해야 자신이나 다른 사람.

특히 GET 및 HEAD 메서드는 검색 이외의 다른 작업을 취하는 것이 중요하다는 규칙이 설정되었습니다. 이러한 방법은 "안전"하다고 간주되어야합니다. 이것은 사용 도구가 특별한 방법으로 POST, PUT, DELETE와 같은 다른 메소드를 나타낼 수있게하여 사용자가 안전하지 않은 동작이 요청되었다는 사실을 알게합니다.

서버 상태가 변경되는 원인은 멱등하지 않은 HTTP 방법 중 하나를 사용해야합니다. 아마 POST. Btw, 멱등 원 (idempotent) 연산은 출력에 다시 적용될 때 같은 것을 산출하는 연산입니다. 그래서 f 등, f(x) == f(f(x)) == f(f(f(x)) 경우

그리고 마지막으로

url="GetPoints.php?i=2" 

글로벌 변수를 설정됩니다 나무 등입니다. 아마도 var을 앞에두고 싶을 것입니다.

+0

위대한 답변 마이크. 계속할 많은 정보. 현재 page.php는 관리자가 보너스를 제공하고 있는지 확인하지 않습니다. ID를 전달하거나 페이지를 템플릿으로 만들고 거기에서 체크를 할 수 있습니다. GET 대신 POST를 사용하는 것이 옳습니다. 다음은 교차 사이트 공격에 대한 유용한 링크입니다. http://shiflett.org/articles/foiling-cross-site-attacks –

관련 문제