【问题标题】:$_GET (?add=value) security$_GET (?add=value) 安全性
【发布时间】:2013-11-02 21:18:12
【问题描述】:

我想问一下,我在使用 $_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。有人可以告诉我如何防止这种情况发生吗?

【问题讨论】:

  • 为此使用随机数:stackoverflow.com/questions/4145531/…
  • 另外,不要使用mysql_ 函数,它们已被弃用。请改用mysqli 或PDO。在插入数据库之前转义值也可能是一个好主意。见stackoverflow.com/questions/60174/…
  • 让他们能够添加 XP 是您最不必担心的,您有一个 SQL 注入 后门 - 左 宽 打开
  • 你的脚本需要检查用户此时是否允许添加XP,简单明了。这与 URL 或 $_GET 或类似的东西无关,这是您需要处理的简单业务逻辑问题。
  • 唯一安全的方法是在内部进行(全部在服务器上,而不是通过$_GET)。使用$_SESSION 或类似的东西。

标签: php html security code-injection


【解决方案1】:

正如你所说,任何人都可以执行这个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_* 函数,它们已经过时并且对动态查询几乎没有安全性

【讨论】:

    【解决方案2】:

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

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

    所以你需要一些服务器端的授权码。 (从你的问题中不清楚谁可以使用addxp,谁不可以。)

    【讨论】:

      猜你喜欢
      • 2012-01-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多