-2

我知道大多数答案都会说使用 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

4

2 回答 2

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 和参数化查询

于 2013-08-18T11:42:11.350 回答
1

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

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

于 2013-08-18T11:54:42.877 回答