【问题标题】:Sql Injection: is this code safe?Sql 注入:这段代码安全吗?
【发布时间】:2023-04-10 07:18:02
【问题描述】:

我有一个API服务器,我需要将所有get数据放入数据库

我在连接数据库后使用此代码:

foreach ($_GET as $key => $value)
$_GET[$key] = mysql_real_escape_string($value);

我的代码安全吗?

【问题讨论】:

  • 使用 PDO 就很安全了。 net.tutsplus.com/tutorials/php/…
  • 这可能是安全的。尽管请记住 mysql_* 函数已被弃用。更让我印象深刻的是一些超全球价值的变化。这真的让我想打人的脸。
  • @nathanhayfield 你刚刚给邪恶这个词赋予了新的含义。
  • @CooPer 请不要写这样的废话,它具有高度确定性的不良行为(双重转义,没有数据库时的空字符串)。花一些时间编写高质量的代码,它将减少维护负担(您和其他人)并节省将来的时间。使用 filter_input 检索 GET 字段和 MySQLi 或 PDO 与准备好的语句。

标签: php mysql


【解决方案1】:

不,您的代码不安全!因为我们看不到您如何将数据放入查询中 - 这是最重要的事情。

你可以做很多错事,比如:

$sql = "INSERT INTO {$_GET[table]} ({$_GET[column]}) VALUES ('{$_GET[value]}')";

只有最后一个值被安全转义,前两个不是!

另外,mysql_real_escape_string() 评估正在进行的数据库连接的编码设置。你以前连接过数据库吗?编码设置了吗?

最后:在真正需要之前不要逃避。过早转义会导致各种问题,因为预先转义的数据可能同时用于其他用途。

【讨论】:

  • +1。不知道为什么你把大括号放在那里。我们通常这样做是为了评估,例如获取变量变量.. 使用PDO 和准备好的语句是最好的!
【解决方案2】:

目前是这样。但请注意,所有 mysql_ 函数都已弃用,将从 PHP 中删除,不再受支持。这会带来自己的安全隐患。

考虑使用

mysqli_real_escape_string

更多信息

http://php.net/manual/en/function.mysql-real-escape-string.php

请阅读红色块并注意有关默认字符集的安全注释。适用于这两个函数。

【讨论】:

  • 看说明书的黄色框,现在真的安全吗?我的意思是,根据给定的代码,我们不知道对字符集做了什么,所以我们知道它是否安全吗?
  • 足够靠近马蹄铁或手榴弹。
  • 不,抱歉,我不同意。代码不安全。
  • @Sven 是对的。如果随后在 SQL 整数表达式 WHERE id=$id 中使用该值,则仅使用字符串转义函数将无济于事。仅当结果值用作字符串时,字符串转义才有效。上下文就是一切。
  • 我们看到的只是一个foreach循环和一个函数调用。这安全吗?假设“是”在这里不是负责任的答案。最低限度是“我不能说”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-29
  • 2013-02-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多