这是否足以阻止使用MYSQL_QUERY进行Mysql注入

时间:2013-08-18 11:38:18

标签: php mysqli code-injection

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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

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

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