我在 EnSO 版主Dharman的个人资料中看到了以下警告:
免费翻译:
警告:
您对 SQL 注入的威胁非常大,应该使用参数化的准备好的语句,而不是手动构建查询。它们由 PDO 或 MySQLi 提供。永远不要相信任何输入数据!即使您的请求仅由受信任的用户提出,您仍然有可能损坏您的数据。屏蔽还不够!
如果版主认为在他的个人资料中发布这个警告很重要,以便尽可能多的人可以看到它,那么我自然会对SQL 注入到底是什么样的怪物以及与之相关的一切问题感兴趣:
来自MySQLi标签描述
PHP 编程语言中使用的关系数据库驱动程序的扩展,用于提供对 MySQL 数据库的访问。 MySQLi 是 PHP MySQL 驱动程序的更新版本,并在数据库处理方面提供了各种改进。
我希望得到更详细的答复。
如何实施保护,最好有例子并附上简短的解释性评论。
SQL 注入是一种常见的黑客技术,黑客只需输入一个棘手的字符串而不是正常文本,就可以将任何内容插入到数据库中。
当您信任用户输入并将其直接粘贴到数据库查询中时,就会发生这种情况。这可能导致数据丢失,甚至被黑客完全控制。
为了保护自己,您需要使用准备好的查询:这是一种告诉数据库的方法:“这是查询的结构,这是单独的数据。”这样,即使有人试图输入一些有害的内容,它也会被视为普通文本,而不是整个命令。手动屏蔽在这里没有帮助,因为这就像用胶带封住门而不是锁上它。
让我以 Minecraft 服务器为例进行解释:
假设我有一个用于存储有关玩家信息的数据库。当玩家登录服务器时,他们的姓名和其他数据会保存在数据库中。如果我只是获取一个球员的名字并将其放入查询中而不进行检查,那么黑客就可以使用 SQL 注入。
例如,如果我将玩家的名字直接粘贴到查询中,如下所示:
黑客可能会在他的名字中输入如下内容:
那么查询将变成:
此查询将首先插入名称,然后执行命令:
,这将删除包含玩家的表格,从而导致数据丢失。
为了避免这种情况,我使用准备好的语句。这意味着我首先创建一个具有数据空格的查询,然后单独插入数据。这样,数据库就会明白这只是数据,而不是查询的一部分。
我的服务器上准备好查询的完整示例:
因此,即使有人试图通过昵称、密码等插入恶意代码,它也会被视为纯文本,不会发生任何事情。