php - 这个 PHP/MySQL 删除函数安全吗?

标签 php mysql security sql-delete

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

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

所以如果 URL 是:

http://www.example.com/delete.php?id=123&ref=abc

而del​​ete.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");

这是解决问题的更好方法吗?

最佳答案

  1. 您有一个 SQL 注入(inject)漏洞,因为您没有清理放入查询中的 GET 参数。攻击者可以使用它来删除表中的所有元素。
    干净的解决方案是使用 prepared Statements
    快速而肮脏的解决方案是将它们放在引号中并通过 mysql_real_escape_string 运行它们.
  2. 即使您修复了该部分,如果攻击者可以猜出有效的 id/ref 对,他也可以删除该条目。
  3. 如果一个参数是一个整数,那你为什么不把它的类型也设为整数呢?类似于 $id=intval($_GET['id'])

关于php - 这个 PHP/MySQL 删除函数安全吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6081764/

相关文章:

mysql - 每个应用程序多个数据库。这是更好的安全性吗?

php - 如何使用 Propel 类委托(delegate)

php - 创建具有多个属性的节点

mysql - 如何将文本末尾替换为列中的前面

mysql - 如何将.sql导入和导出到docker容器中的mysql或postgres

java - 小程序在安全阶段在 IE 中挂起

javascript - PayPal JavaScript SDK - 了解客户端的安全问题

PHP/MySql : How to store Select results in temporary array to fetch single items from there

php - 如何获取先前使用 curl_setopt() 设置的选项?

mysql - 归档其他表中的链接实体