2012-05-21 7 views
0

Можно создать дубликат:
Preventing fraudulent submission to a scoreboard
Prevent Cheating on Javascript Gameпроблем безопасности с передачи переменного яваскрипта переменной PHP

Я нашел способ передать мое JavaScript переменных в переменный PHP с помощью используя это:

window.location.href = ".../gameover.php?points=" + points+"&speed="+window.speed; 

в gameover.php месте я использую

$_GET[speed] // and 
$_GET[points] 

, чтобы получить доступ к своим переменным. эти значения затем сохраняются в базе данных в качестве ячеек. но тут приходит моя проблема: если пользователь просто типы, например

.../gameover.php?points=500000&speed=85 

в адресной строке также сохраняет эти переменные.

Я нашел кое-что, что помогает избежать этого, но вы все равно можете обойти его. на моей главной странице я делаю cookie 'notcheated', и если пользователь посещает страницу и notcheated isset, тогда он уничтожает файл cookie и сохраняет значения в моих ястребах, но если пользователь посещает главную страницу и затем входит в вышеуказанный адрес, то cookie isset, но он не играл в игру, а затем значения также сохраняются.

У кого-то есть предложения по защите моего сайта, чтобы люди не могли просто ввести свои собственные символы.

Редактировать: Я попытался сделать это с помощью javascript, но это не сработало. возможно, я сделал что-то не так, может кто-нибудь, пожалуйста, покажет мне пример того, как я должен это делать?

ответ

0

Единственный способ предотвратить это состоит в том, чтобы логика игры выполнялась на стороне сервера, в пределах вашего кода PHP. Если вы отправляете какое-либо количество баллов от клиента на сервер, пользователь может обмануть.

Пример:

/sell.php?money=10 

выше может быть взломан путем изменения от 10 до 1000000. Вместо этого, считают это:

/sell.php?itemid=1234 

Сервер затем handes удаление элемента из инвентаря игрока , и добавляет соответствующую сумму денег на свой счет.

+0

В этой ситуации я не вижу, что быть жизнеспособным вариантом. Счет и время будут вычисляться с клиентской стороны, а затем отправляться на сервер, что означает, что серверная сторона не могла заранее знать эти значения. – Gavin

+0

@Gavin Нет никакого конкретного решения, кроме как обрабатывать его на стороне сервера - его всегда можно подделать на стороне клиента. См. Ссылки, предоставленные другими. – Polynomial

0

если ваша игра полностью основана на javascript, тогда можно сделать несколько действий, за исключением goofing с патчами; продвинутый пользователь всегда будет получать рекорды.

Если ваша игра ОТПРАВЛЯЕТ некоторое время ajax время от времени (пока в игре), вы можете взять эту информацию и поместить их в $ _SESSION, тем самым используя их также для обновления игры. , если анонимное значение отправлено между вызовами ajax, тогда пользователь каким-то образом взломал.

В конце вы можете использовать эти значения, а не вредные URL-адреса, в значениях $ _SESSION. Cookies также могут быть отключены в браузере пользователя, на них не так много.

0

Вы могли бы по крайней мере, ограничить возможный обман для продвинутых пользователей, отправив запрос POST - который не отображается в адресной строке: https://stackoverflow.com/a/133997/1106393

function post_to_url(path, params, method) { 
    method = method || "post"; // Set method to post by default, if not specified. 

    // The rest of this code assumes you are not using a library. 
    // It can be made less wordy if you use one. 
    var form = document.createElement("form"); 
    form.setAttribute("method", method); 
    form.setAttribute("action", path); 

    for(var key in params) { 
     if(params.hasOwnProperty(key)) { 
      var hiddenField = document.createElement("input"); 
      hiddenField.setAttribute("type", "hidden"); 
      hiddenField.setAttribute("name", key); 
      hiddenField.setAttribute("value", params[key]); 

      form.appendChild(hiddenField); 
     } 
    } 

    document.body.appendChild(form); 
    form.submit(); 
} 

Но это плохое решение, так как это довольно легко подделать также.

Другим решением было бы кодирование значений перед их отправкой. Поэтому неясно, что они означают. Проверьте "Javascript Base64 Encode/Decode" в Google, например:

value='1234'  // plain 
value='MTIzNA==' // base64-encoded 

JavaScript-функция для base64-кодирования можно найти здесь: https://stackoverflow.com/a/133997/1106393

На сервере вы будете использовать следующее:

$speed = base64_decode($_POST['speed']); 

http://www.php.net/manual/en/function.base64-decode.php

+0

Я попытался сделать это с помощью javascript, но это не сработало. возможно, я сделал что-то не так, может кто-нибудь, пожалуйста, покажет мне пример того, как я должен это делать? –

+0

Отметьте функцию post_to_url() в моем отредактированном сообщении. Но я бы порекомендовал base64-кодировку! – AvL

+0

проблема в том, что я использую кодировку base-64, которую люди видят в исходном coude, что я использовал это. и если они знают, что я использовал кодировку base-64, то они также знают, как ее декодировать –