小编典典

什么是防止sql注入的最佳实践

sql

我已经做了一些研究,但仍然感到困惑,这是我的研究成果。有人可以发表评论并提出建议,告诉我如何使它们变得更好,或者是否已有可以使用的坚如磐石的实施方案?

方法1:

array_map('trim', $_GET);
array_map('stripslashes', $_GET);
array_map('mysql_real_escape_string', $_GET);

方法2:

function filter($data) {
    $data = trim(htmlentities(strip_tags($data)));

    if (get_magic_quotes_gpc())
        $data = stripslashes($data);

    $data = mysql_real_escape_string($data);

    return $data;
}

foreach($_GET as $key => $value) {
    $data[$key] = filter($value);
}

阅读 244

收藏
2021-05-23

共1个答案

小编典典

您显示的两种方法都不可取

一揽子“清理”数据会适得其反,因为需要根据数据的使用方式以不同的方式清理数据:在数据库查询中使用数据需要不同的清理方式,不同于以HTML输出或将其用作参数的方式。在命令行调用中,等等。

最好的卫生措施是在使用数据之前。这样,程序员可以轻松地查看是否所有数据实际上都已被清理。

如果使用mysql_*函数系列,请mysql_real_escape_string()对查询中使用的每个参数执行“ a ”:

$safe_name = mysql_real_escape_string($_POST["name"]);
$safe_address = mysql_real_escape_string($_POST["address"]);

$result = mysql_query ("INSERT INTO table VALUES '$safe_name', '$safe_address'");

如果使用PDOmysqli函数系列,则可以使用参数化查询,这些查询可以消除大多数SQL注入问题-
每天都可以避免。

完全可以使用编写安全查询mysql_*,也可以在PDO查询中引入安全漏洞,但是如果您是从头开始的话,请考虑立即使用PDO或mysqli。

strip_tags()仅当您计划以HTML输出用户输入的数据时才使用;请注意,您需要执行其他操作htmlspecialchars()才能可靠地防止XSS攻击。

唯一具有一定价值的全面卫生方法是

 if (get_magic_quotes_gpc())
    $data = stripslashes($data);

调用可过滤掉早期版本的PHP中现已弃用的“魔术引号”功能所增加的转义层。

2021-05-23