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

Mag*_*gix 2 php mysql sql sanitization sql-injection

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

function VerifChamps($valeur)
{
$verif = (get_magic_quotes_gpc()) ? htmlentities($valeur, ENT_QUOTES) : addslashes($valeur);
return $verif;
}
Run Code Online (Sandbox Code Playgroud)

然后查询完成如下:

$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);
Run Code Online (Sandbox Code Playgroud)

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

编辑:服务器正在运行PHP v5.2.13,启用了Magic Quotes

She*_*rif 7

简短的回答是,它根本不安全.

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

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

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

您可以使用MySQLiPDO等新的数据库API提供的功能简单地替换您的整个函数,这些API 提供预处理语句和参数化查询,这些已经证明是可靠且安全的.您在此示例中提供的代码显然非常古老且非常不安全.