SQL注入详解(sql注入解决方法)

SQL注入详解一:什么是sql注入 SQL注入是比较常见的网络攻击方式之一,它不是利用操作系统的BUG来实现攻击,而是针对程序员编写时的疏忽,通过SQL语句,实现无账号登

1:什么是SQL注入?

SQL注入是最常见的网络攻击技术之一,并不利用操作系统的bug来进行攻击,而是针对程序员在创建SQL语句时的疏忽,并且可以在没有账户的情况下存在登录或篡改的可能性。数据库。

2:SQL注入攻击的总体思路

1:定位SQL注入

2:确定服务器类型和后台数据库类型

3:根据各种服务器和数据库特性进行SQL注入攻击

: 如何防止SQL 注入

注意:存在SQL注入漏洞的程序是指该程序接受客户端用户输入的变量或URL传递的参数,并且该变量或参数包含用户输入的内容或传递参数的SQL语句因为它是其中的一部分。这就是安全领域的原则“外部数据不能被信任”,而如果你看看Web安全领域的各种攻击方式,大多数都是由于开发者违反了这个原则造成的,所以很自然。一个好的起点是发现、过滤和验证变量,以确保它们符合开发人员的预期。

1.检查变量的数据类型和格式

如果您的SQL 语句的形式为id={$id} 并且数据库中的所有ID 都是数字,则在执行SQL 之前需要检查变量id 是否为int 类型。对于电子邮件地址,您需要严格确保变量必须采用邮箱格式。这也适用于其他类型,例如日期、时间等。综上所述,只要你有固定格式的变量,你就应该在执行你的SQL语句之前严格按照固定格式检查它们,以确保变量是预期的格式。这可以让你避免大量的SQL。注入攻击。

例如,在前面接受用户名参数的示例中,产品设计包括用户名规则,例如仅由大小写字母、数字和用户注册开始时的一些安全字符组成的用户名规则。字符由符号组成,不包含特殊字符。目前,需要check_username 函数来执行集成检查。然而,这个标准仍然有很多例外,比如文章发布系统、评论系统以及其他需要允许用户提交任意字符串的场景。这需要使用过滤和其他解决方案。

2、过滤特殊符号

对于无法确定固定格式的变量,必须进行特殊符号过滤或转义。

3. 绑定变量并使用预编译语句

MySQL 的mysqli 驱动程序提供对准备好的语句的支持。不同的编程语言有自己的使用预编译语句的方式。

事实上,使用预编译的SQL语句来绑定变量是防止SQL注入的最好方法。变量在SQL 语句中用问号表示。更改SQL语句的结构

4:什么是SQL预编译?

1.1:什么是准备好的语句?

通常,SQL在数据库中被接收、执行并返回后,可以分为三个过程:

它使用词法和语义分析来优化SQL 语句、制定执行计划、执行它们并返回结果。

这种常规语句称为立即语句。

然而,经常会重复执行其中一个SQL 语句,或者每次执行之间可能只有个别值不同(例如,查询的where 子句具有不同的值、更新的set 子句具有不同的值等),插入的值不同)。

如果每次都要进行上述的词法分析、语义分析、语句优化、执行计划制定等,效率会明显下降。

所谓的准备好的语句用占位符替换此类语句中的值,可以将其视为模板化或参数化的SQL 语句。这些语句通常称为准备好的语句或参数化语句。

预编译语句的好处可以总结如下:编译一次并运行多次,无需分析和优化过程。此外,预编译语句可以防止SQL 注入。

当然,从优化的角度来看,仅仅知道SQL语句模板往往不足以确定最优执行计划;必须使用具体值来估算成本。

5:SQL注入攻击示例

String sql=\’从用户表中选择*,其中用户名=

\’ \’+用户名+\’ \’和密码=\’ \’+密码+\’ \’\’;

— 输入上述用户名和密码后,上述SQL语句变为:

SELECT * FROM user_table WHERE 用户名=

\’\’或1=1 — 且密码=\’\’

””

–分析SQL语句。

— 在条件username=” or 1=1之后,如果username等于” or 1=1,则该条件一定成功。

——后面跟着两个——。这意味着注释,下一条语句将被注释掉,因此该语句将始终正确执行,并且用户可以轻松欺骗系统来获取它。合法身份。

–这样运行起来比较温和

从user_table WHERE 中选择*

用户名=\’\’ ;DROP DATABASE(数据库名称)–\’ 和密码=\’\’

——结果可想而知……

””

以上关于#SQL注入详细讲解的相关内容摘自网络,仅供参考。相关信息请参见官方公告。

原创文章,作者:CSDN,如若转载,请注明出处:https://www.sudun.com/ask/92856.html

(0)
CSDN's avatarCSDN
上一篇 2024年7月4日 下午4:35
下一篇 2024年7月4日 下午4:35

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注