0

您好,我在发布之前确实使用了搜索。

我是 php/mysql 的新手,阅读量很大。已经能够制作出几个朋友都在玩的游戏。它就像一个pvp游戏。

无论如何,其中一个玩游戏的人找到了一种通过放置 . 在值的前面。我确实有去除非法字符的保护功能

function protect($string) {
    return mysql_real_escape_string(strip_tags(addslashes($string)));
}

这适用于其他角色,但不适用于 . 我不是要求有人为我做这件事,只是想指出正确的方向。

但只是把有人问到这里是我使用的代码

if(isset($_POST['buy'])){
        $sword = protect($_POST['sword']);
        $shield = protect($_POST['shield']);
        $gold_needed = (10 * $sword) + (10 * $shield);

        if($sword < 0 || $shield < 0){
            output("You must buy a positive number of weapons!");
        }elseif($stats['gold'] < $gold_needed){
            output("You do not have enough gold!");
        }else{
            $weapon['sword'] += $sword;
            $weapon['shield'] += $shield;

            $update_weapons = mysql_query("UPDATE `weapon` SET 
                                            `sword`='".$weapon['sword']."',
                                            `shield`='".$weapon['shield']."'
                                            WHERE `id`='".$_SESSION['uid']."'") or die(mysql_error());
            $stats['gold'] -= $gold_needed;
            $update_gold = mysql_query("UPDATE `stats` SET `gold`='".$stats['gold']."' 
                                        WHERE `id`='".$_SESSION['uid']."'") or die(mysql_error());
            include("update_stats.php");
            output("You have bought weapons!");
        }

如果有人能帮我一把,我将不胜感激

我确实找到了一些“字符串函数,substr 替换和 str 替换”

但我可以在 1 个查询中使用两个函数吗?对不起,我是新人

编辑***

这是在 update_stats 中发布的查询

$update_stats = mysql_query("UPDATE `stats` SET 
                            `income`='".$income."',`farming`='".$farming."',
                            `attack`='".$attack."',`defense`='".$defense."'
                            WHERE `id`='".$_SESSION['uid']."'") or die(mysql_error());
4

1 回答 1

-1

一个玩游戏的人找到了一种通过放置 . 在价值的前面

好吧,您还没有确切披露漏洞是什么,但我会冒险猜测,通过输入十进制值,它们会围绕您的定价/数学计算?那么,我应该认为有多种可能性?

if (substr($string, 0, 1) == ".") {
    //return false, warn, etc.
}

这可以进入你的“保护”功能。

同样,您可以使用 intval() 甚至 is_numeric() ...这里我只是将其添加到作业中:

$sword = protect(intval($_POST['sword']));

您还可以使用正则表达式。我假设 $value 是数字?最多多少位数?我用过5个:

if (preg_match("%\.\d{1,5}%", $sword)) { //this guy's playing w/us
   die("Go away, bad hax0rz! :-P");
}
于 2017-11-10T19:11:27.193 回答