我想
问一下,当我使用 $_GET['something']] 时,我怎样才能提高安全性; ?
我的意思是,我怎样才能防止人们直接从地址栏执行这些"获取"?因为我有一个测试页面,您可以在其中获得经验值,并从XP中获得等级。
它看起来像这样:
<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="get">
<label for="addxp"><font color="yellow">Add XP:</font></label> <input type="text" name="xpadd"><br>
<input type="submit">
</form>
$xpadd = $_GET['xpadd'];
mysql_query("UPDATE users SET xp=xp + '" . $_GET['xpadd'] . "' WHERE user_id='" . $_SESSION['user_id'] . "'") ;
它正在工作,但是当我在浏览器的地址栏中输入它时:http://mywebsite.com/xp.php?xpadd=50 它为我的积分增加了 50 XP。有人可以告诉我如何防止这种情况吗?
正如你所说,任何人都可以执行这个GET
请求 - 因此你不能阻止人们这样做。
您需要在代码中验证是否允许当前登录的用户执行此类命令。只有在此验证成功后,才执行更新。
一种选择是在表中保留一个标志并检查这是设置/取消设置(取决于您的业务逻辑)
例如:
SELECT 1 FROM users WHERE user_id = ? AND is_allowed_xp_update = 1
仅当返回 true 时,才执行更新
UPDATE users SET xp = xp + ? WHERE userid = ? AND is_allowed_xp_update = 1
还使用替代数据库库,然后使用mysql_*
函数,它们已过时,并且为动态查询提供很少的安全性
基本上,你不能。有经验的用户可以读取页面的HTML代码并形成GET查询(直接在浏览器的地址栏中)或POST查询(这需要更多的工作,但仍然是可能的)。
安全服务器永远不应该信任客户端。
因此,您需要在服务器端使用一些授权代码。(从您的问题中不清楚谁可以使用addxp
,谁不能。