php - 此查询是否受到 sql 注入(inject)的保护?

标签 php mysql sql sql-injection

<分区>

我想知道这个 sql 查询是否受到 sql 注入(inject)的保护,如果它没问题,或者我应该修改一些东西。

我尝试从 GET 绑定(bind) ID,如果一切正常,我将使用该 ID 进行实际查询。

if(isset($_GET['id']) && $_GET['id'] != null) {
  $id = $_GET['id'];

  $stmt = $mysqli->prepare('SELECT id FROM maps WHERE id = ?');
  $stmt->bind_param('i', $id);

  $stmt->execute();

  $result = $stmt->get_result();

  if (mysqli_num_rows($result) == 1)    {
    $row = $result->fetch_assoc();
      $secid = $row["id"];
  } else {
      header("LOCATION: index.php");
  }

  $sql = "SELECT 
  maps.id,
  maps.name,
  maps.description,
  maps.date,
  maps.mcversion,
  maps.mapid,
  maps.category,
  maps.format,
  maps.userid,
  users.username,
  users.rank,
  users.verified,
  users.mc_username,
  (SELECT COUNT(*) FROM likes WHERE likes.mapid = maps.id) AS likes,
  (SELECT COUNT(*) FROM downloads WHERE downloads.mapid = maps.id) AS downloads,
  (SELECT COUNT(*) FROM subscribe WHERE subscribe.channelid = maps.userid) AS subscribes,
  (SELECT COUNT(*) FROM views WHERE views.mapid = maps.id) AS views
  FROM maps
  INNER JOIN users 
      ON maps.userid = users.id
  WHERE maps.id = '$secid'";

  $result = mysqli_query($con,$sql);

  if (mysqli_num_rows($result) > 0) {
      $row = mysqli_fetch_assoc($result);
  } else {
      header("LOCATION: index.php");
  }

} else {
    header("LOCATION: index.php");
}

最佳答案

一般经验法则:如果您的查询有变量插值,就像它对 $secid 所做的那样,那么可能没有

使用带有占位符值的准备好的语句来确保您没有注入(inject)问题。其他任何事情都需要您手动调查和验证。 仔细彻底

由于 $secid 来自数据库,因此您无法确定它是什么。这可能是 VARCHAR 列,或者如果现在不是,可能在将来。这就是使 SQL 注入(inject)成为永久威胁的原因。今天有充分根据的假设在以后可能会被证明是危险的。

在这种特殊情况下,没有理由不使用占位符值。第一个查询具有可疑的实用性。第二种方法可以而且应该使用完全相同的方法,只是出现 ? 而不是值。

As a way of forcing yourself to write safe code, only use single quoted strings when defining queries. This way any accidental SQL injection becomes harmless, you'll instead get literal $ values showing up in your database instead of user data, and these are very easy to spot in testing. SQL injection bugs aren't unless you go looking for them.

关于php - 此查询是否受到 sql 注入(inject)的保护?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56957211/

相关文章:

java - 识别一个字符是中文并从简体字得到中文 "pinyin"拼音?

php - MYSQL查询显示: the first order for each customer

php - Laravel 存储库模式添加查询

mysql - 这个 SQL 语法有什么错误?

php - Mysql for 循环重复相同的结果 - 我可以在传递之前添加唯一的 ID 来查询吗?

PHP + MySQL : Big CSV file import

MySql 简单案例表达式不返回正确的数据

PHP,mysql SELECT 语句不工作

php - 当我点击删除时会显示此错误?

mysql - 如何将日志文件的每一行拆分为 SQL 列? (也许使用正则表达式进行分割)