php - 这个 PHP/MySQL 删除功能安全吗?

原文 标签 php mysql security sql-delete

我有一个设置,我要从表中删除条目。

它基于 URL 的查询字符串,我认为无论如何这可能是一种糟糕的开始方式。

所以如果网址是:
http://www.example.com/delete.php?id=123&ref=abc
而delete.php中的php如下:

$id=$_GET['id'];
$ref=$_GET['ref'];

$con = mysql_connect("blahblah","user","password");
if (!$con)
  {
  die('Could not connect: ' . mysql_error());
  }

mysql_select_db("test", $con);

mysql_query("DELETE FROM mytable WHERE id=" . $id . " AND ref='" . $ref . "'");

mysql_close($con);

有没有办法让它更安全……或者这确实在任何方面都安全?

编辑:

好的,所以根据反馈,我采取了一种新方法。

list.php 为表中的每个条目包含一组单选按钮 - 如下:
$con = mysql_connect("localhost","username","password");
if (!$con)
  {
  die('Could not connect: ' . mysql_error());
  }

mysql_select_db("db", $con);

$result = mysql_query("SELECT * FROM myTable");

echo "<form name='wer' id='wer' action='delete.php' method='post' >";

echo "<table border='1'>";

while($row = mysql_fetch_array($result))
  {
  echo "<tr>";
  echo "<td>" . $row['title'] . "</td>";
  echo "<td><input type='radio' name='test1' value='" . $row['id'] . "' /></td>";
  echo "</tr>";
  }
echo "</table>";
echo "<input type='submit' name='submit' value='Submit' />";
echo "</form>";

mysql_close($con);

delete.php 看起来像这样:
function check_input($value) {
    if (get_magic_quotes_gpc()) {
        $value = stripslashes($value);
    }
    if (!is_numeric($value)) {
        $value = "'" . mysql_real_escape_string($value) . "'";
    }
    return $value;
}

$con = mysql_connect("localhost","user","password");

if (!$con) {
    die('Could not connect: ' . mysql_error());
}

$varID = check_input($_POST["id"]);

mysql_select_db("db", $con);

$sql="DELETE FROM myTable WHERE id IN (" . $varID . ")";

if (!mysql_query($sql,$con)) {
    die('Error: ' . mysql_error());
}

mysql_close($con);

header("Location: list.php");

这是一个更好的方法吗?

最佳答案

  • 您存在 SQL 注入(inject)漏洞,因为您没有清理放入查询中的 GET 参数。攻击者可以使用它来删除表中的所有元素。
    对此的干净解决方案是使用 prepared Statements .
    快速而肮脏的解决方案是将它们放在引号中并通过 mysql_real_escape_string 运行它们。 .
  • 即使你修复了那个部分,如果攻击者可以猜出一个有效的 id/ref配对他可以删除该条目。
  • 如果参数是整数,那么为什么不将其类型也设为整数呢?类似 $id=intval($_GET['id'])
  • 关于php - 这个 PHP/MySQL 删除功能安全吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6081764/

    相关文章:

    php - nginx: [emerg] "location"指令在/etc/nginx/conf.d/default.conf:1 中是不允许的

    php - PHP MySQL下拉列表

    javascript - 保护单页 js 应用程序中的 UI

    python - 如何防止Gunicorn尊重客户发起的重新谈判?

    java - 登录成功后,Spring Oauth和安全重定向到/login

    php - 如何在 View Yii 中调用模型函数?

    php - 通过PHP获取厂商提供的硬盘序列号

    php - MySQL数据库和导入日期问题

    mysql - 设置存储过程参数时,mysql语法错误

    php - mySQL 按占位符排序