【问题标题】:Will this be enough to prevent Mysql injection using MYSQL_QUERY这是否足以防止使用 MYSQL_QUERY 进行 Mysql 注入
【发布时间】:2013-08-18 11:38:17
【问题描述】:

我知道大多数答案会说使用 PDO/Mysqli,但我正在尝试看看我是否可以这样做,然后继续学习 PDO/Mysqli:

这个功能是否足以防止mysql注入?

function anti_inject($sql)
{

    $sql = preg_replace(sql_regcase("/(from|select|insert|delete|where|drop table|show tables|#|\*|--|\\\\)/"), "", $sql);
    $sql = preg_replace("/[^a-zA-Z0-9]+/", " ", $sql);
    $sql = mysql_real_escape_string($sql);
    $sql = trim($sql);
    $sql = strip_tags($sql);
    $sql = addslashes($sql);
    $sql = strtolower($sql);
    return $sql;
}

为这一行寻找更好的替代品 $sql = preg_replace(sql_regcase("/(from|select|insert|delete|where|drop table|show tables|#|*|--|\\)/") , "", $sql);

因为我确实想检查具有“来自”“选择”“插入”游戏标签等的名称

我已经禁用了 mysql 用户的 drop table

【问题讨论】:

  • 在学习使用现代库之前,您为什么要学习使用已弃用、过时且通常很糟糕的库?
  • 这看起来就像点击电视遥控器上的每个按钮只是为了改变频道。您可能已更改频道,但您也可能已启动 DVD 播放器并将图像从彩色变为黑白。最好先检查遥控器的正确按钮。 (即阅读有关SQL injection的文档!)

标签: php mysqli code-injection


【解决方案1】:

没有。那是没有希望的。

$sql = preg_replace(sql_regcase("/(from|select|insert|delete|where|drop table|show tables|#|\*|--|\\\\)/"), "", $sql);

这会无缘无故地丢弃数据

$sql = preg_replace("/[^a-zA-Z0-9]+/", " ", $sql);

这会无缘无故地丢弃数据

$sql = mysql_real_escape_string($sql;

如果您没有丢失),那么这是转换一条数据以插入 SQL 查询的正确方法。

$sql = trim($sql);

这会无缘无故地丢弃数据

$sql = strip_tags($sql);

这会无缘无故地丢弃数据

$sql = addslashes($sql);

这会以不适合 SQL 查询的方式转义数据。由于您已经使用了 mysql_real_escape_string,因此某些数据将被双重转义(因此被破坏)。

$sql = strtolower($sql);

这会无缘无故地破坏数据。


当使用过时的、已弃用的 mysql_ 库时,mysql_real_escape_string 是您应该使用的唯一转义函数。然后,在将 SQL 字符串组合在一起时,您需要获取结果并适当地使用

不要使用mysql_。使用PDO and parameterised queries

【讨论】:

  • 我需要 strtolower,我用它来检查基于 java 的游戏中的名称,我只允许数字和字母,而且我发现在用户检查名称的情况下将所有字符变小更容易“ isSoFly"例如;所以其中两个功能是有原因的,其余的就是我一直在阅读的内容。
  • @Swaly 除了阅读一个应该了解他们阅读的内容,请注意。
  • @Swaly 谈到小写(这与任何安全性无关,因此无关紧要),mysql 已经有了与大小写无关的比较。
  • 查看您使用 mysql 的方式,不是“mysqli_ 或 PDO”,而是 PDO 准备语句
【解决方案2】:

严格来说,在 SQL 注入保护方面,这个功能非常无用,同时无法使用。虽然它可能在您的某些特定情况下为您服务,但它不能用作通用解决方案。然而,即使在这种情况下,它也是非常多余的。

那么,为什么不使用已经证明对于所有(涵盖的)案例都可以防错的解决方案 - PDO prepared statements

【讨论】:

  • 假设我使用 PDO,实际查询是否更改或仅更改代码?比如这样;这 [mysql_query("UPDATE items SET name = '$newname' WHERE index = $index LIMIT 1");] 是否会更改为 [$pdo->mysql_query("UPDATE items SET name = '$newname ' WHERE index = $index LIMIT 1");] 还是那不一样?
  • 看看我在开始使用 cmets 之前提供的链接。提前谢谢你。
猜你喜欢
  • 2017-09-24
  • 2011-10-16
  • 2012-07-30
  • 2013-08-01
  • 2016-02-19
  • 1970-01-01
  • 2011-01-08
  • 2010-10-28
  • 1970-01-01
相关资源
最近更新 更多