有效的SQL注入保护功能

Effective protection function against SQL injection

我在一个免费软件中发现了这个清理功能:

function VerifChamps($valeur)
{
$verif = (get_magic_quotes_gpc()) ? htmlentities($valeur, ENT_QUOTES) : addslashes($valeur);
return $verif;
}

然后查询是这样完成的:

$login=VerifChamps($_POST['name']);

mysql_select_db(..., ...);
$query = sprintf("SELECT * FROM table WHERE login='%s'", $login);

$Result = mysql_query($query, $connexion) or die(mysql_error());
$row_RsProf = mysql_fetch_assoc($Result);
mysql_free_result($Result);

这段代码安全吗?如何改进它以使其更加安全?

编辑:服务器是 运行 PHP v5.2.13,开启了 Magic Quotes

您想使用准备好的语句

http://www.w3schools.com/php/php_mysql_prepared_statements.asp

很多天以来,我一直在使用 mysqli_real_escape_string 功能。避免sql注入是一个很好的功能。

并且,请避免 mysql extension.This 扩展程序将来会被删除。相反,应该使用 MySQLi or PDO_MySQL 扩展名。

简短的回答是 一点都不安全

这是它的问题...

  1. 您正在检查 get_magic_quotes_gpc,它已从 PHP 中删除多年
  2. 如果魔术引号打开,您正在使用 htmlentities 对字符串进行编码,但如果它关闭则不会(破坏数据的方式)
  3. 为什么要使用 htmlentities 向数据库发送数据?它根本无法阻止 sql 注入。
  4. addslashes 在转义数据时不考虑客户端连接字符编码(这使得它非常不安全)
  5. 您正在返回一个未定义的变量(即 NULL),使整个函数无用

此外,mysql 已弃用并已从 PHP 中删除 7. 请改用较新的 MySQLi 扩展名。

您可以简单地将整个函数替换为较新的数据库 API 提供的功能,例如 MySQLiPDO,它们提供 准备好的语句 和参数化查询,已被证明是可靠和安全的。您在此处的示例中提供的代码显然是古老的并且非常不安全。