飙血推荐
  • HTML教程
  • MySQL教程
  • JavaScript基础教程
  • php入门教程
  • JavaScript正则表达式运用
  • Excel函数教程
  • UEditor使用文档
  • AngularJS教程
  • ThinkPHP5.0教程

MySQL 防止 SQL 注入

时间:2021-12-04  作者:匿名  

如果您通过网页获取用户输入并将其插入到 MySQL 数据库中,则您有可能对称为SQL 注入的安全问题敞开心扉。本章将教您如何帮助防止这种情况发生,并帮助您保护脚本和 MySQL 语句。

SQL 注入通常发生在您向用户询问输入时,例如他们的姓名,而不是姓名,他们给您一条 MySQL 语句,您将在不知不觉中在数据库上运行该语句。

永远不要相信用户提供的数据,只有在验证后才处理这些数据;通常,这是通过模式匹配完成的。在下面的示例中,用户名被限制为字母数字字符加下划线和 8 到 20 个字符之间的长度 - 根据需要修改这些规则。

if (preg_match("/^\w{8,20}$/", $_GET['username'], $matches)) {
   $result = mysql_query("SELECT * FROM users WHERE username = $matches[0]");
} else  {
   echo "username not accepted";
}

为了演示这个问题,请考虑以下摘录。

// supposed input
$name = "Qadir'; DELETE FROM users;";
mysql_query("SELECT * FROM users WHERE name = '{$name}'");

该函数调用应该从 users 表中检索一条记录,其中 name 列与用户指定的名称相匹配。在正常情况下, $name 将只包含字母数字字符和空格。但是在这里,通过向$name附加一个全新的查询,对数据库的调用变成了一场灾难。注入的 DELETE 查询从用户中删除所有记录。

幸运的是,如果您使用 MySQL,mysql_query()函数不允许查询堆叠或在单个函数调用中执行多个查询。如果您尝试堆叠查询,调用将失败。

然而,其他 PHP 数据库扩展,例如SQLite和PostgreSQL,可以愉快地执行堆叠查询,执行一个字符串中提供的所有查询并造成严重的安全问题。

防止 SQL 注入

您可以在 PERL 和 PHP 等脚本语言中巧妙地处理所有转义字符。PHP 的 MySQL 扩展提供了函数mysql_real_escape_string()来转义 MySQL 特有的输入字符。

if (get_magic_quotes_gpc()) {
   $name = stripslashes($name);
}
$name = mysql_real_escape_string($name);
mysql_query("SELECT * FROM users WHERE name = '{$name}'");

为了解决 LIKE 困境,自定义转义机制必须将用户提供的 % 和 _ 字符转换为文字。使用addcslashes(),该函数可让您指定要转义的字符范围。

$sub = addcslashes(mysql_real_escape_string("%something_"), "%_");
// $sub == \%something\_
mysql_query("SELECT * FROM messages WHERE subject LIKE '{$sub}%'");
搜你所爱
MySQL教程:目录
湘ICP备14001474号-3  投诉建议:234161800@qq.com   部分内容来源于网络,如有侵权,请联系删除。