Php 使用$\u GET更新数据库中的数据是否不安全?

Php 使用$\u GET更新数据库中的数据是否不安全?,php,get,xss,security,Php,Get,Xss,Security,使用$\u GET更新/删除MySQL表中的数据是否不安全 我无法使用$\u POST,因为它需要使用标记 例如: <a href="status.php?approve='123'>Unapprove</a> <?php if (isLoggedIn() && groupId() == 2) { if (isset($_GET['id']) && is_numeric($_GET['id']) {

使用$\u GET更新/删除MySQL表中的数据是否不安全

我无法使用$\u POST,因为它需要使用
标记

例如:

  <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注入的影响,但您所做的事情并不安全,因为它受SQL注入的影响

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

<img src="yoursite.com/admin/status.php?approve=123" />
另外,链接中的
'123'
可能应该是
123

不,这不安全

所需要的只是一个机器人,或者一个预缓存代理,等等来跟随所有的链接(应该是安全的),你会自动得到所有未批准的东西


使用

它本身并不是不安全的,只要您验证并清理输入。输入就是输入,但记住,所有的输入都是邪恶的。还要考虑权限。你是如何控制访问权限的

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


另外,作为一种良好的实践,我总是通过mysqli\u real\u escape\u string()
(或者如果您愿意,也可以通过OOP等效工具)传递所有信息。

如果您使用$\u GET或$\u POST,这对您的数据库来说并不重要,而且这并不是不安全的,因为您正在检查用户是否登录。然而,这是不安全的。登录用户可以在其浏览历史记录中包含删除url,这可能会导致资源在以后访问该页面时由于在其历史记录中意外选择而被删除

最好发布此类数据


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

他们可能会访问使用Javascript提交表单的网站。使用POST不能防止CSRF,这是另一个问题。用户如何访问?它会有什么害处?@user
img
链接会导致对该URL的请求,导致该项目被批准(或删除,或其他任何情况)-可能用户不知道。如果我将该图像放在我自己的网站上,而你登录了你的网站,它将启动操作,就像您在浏览器中打开页面一样。@Pekka,@Denis ah。。谢谢@马蒂-他们可以,但善良的人不行。一个无害的搜索引擎索引器将跟踪链接。@GolexTroi-一个具有预缓存代理的用户可能会这样做。当谷歌将该功能添加到谷歌桌面时,许多论坛发现它们的内容被删除,因为管理员正在使用它。要使用$\u POST——在这种情况下——必须删除href并替换为输入按钮?那么jquery中的$.post()呢?@Quentin“无害”(嗯,诚实)的人也尊重robots.txt,但这不是问题所在。有很多方法可以使用身份验证/权限来防止机器人做坏事。@user622378-表单和提交按钮是一个简单的选项。使用JavaScript将违反渐进增强原则。
href="status.php?approve=123&amp;token=[random_stuff]"