针对SQL注入的有效保护功能

时间:2015-07-05 09:07:33

标签: php mysql sql sql-injection sanitization

我在自由软件中找到了这个消毒功能:

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

3 个答案:

答案 0 :(得分:7)

简短的回答是 根本不安全

这就是它的错误......

  1. 您正在查看已从PHP中删除多年的get_magic_quotes_gpc
  2. 如果启用了魔术引号,您正在使用htmlentities对字符串进行编码,但如果它已关闭(将损坏数据的方式),则不会对其进行编码
  3. 为什么要使用htmlentities将数据发送到数据库?它根本不会阻止sql注入。
  4. 转发数据时,
  5. addslashes不会考虑客户端连接字符编码(这使得它非常不安全)
  6. 您将返回一个未定义的变量(即NULL),使整个函数无效
  7. 此外,mysql已被弃用,已从PHP 7中删除。请改用较新的MySQLi扩展程序。

    您可以使用提供MySQLi和参数化查询的新PDOprepared statements等新数据库API提供的功能简单地替换您的整个功能,这些查询已被证明是可靠且安全的。你在这个例子中提供的代码显然很古老而且非常不安全。

答案 1 :(得分:2)

很多天,我正在使用mysqli_real_escape_string功能。它是避免sql注入的一个很好的函数。

并且,请避免mysql扩展。此扩展程序将在以后删除。相反,应使用MySQLiPDO_MySQL扩展名。

答案 2 :(得分:1)