`
cvics_ailk
  • 浏览: 10858 次
社区版块
存档分类
最新评论

SQL注入和SQL优化

 
阅读更多

1、SQL注入漏洞

由于“’1′=’1′”这个表达式永远返回 true,而 true 与任何布尔值的 or 运算的结果都是 true,那么无论正确密码是什么“Password=’1′ or ’1′=’1′”的计算值永远是 true,这样恶意攻击者就可以使用任何帐户登录系统了。这样的漏洞就被称作“SQL 注入漏洞(SQL Injection)”。

对付 SQL 注入漏洞有两种方式:过滤敏感字符和使用参数化 SQL。

1) 过滤敏感字符

过滤敏感字符的思路非常简单,由于恶意攻击者一般需要在输入框中输入的文本一般含有 or、and、select、delete 之类的字符串片段,所以在拼接 SQL 之前检查用户提交的文本中是否含有这些敏感字符串,如果含有则终止操作。

2) 使用参数化SQL

为运行时才能确定的用户名和密码设置了占位符,然后在运行时再设定占位符的值,在执行时 Java、C#会直接将参数化 SQL 以及对应的参数值传递给 DBMS,在 DBMS 中会将参数值当成一个普通的值来处理而不是将它们拼接到参数化 SQL 中,因此从根本上避免了 SQL 注入漏洞攻击。

 

2、SQL 优化

在使用 DBMS 时经常对系统的性能有非常高的要求:不能占用过多的系统内存和CPU 资源、要尽可能快的完成的数据库操作、要有尽可能高的系统吞吐量。如果系统开发出来不能满足要求的所有性能指标,则必须对系统进行调整,这个工作被称为优化。

SQL 优化的基本原则

“二八原理”是一个普遍的真理,特别是在计算机的世界中表现的更加明显,那就是 20%的代码的资源消耗占用了 80%的总资源消耗。SQL 语句也是一种代码,因此它也符合这个原理。在进行 SQL 优化的时候应该把主要精力放到这 20%的最消耗系统资源的 SQL 语句中,不要想把所有的 SQL 语句都调整到最优状态。

索引是数据库优化的最根本的优化方法。

常用的SQL优化方法:

1) 创建必要的索引

2) 使用预编译查询

程序中通常是根据用户的输入来动态执行 SQL 语句,这时应该尽量使用参数化SQL,这样不仅可以避免 SQL 注入漏洞攻击,最重要数据库会对这些参数化 SQL 执行预编译。

3) 调整 WHERE 子句中的连接顺序

DBMS 一般采用自下而上的顺序解析 WHERE 子句,根据这个原理,表连接最好写在其他 WHERE 条件之前,那些可以过滤掉最大数量记录。

比如下面的 SQL 语句性能较差:

SELECT * FROM T_Person WHERE FSalary > 50000 AND FPosition='MANAGER' AND 25 < (SELECT COUNT(*) FROM T_Manager WHERE FManagerId=2);

我们将子查询的条件放到最前面,下面的 SQL 语句性能比较好:

SELECT * FROM T_Person WHERE 25 < (SELECT COUNT(*) FROM T_Manager WHERE FManagerId=2) AND FSalary > 50000 AND FPosition='MANAGER';

4) SELECT 语句中避免使用’*’

SELECT *比较简单,但是除非确实需要检索所有的列,否则将会检索出不需要的列,这回增加网络的负载和服务器的资源消耗;即使确实需要检索所有列,也不要使用SELECT *,因为这是一个非常低效的方法,DBMS 在解析的过程中,会将*依次转换成所有的列名,这意味着将耗费更多的时间。

5) 尽量将多条 SQL 语句压缩到一句 SQL 中

每次执行 SQL 的时候都要建立网络连接、进行权限校验、进行 SQL 语句的查询优化、发送执行结果,这个过程是非常耗时的,因此应该尽量避免过多的执行 SQL 语句,能够压缩到一句 SQL 执行的语句就不要用多条来执行。

6) 用 Where 子句替换 HAVING 子句

避免使用 HAVING 子句,因为 HAVING 只会在检索出所有记录之后才对结果集进行过滤。如果能通过 WHERE 子句限制记录的数目,那就能减少这方面的开销。HAVING 中的条件一般用于聚合函数的过滤,除此而外,应该将条件写在 WHERE 子句中。

7) 使用表的别名

当在 SQL 语句中连接多个表时,请使用表的别名并把别名前缀于每个列名上。这样就可以减少解析的时间并减少那些由列名歧义引起的语法错误。

8) 用 EXISTS 替代 IN

在查询中,为了满足一个条件,往往需要对另一个表进行联接,在这种情况下,使用 EXISTS 而不是 IN 通常将提高查询的效率,因为 IN 子句将执行一个子查询内部的排序和合并。

9) 用表连接替换 EXISTS

通常来说,表连接的方式比 EXISTS 更有效率,因此如果可能的话尽量使用表连接替换 EXISTS。

10) 避免在索引列上使用计算

在 WHERE 子句中,如果索引列是计算或者函数的一部分,DBMS 的优化器将不会使用索引而使用全表扫描。

11) 用 UNION ALL 替换 UNION

当 SQL 语句需要 UNION 两个查询结果集合时,即使检索结果中不会有重复的记录,如果使用 UNION 这两个结果集同样会尝试进行合并,然后在输出最终结果前进行排序。 因此,如果检索结果中不会有重复的记录的话,应该用 UNION ALL 替代 UNION,这样效率就会因此得到提高。

12) 避免隐式类型转换造成的全表扫描

13) 防止检索范围过宽

如果 DBMS 优化器认为检索范围过宽,那么它将放弃索引查找而使用全表扫描。下面是几种可能造成检索范围过宽的情况: 使用 IS NOT NULL 或者不等于判断,可能造成优化器假设匹配的记录数太多。 使用 LIKE 运算符的时候,”a%”将会使用索引,而”a%c”和”%c”则会使用全表扫描,因此”a%c”和”%c”不能被有效的评估匹配的数量。

分享到:
评论

相关推荐

    SQL注入工具-御剑

    在网络安全领域,SQL注入是一种常见的攻击手段,而“御剑”则是一款专门用于检测和利用SQL注入漏洞的工具。御剑,以其独特的功能和易用性,深受安全研究人员和渗透测试人员的喜爱。这款工具能够帮助用户识别和利用...

    最新ASP通用防SQL注入代码

    这个代码可能是经过优化和测试的,确保其在多种情况下都能有效防御SQL注入。 描述提到"这是经过整理和测试的,最新ASP通用防SQL注入代码。很简洁也很好用。和大家分享。"这意味着这个代码片段不仅是最新的,而且在...

    SQL注入漏洞检测原型工具

    这个网站可能包含了一些故意设计的SQL注入漏洞,以便用户了解工具如何工作,同时也可以用来测试和优化检测算法,提高其准确性。 该原型工具采用Java语言编写,这意味着它具有跨平台的特性,可以在多种操作系统上...

    SQL注入扫描器

    SQL注入漏洞源于Web应用程序未能充分验证和清理用户输入的数据。当用户提供的数据被直接拼接到SQL查询中时,如果未进行适当过滤和转义,攻击者就可以操纵SQL语句,执行非预期的数据库操作。这可能导致数据泄露、数据...

    红帆OA(医疗版)漏洞细节未授权SQL注入请求注入数据包

    ### 红帆OA(医疗版)漏洞细节与SQL注入风险分析 #### 一、红帆OA(医疗版)概述 红帆OA(医疗版)是一款专为医疗...针对发现的安全漏洞,特别是SQL注入风险,必须采取有效措施加以解决,以保障医院数据的安全性和完整性。

    通用防SQL注入漏洞程序(Global.asax方式)_aspx开发教程.rar

    3. **检测和过滤输入**:在`BeginRequest`事件处理程序中,遍历所有请求参数(包括GET和POST),对每个参数值进行SQL注入检查。可以使用正则表达式或其他方法去除或替换可能的SQL关键字。 4. **异常处理**:如果检测...

    SQL注入fuzz字典

    sql注入时很多关键的字符和关键字都过滤了,被称非法,一个一个测试不现实。可以使用该字典,用burp suite跑了一下来判断被过滤的字符。其中长度367表示可用,370表示非法字符,被过滤了。

    傀儡SQL批量扫描注入工具

    总的来说,傀儡SQL批量扫描注入工具是一款强大的安全测试工具,它可以帮助开发者和安全专家发现并修复SQL注入漏洞,提高网络应用的安全性。然而,使用时务必谨慎,尊重他人的网络权益,避免滥用工具导致的不良后果。...

    IIS日志分析 sql注入

    而`IISLog_Analyzer.exe`则是可执行程序本身,负责读取和解析IIS日志,识别SQL注入迹象,并可能提供报告或警报功能。 总的来说,这个工具帮助管理员监控IIS服务器的安全状况,通过快速分析日志来检测SQL注入攻击,...

    web安全之sql注入

    尽管前两部分涵盖了SQL注入的基础知识和实践操作,但对于更高级的主题,如挂马、提权和留下后门等,这些内容可能会涉及更复杂的技术细节和道德问题。对于这些高级话题,一般情况下不会在公开场合进行演示,而是仅仅...

    检测SQL注入隐患的工具-Scrawlr

    Scrawlr是一款由微软与...综上所述,Scrawlr是一个强大的工具,可以帮助网站管理员和安全团队有效抵御SQL注入攻击,确保网站的数据安全。通过深入理解和使用这些提供的库文件,用户可以更好地利用Scrawlr进行安全检测。

    ASP.Net防SQL注入的HttpMoudule

    3. 模块的工作原理,例如如何检测和过滤潜在的SQL注入字符串。 4. 如何自定义规则,以适应不同的数据库和应用程序需求。 5. 错误处理和日志记录机制。 6. 性能影响和最佳实践。 在实际应用中,防SQL注入的...

    第07篇:Bypass 360主机卫士SQL注入防御(多姿势)1

    【SQL注入防御与绕过策略】 SQL注入是一种常见的网络安全威胁,攻击者通过构造恶意的SQL语句,利用程序处理用户输入时的不安全性,来执行非授权的操作,获取敏感信息或者破坏数据库。360主机卫士是一款针对服务器的...

    SQL.rar_SQL注入工具_mountain2rr_sql注入_新品_速度快

    "SQL.rar"很可能是一个包含多种SQL注入工具的压缩包,旨在帮助安全专家或者渗透测试人员检测和识别网站或系统中的SQL注入漏洞。 `mountain2rr_sql注入`可能是该压缩包中特定的SQL注入工具的名字,它强调了其在速度...

    web安全性测试之sql注入进阶篇

    本篇将聚焦SQL注入的进阶技巧,包括如何识别注入点、重构SQL语句、猜解表名和字段名,以及应对中文字符的处理方法。 ### 一、SQL注入的基本步骤 1. **环境判断**:首先确定应用是否易受SQL注入攻击,这通常涉及...

    C#参数化查询,避免SQL注入

    防止SQL注入.htm和参数化查询示例代码.txt文件可能包含了更详细的解释和示例代码,可以帮助进一步理解并应用这种技术。总的来说,采用C#的参数化查询是开发安全的数据库应用程序的重要步骤,它不仅可以防止SQL注入...

    基于SQL语法树的SQL注入过滤方法研究.pdf

    在现代网络安全的多面战场中,Web应用程序安全一直是战线最长、交火最激烈的区域之一。尤其在Web应用普遍以...随着网络安全技术的不断发展,这一方法有望进一步优化和创新,为Web应用的安全防护提供更加坚固的防线。

    基于语义分析的SQL注入行为检测方案研究.pdf

    因此,未来的研究方向可能包括对现有模型的优化、结合机器学习技术以增强检测系统的学习能力,以及对大数据环境下的SQL注入检测进行进一步研究。 通过本研究,可以为Web应用程序的安全防护提供重要的理论和实践指导...

    ASP防SQL注入代码

    ### ASP防SQL注入代码解析 #### 一、概述 随着互联网技术的发展,Web应用...综上所述,虽然这段ASP防SQL注入代码提供了一种基础的解决方案,但在实际部署时还需综合考虑多种因素,并不断优化升级以应对新的安全挑战。

Global site tag (gtag.js) - Google Analytics