防止 PHP 中的 SQL 注入

如果用户输入未选中插入到 SQL 查询中,则应用程序容易受到 SQL 注入攻击,如下例所示:

$variable = $_POST['input_utilisateur'];

mysql_query(插入'表'('列')值('$variable')”);
在本示例中,用户可以输入 价值');DROP TABLE 表;--') 。查询变为:

mysql_query(INSERT INTO 'table' ('column') VALUES('value');DROP TABLE table;--')

黑客的目标是修改 SQL 查询,以便他可以读取隐藏信息或执行任何其他操作(读取、修改、删除)。在此示例中,将从数据库中删除该表。
这种类型的缺陷是最普遍和最危险的,如果您的代码不安全,风险将是巨大的。

SQL 注入缺陷的解决方案是使用 准备好的查询或参数化查询。在准备执行时,查询将发送到数据库服务器并执行语法检查。使用这种方法,黑客不可能注入恶意 SQL.

为此,您有三个选择:

1- 使用 PDO:

$statement = $pdo->prepare('SELECT * FROM administrator WHERE name = :name');

$statement->execute(array('name' => $nom));

foreach ($statement as $row) {
// 做某事
}
2- 使用 MySQLi:

$statement = $dbConnection->prepare('SELECT * FROM administrator WHERE name = ?');
$statement->bind_param('s', $nom);

$statement->执行();

$result = $statement->get_result();
while ($row = $result->fetch_assoc()) {
// 做某事
}
3- 使用 method PHP mysql_real_escape_string
PHP 有自己的方法来修复这个漏洞,但需要注意的是,前两种方法更有效。mysql_real_escape_string 获取将在 MySQL 查询中使用的字符串,并返回从任何 SQL 注入中转义的相同字符串。quotas(') 替换为 \'。此函数要求您已经连接到数据库才能使用它。

$nom = ' OR 1'”;

$nom = mysql_real_escape_string($nom);

$query = SELECT * FROM administrator WHERE name = '$nom'”;
echo 避免注射:
.$query ."
;

$name_vul = ';从管理员中删除 WHERE 1 或 name = ';

$name_vul = mysql_real_escape_string($name_vul);

$query_vul = SELECT * FROM administrator WHERE name = '$nom'”;
echo 避免注射:
.$query_vul;

参考:
https://stackoverflow.com/questions/60174/how-can-i-prevent-sql-injection-in-php