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

时间:2014-04-08 00:42:10

标签: php mysql

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

当我从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值。我试图保持超级谨慎。也许我不需要这个。

我错过了什么吗?

4 个答案:

答案 0 :(得分:2)

不知道为什么有人提到它,但真正保护任何声明的最好方法是使用PreparedStatements

$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请求获取您的信息。

答案 1 :(得分:1)

首先,您需要注意sql注入。 link会给你一个想法。

其次,您可以使用javascript来获取弹出窗口,在删除前询问用户确认。

接下来,要避免无意中删除多行,请在查询中加入LIMIT 1

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

作为第一项业务,请执行以下操作......

  • 将请求方法限制为POST,甚至更好,DELETE如果可以让PHP处理它。
  • 对绑定参数使用prepared statements以避免SQL注入漏洞。

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