Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проверьте на безопасность, ошибки, криворукость, Накалякал скрипт, нужно ваше мнение 
:(
    Опции темы
Добряк
Дата 9.8.2006, 19:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 2.8.2006

Репутация: нет
Всего: нет



Я вот тут решил написать игру больше-меньше. Игра стара как мир. Кто не знает правила, вкратце опишу: даётся число, игроку надо угадать - слудующее число будет боьше или меньше, если угадал - выиграл, если нет - проиграл. Короче, проще некуда.
Но я также добавил туда проверку честности: до выбора ставки игроку выдаётся результат игры в зашифрованном виде (алгоритм MD5). Этот результат содержит и загаданное число, поэтому после завершения игры человек может сравнить данный ему изначально хэш с тем, который можно сделать из незашифрованного результата. Вообщем, вот здесь можно посмотреть: http://moreless.mcdir.ru/
Я бы хотел, чтобы вы, уважаемые программеры, посмотрели хотя бы мельком мой код и, по возможности, написали его недостатки. Прежде всего я имею ввиду безопасность (хотя авторизацию я ещё не писал, но всё же). Возможно также у вас будут идеи по более рациональному решению некоторых задач. А может где-то есть вообще лишние проверки  smile ?
Игра вроде бы простая, а кода у меня получилось немало. Но я старался везде всё комментировать. Комментарии к функциям находятся в файле functions.php.

Файл index.php
Код

<?php

session_start();

require_once('baseconnect.php'); // подключение базы
require_once('functions.php');   // подключение функций
require('stavkib.php');          // размеры ставок

// $marker - это маркер (он записывается в БД), по которому скрипт определяет,
// чья это игра

if (!isset($_POST['radio'])) {
    $zapusk = 1;              // первый шаг игры
    $user = '';               // будем считать, что игрок не залогинился
    if ($user <> '') {
        $marker = filtr($user);
    } elseif (isset($_SESSION['marker'])) {
        $marker = $_SESSION['marker'];
    } else {
        $marker = SID;
    }
    session_register('marker');
    include('sourceb.php'); // запускаем игру
} else {
    $kod = filtr($_POST['kod']); // это MD5-хэш результата игры
    $zapusk = 'empty';
    include('sourceb.php'); // определяем результат игры и записывавем его в БД
}

if ($zapusk<>'ok') {
    echo('Извините, но сейчас сыграть не удастся.<br>
        Попробуйте зайти через несколько секунд.');
} else {
    $que = mysql_fetch_array(mysql_query("SELECT * FROM `odnaigra` WHERE
                                     kodmd5='$rkod'"));
// $out = 'yes' значит, это первый шаг игры
// $out <> 'yes' значит, это второй шаг игры
    if ($out <> 'yes' && !isset($error)) {
        if ($que['stavka'] == '') {
            $error = '<br>Ваша игра не обнаружена в базе данных.
                 Если вы уверены, что всё сделали правильно,
                обратитесь к администратору сайта.<br><br>';
        } else {
            $rchislo = $que['1_number']; // первое число
            $rnumber = $que['2_number']; // второе число
            $result = $que['result'];    // выиграл или проиграл
            $rstavka = $que['stavka'];   // ставка
            $choice = $que['choice'];    // выбрал "больше" или "меньше"
            $win_amount = $que['win_amount']; // выигрыш (если проиграл, то=0)
            $rstroka = $que['stroka'];   // строка со вторым числом, MD5-хэш которой
                                      // равен $rkod (для проверки честности)
            $choice = ($choice == 'bolshe') ? 'БОЛЬШЕ' : 'МЕНЬШЕ';
            $result = ($result == 'win') ? 'выиграли '.$win_amount.'!' : 'проиграли.';

?>

<u><b>Результат</b></u>:<br><br>
Первое число: <?=$rchislo ?><br>
Загаданное число: <?=$rnumber ?><br>
Ваша ставка: <?=$rstavka ?> на <?=$choice ?><br>
Вы <?=$result ?><br><br>
Строка для проверки честности: <?=$rstroka ?><br>
(<i>загаданное число стоит перед знаком "_"</i>)<br>
Её MD5-хэш должен быть равен: <?=$rkod ?><br>

<?php
        }
    } elseif(isset($error)) {
        echo $error;
    }
?>

<hr>
<u><b>Больше\Меньше</b></u>:<br><br>
Нынешнее число: <?=$chislo ?><br>
<form action='index.php' method='post'>
Следующее число будет: больше
<input type='radio' value='1' name='radio' checked>
 или меньше
<input type='radio' value='2' name='radio'>
<input type='hidden' value='<?=$kod ?>' name='kod'> ?<br><br>
<select name='stavka'>

<?php
for ($i = 0; $i <= $posl; $i++)
 {

?>

<option value='<?=$stavki[$i] ?>'><?=$stavki[$i] ?></option>

<?php
 }

$koefb = (100/(100-$chislo))*$proc/100; // коэф. умножения при ставке на больше
$koefb = round($koefb, 2);
$koefm = (100/($chislo-1))*$proc/100; // коэф. умножения при ставке на меньше
$koefm = round($koefm, 2);

?>

</select><br><br>
<input type='submit' value='Играть!'>
</form>
MD5-хэш результата равен: <?=$kod ?><br>
При ставке на "БОЛЬШЕ" в случае выигрыша ставка умножится на: <?=$koefb ?><br>
При ставке на "МЕНЬШЕ" в случае выигрыша ставка умножится на: <?=$koefm ?><br>

<?php
}

?>

Файл sourceb.php
Код

<?php

make_seed();

// если скрипт запускается в первый раз ($zapusk=1),
// то нет смысла делать кучу проверок
/////////////////////////////////
if ($zapusk == 1) {
    $out = 'yes';
} else {
    $out = 'no';
    $radio = $_POST['radio'];
    $stavka = $_POST['stavka'];
}
/////////////////////////////////

$zapusk = 'ok'; // запуск состоялся

$proc = 91;     // процент возврата игрокам

if ($out == 'yes') { // если это первый шаг игры
    gen();
    $query = @mysql_query("SELECT * FROM `odnaigra` WHERE marker='$marker' AND result='nothing'");
    $que = @mysql_fetch_array($query);

    // есть ли у этого игрока незавершённые игры
    if ($que[0] == '') { // если нет
        @mysql_query("INSERT INTO `odnaigra` (1_number, 2_number, procent, stroka,
                                       kodmd5, result, marker)
               VALUES ($chislo, $number, $proc, '$stroka', '$kod', 'nothing',
                       '$marker')")
               or die('Извините, проблемы с базой данных. Попробуйте зайти позже.' );
    } else {           // если есть
        $chislo = $que['1_number']; // первое число
        $number = $que['2_number']; // второе число
        $stroka = $que['stroka'];   // строка, содержащая результат игры
                                    // (напр. "7_21160944d2391ed72e2", где
                                    // число 7 - это $number)

        $kod = $que['kodmd5'];      // MD5-хэш этой строки
    }
} else {           // если это второй шаг игры
    $stav = $stavka; // размер ставки
    $que = mysql_fetch_array(mysql_query("SELECT * FROM `odnaigra` WHERE
                                  kodmd5='$kod'"));
    $chislo = $que['1_number']; // первое число
    $number = $que['2_number']; // второе число
    $itog = $que['result'];     // выиграл или проиграл
                                // (здесь должно быть "nothing", т. к.
                                //  игра ещё не состоялась)
    if ($itog <> 'nothing') {
        $error = '<br>Игра уже была произведена ранее.<br>';
    }

    // здесь проверяется размер ставки: соответствует ли он одному из тех,
    // которые указаны в массиве $stavki[] ($posl - это последний номер в массиве)
    /////////////////////////////////
    for ($i = 0; $i <= $posl; $i++) {
        if ($stavki[$i] == $stav) {
            $noerror = 1;
        }
    }
    if ($noerror <> 1) {
        $error = '<br>Вы сделали неправильную ставку.<br>';
    }
    /////////////////////////////////

    $balance = $balance-$stav; // уменьшаем баланс на ставку

    if ($radio == 1) {      // если ставка была на "больше"
        bolshe();
    } elseif($radio == 2) { // если ставка была на "меньше"
        menshe();
    } else {
        $error = 'Вы не сделали выбор.';
    }

    if(!isset($error)) {
        @mysql_query("UPDATE `odnaigra` SET stavka=$stav, win_amount=$win_amount,
                                        result=$itog, choice=$radio, koef=$koef,
                                        balance=$balance
                                   WHERE kodmd5='$kod'")
                or die('Извините, проблемы с базой данных. Обновите страницу.');
    }

    $marker = $_SESSION['marker'];
    $rkod = $kod;
    $query = @mysql_query("SELECT * FROM `odnaigra` WHERE marker='$marker' AND result='nothing'");
    $que = @mysql_fetch_array($query);

    // есть ли у этого игрока незавершённые игры
    if ($que[0] == '') { // если нет
        gen();
        @mysql_query("INSERT INTO `odnaigra` (1_number, 2_number, procent, stroka,
                                          kodmd5, result, marker)
                VALUES ($chislo, $number, $proc, '$stroka', '$kod', 'nothing',
                     '$marker')")
                or die('Извините, проблемы с базой данных. Попробуйте зайти позже.'    );
    } else {           // если есть
       $chislo = $que['1_number'];
       $number = $que['2_number'];
       $stroka = $que['stroka'];
       $kod = $que['kodmd5'];
    }
}

?>

Файл functions.php
Код

<?php

// рандомизировать микросекундами (ф-я из мануала PHP)
/////////////////////////////////
function make_seed()
{
    list($usec, $sec) = explode(' ', microtime());
    return (float) $sec + ((float) $usec * 100000);
}
/////////////////////////////////

// фильтрация переменных
/////////////////////////////////
function filtr($perem)
{
    return ereg_replace("[^0-9a-zA-Z_=]|insert|delete|update/i", "", $perem);
}
/////////////////////////////////

// в этой функции выбирается "больше", если
// первое(нынешнее) число <50, а "меньше", если
// первое число >50; если же оно = 50, то выбор случаен
/////////////////////////////////
function Random1()
{
    global $chislo, $radio;
    if ($chislo < 50) {
        $radio = 1;
    } elseif($chislo > 50) {
        $radio = 2;
    } elseif($chislo == 50) {
        $radio = rand(1,2); // больше(1) или меньше(2)
    }
    return true;
}
/////////////////////////////////

// если игрок выбрал "БОЛЬШЕ"
/////////////////////////////////
function bolshe()
{
    global $radio, $number, $chislo, $koef, $proc, $win_amount,
            $stav, $balance, $itog, $kolvo;
    $radio = '\'bolshe\'';
    if ($number > $chislo) { // $chislo - это первое число
        $koef = (100/(100-$chislo))*$proc/100; // коэф. умножения ставки при выигрыше
        $koef = round($koef, 2);
        $win_amount = $stav*$koef;
        $win_amount = round($win_amount, 2);   // размер выигрыша
        $balance = $balance+$win_amount;       // увеличиваем баланс на выигрыш
        $itog = '\'win\'';  // результат=выиграл
    } else {
        $koef = 0;
        $win_amount = 0;
        $itog = '\'lose\''; // результат=проиграл
    }
    return true;
}
/////////////////////////////////

// если игрок выбрал "МЕНЬШЕ"
/////////////////////////////////
function menshe()
{
    global $radio, $number, $chislo, $koef, $proc, $win_amount,
            $stav, $balance, $itog, $kolvo;
    $radio = '\'menshe\'';
    if ($number < $chislo) {
        $koef = (100/($chislo-1))*$proc/100;
        $koef = round($koef, 2); // коэф. умножения ставки при выигрыше
        $win_amount = $stav*$koef;
        $win_amount = round($win_amount, 2); // размер выигрыша
        $balance = $balance+$win_amount; // увеличиваем баланс на выигрыш
        $itog = '\'win\''; // результат=выиграл
    } else {
        $koef = 0;
        $win_amount = 0;
        $itog = '\'lose\'';  // результат=проиграл
    }
    return true;
}
/////////////////////////////////

// генерация первого и второго(загаданного) числа,
// а также случайной строки и её MD5-хэша
/////////////////////////////////
function gen()
{
    global $chislo, $number, $stroka, $kod, $koef;
    $chislo = rand(21,80); // первое число
    $number = $chislo;
    do
     {
      $number = rand(1,100); // загаданное число
     } while($number == $chislo);
    $stroka = "$number".uniqid("_".rand(1,1000000));
    $kod = md5($stroka);
    return true;
}
/////////////////////////////////

?>

Файл stavkib.php
Код

<?php

$stavki[0] = 0.2;
$stavki[1] = 0.5;
$stavki[2] = 1;
$stavki[3] = 3;
$stavki[4] = 5;
$stavki[5] = 10;

$posl = count($stavki)-1; // последний номер в массиве

?>

PM MAIL   Вверх
jzZ
Дата 10.8.2006, 09:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 91
Регистрация: 17.7.2006

Репутация: 1
Всего: 2



Цитата

Её MD5-хэш должен быть равен: :скрыто:

Это нафига сделано, представь, что в игру зашел расслабитсья какой-нибудь офисный работник к-торый в webe ни в зуб ногой, а ты ему про md5 хэш, он больше к тебе никогда не зайдет ) испугается
PM MAIL   Вверх
Добряк
Дата 10.8.2006, 16:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 2.8.2006

Репутация: нет
Всего: нет



Цитата(jzZ @ 10.8.2006,  10:43)
Это нафига сделано, представь, что в игру зашел расслабитсья какой-нибудь офисный работник к-торый в webe ни в зуб ногой, а ты ему про md5 хэш, он больше к тебе никогда не зайдет ) испугается

Сделал, чтобы при нажатии на ссылку появлялось: http://moreless.mcdir.ru
Как, нормально?
Этот сайт я специально сделал, чтобы вы посмортреть могли скрипт в действии. Я на нём не собираюсь казино устраивать  smile .

Это сообщение отредактировал(а) Добряк - 10.8.2006, 16:39
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса

Внимание: данный раздел предназначен для решения сложных, нестандартных задач.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Для профи | Следующая тема »


 




[ Время генерации скрипта: 0.0445 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.