保护Mysql Delete语句的最佳方法是什么


What is the best way to protect Mysql Delete statements?

我以为你们会知道最好的方法:

当我从 ORDERS 表中删除订单 ($prodId) 时,此脚本会从 ORDERED_ITEMS 表中删除所有项目排序行,该表包含从系统中的每个订单订购的所有项目。

是否有最佳实践来确保删除我想要删除的内容,并且仅此而已?我担心出现问题/注入/错误输入/输入脚本,并意外错误地删除了所有订单的所有订购项目行。

这就是我走了多远。

$delete_prod_items = mysqli_real_escape_string($con,$_REQUEST['prodId']);
if (is_numeric($delete_prod_items)){
    $sql3 = "DELETE from proteus.ordered_items where order_id = $orderId";
    mysqli_query($con,$sql3) or die('DELETE Order $orderId from the Ordered Items table failed: ' . mysqli_error($con).'<br>');     
}
  • 这个脚本是由我的表单发布的。
  • $orderID是脚本用于标识应删除哪些 ITEM 行的订单号
  • $delete_prod_item 是转义的$prodID值。我试图变得超级谨慎。也许我不需要这个。

我错过了什么吗?

不知道为什么有人提到它,但真正保护任何语句的最佳方法是使用 PreparedStatement:

$delete_prod_items = mysqli_real_escape_string($con,$_REQUEST['prodId']);
$mysqli = new mysqli("localhost", "localuser", "password", "database");
if ($mysqli->connect_errno) {
    echo "Failed to connect to MySQL: " . $mysqli->connect_error;
}
if (!($stmt = $mysqli->prepare("DELETE FROM `proteus`.`ordered_items` WHERE `order_id` = ?"))) { //whatever query you want
    echo "Prepare failed: (" . $mysqli->errno . ") " . $mysqli->error;
}
$stmt->bind_param("s", $delete_prod_items);
$stmt->execute();
$stmt->close();

还要遵循@zerkms提到的内容,并使用POST请求来获取您的信息。

首先,您需要处理SQL注入。该链接将为您提供一个想法。

其次,您可以使用javascript来获取一个弹出窗口,该弹出窗口要求用户在删除之前进行确认。

接下来,为了避免意外删除多行,请在查询中包含LIMIT 1

:注:您还可以通过创建不同的用户(用户名)来访问 mysql 数据库来限制权限,在您的mysql_connect('host', 'username', 'password', 'database')函数中使用它。如果您正在显示非常重要的内容,您可以考虑不授予删除权。

  • 转义数据有利于防止 SQL 注入
  • 最好用$_POST而不是$_REQUEST来限制请求
  • 如果此页面仅适用于管理员,那么没关系,因为只有您有权访问,但是,如果用户有权访问它,因此最好在继续删除之前对请求应用一些条件(例如,验证他们是否正在删除与其帐户相关的内容)

作为首要任务,请执行以下操作...

  • 将请求方法限制为 POST 甚至更好,如果可以让 PHP 处理它,则删除它。
  • 使用带有绑定参数的预处理语句,避免SQL注入漏洞。

您将面临的主要问题是未经授权的请求。最好的解决方案是使用 CSRF 代币。