使用$_GET更新数据库中的数据是否不安全


Is it unsecure to use $_GET to update the data from database?

使用$_GET更新/删除MySQL表中的数据是否不安全??

我不能使用$_POST,因为它需要使用<form>标签

例如:

  <a href="status.php?approve='123'>Unapprove</a>
 <?php   
    if (isLoggedIn() && groupId() == 2) {
     if (isset($_GET['id']) && is_numeric($_GET['id']) {
      $query = $db->prepare("UPDATE table set unapprove='1' where id = :id");
      $query->bindParam(':id', $_GET['id'], PDO::PARAM_STR);
      $query->execute();
     }
    }
?>

请提供一个例子,你将如何从我的例子或更好的方式。

虽然不受SQL注入的影响,但您所做的操作并不安全,因为会受到跨站点请求伪造的影响。

考虑登录您的网站并访问另一个有此图像的网站的效果:

<img src="yoursite.com/admin/status.php?approve=123" />

理想情况下,总是对非幂等请求使用POST。

无论如何,您需要添加一个特定于会话和链接的秘密令牌:

href="status.php?approve=123&amp;token=[random_stuff]"

顺便说一句,链路中的'123'可能应该是123

不,它不安全。

只需要一个机器人程序或预缓存代理等出现并关注所有链接(这些链接应该是安全的),你就会自动获得所有未批准的内容。

使用<form>

只要验证和净化输入,它本身就不安全。输入就是输入,但记住,所有的输入都是邪恶的。还要考虑权限。您是如何控制对此的访问的?

边界检查数值数据。根据上面的代码,可以插入可能超出范围的数字。

此外,作为一种良好的实践,我总是通过mysqli_real_escape_string()(或者OOP等价物,如果你愿意的话)传递所有内容。

使用$_GET或$_POST对数据库来说并不重要,而且它也不是不安全的,因为你正在检查用户是否登录。但是它是不安全的。登录的用户可以在其浏览历史记录中有删除url,这可能会导致他们稍后访问该页面时在历史记录中意外选择资源而将其删除。

最好发布这种数据。

如果您愿意,可以创建表单而不是链接。您可以设置提交按钮的样式,使其看起来像链接。每个链接都可以创建一个表单。这样,即使没有Javascript,你也会拥有相同的功能和外观,而且与获取相比,发布仍然相对安全。