$ _GET(?add = value)安全性

时间:2013-11-02 21:18:13

标签: php html security code-injection

我想问一下,当我使用$ _GET ['something']时,如何提高安全性; ?

我的意思是,如何阻止人们直接从地址栏执行这些“获取”?因为我有一个测试页面,你可以获得XP,你可以从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。有人可以告诉我如何防止这种情况?

2 个答案:

答案 0 :(得分:2)

正如您所说,任何人都可以执行此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_*函数,它们已过时并且为动态查询提供的安全性很小

答案 1 :(得分:0)

基本上,你不能。有经验的用户可以阅读页面的HTML代码并形成GET查询(直接在浏览器的地址栏中)或POST查询(这将需要更多的工作,但仍有可能)。

安全服务器永远不应该信任客户端。

因此,您需要在服务器端使用一些授权码。 (从您的问题中不清楚谁被允许使用addxp而谁不被使用。)