Alvaro Montoro Asked: 2020-05-20 20:13:01 +0800 CST 2020-05-20 20:13:01 +0800 CST 2020-05-20 20:13:01 +0800 CST 什么是 SQL 注入,如何避免它? 772 我在 StackOverflow 上发现了很多关于将信息保存到数据库(尤其是 PHP 和 MySQL)的程序或 Web 表单的问题,这些程序或 Web 表单包含主要与SQL 注入相关的严重安全问题。 我通常会留下评论和/或指向外部参考的链接,但评论不会留下太多空间,如果有关于该主题的内部 SOes 参考会很好,所以我决定写这个问题/答案:什么是SQL注入,如何避免? mysql 3 Answers Voted Best Answer Alvaro Montoro 2020-05-20T20:13:01+08:002020-05-20T20:13:01+08:00 什么是 SQL 注入? SQL 注入是一种计算机攻击,包括在要在数据库中执行的语句/查询中渗透侵入性代码。这种渗透通常通过用户传递给程序的参数或通过 Web 表单发生。 入侵的目标通常是恶意的,并可能造成重大损害:数据泄露、内容修改、身份盗用、删除和破坏数据库内的数据或结构...... 许多程序员认为用户将始终输入有效数据,因此查询将是可靠的,并且在将他们在数据库中执行的语句放在一起时,他们不会采取特殊措施。这使您的应用程序容易受到此类攻击。 要查找更多关于 SQL 注入的西班牙语信息,请阅读Wikipedia 文章(带有不同语言的解析示例)、官方 PHP 文档或OWASP 网站。 示例:假设您有一个带有表单的网页,用于更新数据库中的用户数据,但您在使用这些条目之前没有对其进行清理。在 PHP 中你可以有这样的东西: $sql = "UPDATE usuarios SET nombre = '".$_POST["nombre"]."' WHERE id = ".$_POST["id"]; 现在假设恶意用户键入他的名字是Pepito' WHERE 1=1;--。您的 SQL 语句将如下所示: UPDATE usuarios SET nombre = 'Pepito' WHERE 1=1;--' WHERE id = 123 字符--表示后面是注释,在数据库中被忽略,所以执行的内容就是这样: UPDATE usuarios SET nombre = 'Pepito' WHERE 1=1; 恶意用户注入了 SQL 代码,并且从现在开始将您数据库中的所有用户命名为 Jim。如果您还同时允许多个语句,恶意用户可能会传递类似的内容'; DROP TABLE usuarios;--并删除整个表,就像在这个经典的 xkcd 条带中戏弄(但不是开玩笑)一样: 如何防止 SQL 注入? 为避免 SQL 注入,只需遵循一系列简单的准则: 始终 DISTRUST 用户输入。对它们进行预处理、消毒或测试,但切勿直接使用它们。您应该始终假设用户将尝试攻击您的数据库;我们喜欢认为所有用户都是好人,但一个恶意用户就足以摧毁一切。 避免使用动态 SQL。它们是对数据库执行语句时最常见的错误,也是恶意用户用来攻击您的代码的地方。解决方案很简单:不要将 SQL 查询与用户输入连接,而是 请使用准备好的语句(也称为参数化)。它们提供了一种更有效且不易出错的策略。此外,所有主要的现代数据库系统都支持带有绑定变量的预处理语句。 限制对数据库的访问。不要使用超级用户 (root),而是使用对数据库具有自定义/受限访问权限的用户(尽管这并不总是在所有开发人员的范围内)。 现代化您的代码。在安全性方面使您的代码保持最新,不要使用过时或不推荐的方法。它们过时是有原因的。 例如,StackOverflow 上一个常见的与升级相关的错误是 PHP 和函数的特殊情况mysql_*,应该避免使用MySQLi( mysqli_*)或PDO。有关该主题的更多信息,请阅读问题如何防止 PHP 中的 SQL 注入? Frank Leao 2020-03-02T12:27:14+08:002020-03-02T12:27:14+08:00 尽量在查询中始终使用参数,切勿在查询中直接连接变量,例如: string consulta = "SELECT * FROM Usuarios WHERE UserName = '"+txtUserName.Text+"';"; 避免这种情况的选项是使用参数并取决于您分配变量的语言: string consulta = "SELECT * FROM Usuarios WHERE UserName = @UserName;"; 我希望这些信息对您有所帮助。 Francisco Rolando 2020-07-28T11:25:15+08:002020-07-28T11:25:15+08:00 如果你使用 php,防止 SQLinjection 的一个好方法是使用原生 php 函数 preg_match,你会得到一个包含保留 sql 字和其他一些字的数组,记住 sql injection 不是 web 系统可以接收的唯一攻击,或者页面,无论您想如何称呼它,并且与用户发送的所有数据相匹配,没有人输入名称或地址或其他任何内容,例如 select 或 union 之类的词,它们连接了多个 select select 1 from dual; union all select 2 from dual; 并且还能捕捉到 / ' % & 等稀有字符,这样它们甚至不会意外地损害您的系统或数据。这是 preg match api http://php.net/manual/es/function.preg-match.php幸运。干杯
什么是 SQL 注入?
SQL 注入是一种计算机攻击,包括在要在数据库中执行的语句/查询中渗透侵入性代码。这种渗透通常通过用户传递给程序的参数或通过 Web 表单发生。
入侵的目标通常是恶意的,并可能造成重大损害:数据泄露、内容修改、身份盗用、删除和破坏数据库内的数据或结构......
许多程序员认为用户将始终输入有效数据,因此查询将是可靠的,并且在将他们在数据库中执行的语句放在一起时,他们不会采取特殊措施。这使您的应用程序容易受到此类攻击。
要查找更多关于 SQL 注入的西班牙语信息,请阅读Wikipedia 文章(带有不同语言的解析示例)、官方 PHP 文档或OWASP 网站。
如何防止 SQL 注入?
为避免 SQL 注入,只需遵循一系列简单的准则:
始终 DISTRUST 用户输入。对它们进行预处理、消毒或测试,但切勿直接使用它们。您应该始终假设用户将尝试攻击您的数据库;我们喜欢认为所有用户都是好人,但一个恶意用户就足以摧毁一切。
避免使用动态 SQL。它们是对数据库执行语句时最常见的错误,也是恶意用户用来攻击您的代码的地方。解决方案很简单:不要将 SQL 查询与用户输入连接,而是
请使用准备好的语句(也称为参数化)。它们提供了一种更有效且不易出错的策略。此外,所有主要的现代数据库系统都支持带有绑定变量的预处理语句。
限制对数据库的访问。不要使用超级用户 (root),而是使用对数据库具有自定义/受限访问权限的用户(尽管这并不总是在所有开发人员的范围内)。
现代化您的代码。在安全性方面使您的代码保持最新,不要使用过时或不推荐的方法。它们过时是有原因的。
例如,StackOverflow 上一个常见的与升级相关的错误是 PHP 和函数的特殊情况
mysql_*
,应该避免使用MySQLi(mysqli_*
)或PDO。有关该主题的更多信息,请阅读问题如何防止 PHP 中的 SQL 注入?尽量在查询中始终使用参数,切勿在查询中直接连接变量,例如:
避免这种情况的选项是使用参数并取决于您分配变量的语言:
我希望这些信息对您有所帮助。
如果你使用 php,防止 SQLinjection 的一个好方法是使用原生 php 函数 preg_match,你会得到一个包含保留 sql 字和其他一些字的数组,记住 sql injection 不是 web 系统可以接收的唯一攻击,或者页面,无论您想如何称呼它,并且与用户发送的所有数据相匹配,没有人输入名称或地址或其他任何内容,例如 select 或 union 之类的词,它们连接了多个 select
并且还能捕捉到 / ' % & 等稀有字符,这样它们甚至不会意外地损害您的系统或数据。这是 preg match api http://php.net/manual/es/function.preg-match.php幸运。干杯