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