用友软件首页

读书笔记之SQL注入漏洞和SQL调优

2016-1-25 0:0:0 wondial

读书笔记之SQL注入漏洞和SQL调优

读书笔记之SQL注入漏洞和SQL调优

  最近读了程序员的SQL金典这本书,觉得里面的SQL注入漏洞和SQL调优总结得不错,下面简单讨论下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'不能被有效的评估匹配的数量。 

  

  如果您有什么问题,欢迎在下面评论,我们一起讨论,谢谢~

  如果您觉得还不错,不妨点下右下方的推荐,有您的鼓励我会继续努力的~

 

如果您的问题还没有解决,可以到 T+搜索>>上找一下答案

分享到:

微博关注

bj用友软件

最新信息

采购与供应管理专业说是非学历证书,请问这个跟其他专业有什么区别? _0

采购与供应管理专业说是非学历证书,请问这个跟其他专业有什么区别? _0采购与供应管理专业说是非学历证书,请问这个跟其他专业有什么区别?今年考试计划做调整,是只是要取消一些课程?

T+11.6,能在软件中打印顺丰单据吗?

T+11.6,能在软件中打印顺丰单据吗? T+11.6,能在软件中打印顺丰单据吗?[]

不能
[/撇嘴]不能
。用5.4打印助手
@卢彦飞jye:5.4打印助手能跟T+11.6连接吗?例如在软件中的客户档案里录入了客户地址,能通过5.4打印助手打印顺丰单子吗?
@朋朋73189:

热点文章

新闻资讯

  • 【新年首签】天津用友&通广集团签署战略协议

    【新年首签】天津用友&通广集团签署战略协议

    天津用友软件技术有限公司(以下简称天津用友)和天津通信广播集团有限公司(以下简称通广集团)就企业信息化建设事宜进行战略签约。

    参加此次会议有天津用友总经理赵永春,天津用友副总经理王成岩、通广集团副总经理马严、通广集团科技质量部部长尹刚、七一二公司技术质量部部长门国梁、七一二公司技术中心主任黄建尧等。

    image

  • 会计职场堪比宫斗剧

    会计职场堪比宫斗剧

     近几年,各种宫斗剧火爆,《甄嬛传》《芈月传》等等都脍炙人口,许多人经常打趣自己像某个人物,若是在古代能活到第几集。让人不禁想起,会计职场又何尝不是一场宫斗,每天要察言观色,明了领导的内心,就像后宫谁也不敢惹皇后一样。但当你坐上领导位置的时候,盯着你的眼睛就会很多,稍有不慎就会被取代。就像后宫的嫔妃一样,就算坐上了皇后的位置也要时刻担心有没有人觊觎。

    image

知 识 库

  • 用友软件凭证填制环节常见问题及解决方案

    用友软件凭证填制环节常见问题及解决方案

    用友软件凭证填制环节常见问题及解决方案用友软件凭证填制环节常见问题及解决方案

      用友软件的账务处理采用放射式数据处理流程,对业务数据采用集中收集、统一处理、数据共享的操作方法,凭证数据库既是数据归集的“信息仓库”,又是后续业务处理的“信息源泉”。因此,凭证填制数据的正确与否直接关系到后续账表及相关业务信息的准确性。
      在用友软件中,其基础设置及凭证管理模块为我们提供了凭证类别控制、受控科目控制、制单序时控制、支票控制、制单权限控制等功能,加强了对发生业务的及时管理和控制,通过严密的制单控制保证填制凭证的正确性。然而在实际应用中,却常因用户不理解各项控制参数的含义,以及对后续操作的影响;没有准确无误地设置相关控制参数及基础信息;没有正确完整地录入凭证辅助信息等原因,使先进的控制工具无法充分发挥效用,损失了部分数据信息,降低了软件的使用效能。对此,笔者将以用友ERP-U8.72软件为例,总结凭证填制环节的常见问题,结合典型案例,追根寻源,深入剖析其产生的原因,以便对症解决。一、凭证类别设置时常见问题
      出错信息描述:“不满足借方必有条件”,“不满足贷方必有条件”,“不满足借贷必无条件”,“不满足凭证必有条件”。
      典型案例剖析:2009年8月16日,总经理办公室支付业务招待费1 200元,转账支票号ZZR003。凭证内容如下:
      借:管理费用/招待费(660205)1 200
      贷:银行存款/工行存款(100201)1 200
      当凭证保存时,弹出出错信息框,提示“不满足借贷必无条件”。此信息说明用户之前为不同类别的凭证设置了限制条件,指定了相应的限制类型和限制科目。这样,当凭证填制时,系统就会根据所设置的凭证类别判断凭证内容是否符合限制条件,不相符时就会出现类似的出错信息。对于此类问题,用户首先应根据提示信息,认真查对所选凭证类别与所录入的业务内容是否相符,然后进一步判断究竟是凭证类别设置错误,还是会计科目选择错误?
      此案例中的凭证类别选择的是“转账凭证”,转账凭证的限制类型应为“凭证必无”,限制科目为“1001,100201,100202”,即在凭证借贷方不能出现这三个科目。而该凭证的贷方却出现了100201科目,显然违背了所设置的限制条件。进一步判断可知,此问题是因凭证类别设置错误所致的。根据业务内容该凭证类别应为“付款凭证”,而非“转账凭证”。当更正凭证类别后,问题即得到解决。经进一步分析得知,用户在填制凭证时,因为看到在业务中用到了转账支票,就认为这应该是一张转账凭证,从而导致凭证类别判断错误。而追根寻源是由于用户对业务的凭证类别判断不准,不明白凭证类别的限制条件,甚至于不清楚什么是收、付、转凭证。当问题出现时,就会因不理解凭证类别限制条件的含义而找不到问题解决的方向和方法。
      此外,对于此类问题,如果用户在认真查对后,发现凭证类别与凭证内容匹配,但仍出现出错信息,则应考虑可能是因用户粗心将凭证类别的限制条件设置有误。常见的错误有将收款凭证和付款凭证的限制类型设反了,或将转账凭证的限制类型设为“凭证必有”,或未写全限制科目。

  • 浅议电算化会计中若干会计方法

    浅议电算化会计中若干会计方法

    浅议电算化会计中若干会计方法浅议电算化会计中若干会计方法

      一、电算会计中借贷记账法是否不适用
      在借贷记账法中,“借”既可以表示增,也可以表示减,而“贷”既可以表示减,也可以表示增,卢卡?帕乔利提出的复式借贷簿记方法之所以几百年来一直为人们所推崇,正是因为其“有借必有贷,借贷必相等”的锱铢必较、泾渭分明的科学原理。尽管我国会计实务也曾一段时间对增减记账法和收付记账法情有独钟,但最终仍达成共识,采用了国际上通用的借贷记账法。有人以会计软件常以正、负号分别替代借、贷符号为由,企图说服人们相信这一记账法已经难以胜任新形势。应当注意的是,即使借、贷符号在数据库中不采用“借”和“贷”加以表示,也并不表明借贷记账法就可放弃。不可否认,在将借贷记账凭证的发生额登录到总账之后,对于登账后所结计的期末余额往往以正数表示借方余额,而以负数表示贷方余额,甚至在借贷库文件中只设一个金额字段,在该字段中分别以正负号表示借贷方。但所有这些标记都没能改变“有借必有贷,借贷必相等”的规则,其实质仍然是借贷记账法。这里的正、负号与增减记账法的增减符号的属性风马牛不相及。
      从长远来看,随着原始凭证的逐步电子化,记账凭证的自动生成势在必行,届时,何种记账方法使自动生成更可行,当然要根据其科学性而定。智能软件的设计凭借的是科学的方法和严密的思维与推断,而经过了数百年磨练的借贷记账法,无疑是未来智能专家设计会计软件的最佳选择。当然,一味否定增减记账法的科学性也是错误的。在计算机之中,当采用增减记账法填制记账凭证之后,我们完全可以编写一段简短的程序将其转换为借贷记账法下的相应记账凭证。其转换的主要依据是各该科目的记账符号与所属科目类别。以从银行提取现金为例,在增减记账法下,增记“现金”,减记“银行存款”。现金和银行存款都是资产类科目,对资产类科目,其增加就转换为“借”,其减少就转换为“贷”。依此,也可将借贷记账法下的凭证转换为增减法下的凭证。

      二、“反结账、反记账、取消审核”的可行性
      至今,尚有不少会计核算软件设置“取消审核”、“反记账”、“反结账”的功能。在实际工作中,这些设置的确给会计人员的会计处理带来许多方便,尽管许多学者对此提出异议,但不少实务工作者却对其依依不舍。有的学者甚至认为,在计算机特定的工作环境中,反记账的作用不可替代。其理由是,在实际工作中存在大量错误的记账凭证,如果不施行反记账的做法,则将导致账簿中存在大量无用的冗余信息,影响对会计信息的使用。
      所谓电算化会计中“反记账”,事实上也就是将一批原先已经登录到账簿上的发生额从各该账户再予以扣减,使各该账簿恢复至该批凭证登账之前账簿的发生额和余额状态。毋庸置疑,没有人会赞同手工会计下采用“反记账”。对手工的账簿记录,为了保证其有案可稽,当其发生错误时,不准涂改、挖补、刮擦或者用药水消除字迹,不准重新抄写。同时,对两种出错情况的更正应当分别加以严格处理:一是登记账簿时所发生的错误,“应当将错误的文字或者数字划红线注销,但必须使原有字迹仍可辨认”;在实际工作中,由于记账凭证出错而导致账簿记录发生差错时而发生。一般采用两种方式进行相应的修改:一是红字冲销法,二是补充更正法。这些详细而又具体的规定所强调的一点,那就是对出错之处必需留有修改的痕迹。
      在电算会计之中,记账错误和记账凭证填制错误仍然在所难免。虽然红线注销法在电算会计中难以操作,但对出错的电子数据,却不能不留下修改的痕迹。解决的办法只有一个,保留错误电子数据,另作更改的记账凭证,并据以登录账簿,换言之,要将正与误两张凭证同存于会计档案之中,同时,其所登录的正与误两处账簿记录并存于同一账簿之中。《会计核算软件基本功能规范》第十八条也作出与上相同的规定:“发现已经输入并审核通过或者登账的记账凭证有错误的,可以采用红字冲销法或者补充凭证法进行更正;记账凭证输入时,红字可用‘-’号或者其他标记表示”。
      由上可见,不管是手工会计,还是电算化会计,对出错的修改均强调留有痕迹。事实上,电算化会计中,由于电子数据的修改在技术上可不留痕迹,因而更需要对留有痕迹予以强调。

  • 最新文章排行
  • 热门文章排行

管理软件

  • T3卸载就会跳到安装界面去,用360工具也卸载不了。请问这种情况哪位老师遇见过,我们应该如何处理。谢谢、在线等。

    T3卸载就会跳到安装界面去,用360工具也卸载不了。请问这种情况哪位老师遇见过,我们应该如何处理。谢谢、在线等。

    T3卸载就会跳到安装界面去,用360工具也卸载不了。请问这种情况哪位老师遇见过,我们应该如何处理。谢谢、在线等。 T3卸载就会跳到安装界面去,用360工具也卸载不了。请问这种情况哪位老师遇见过,我们应该如何处理。谢谢、在线等。[]

    备份好账套,这种情况只能强制删除了,请备份好账套之后,停止数据库服务和T3产品服务,自动备份服务;然后删除T3安装路径以及C盘下ufcomsql文件夹,然后使用360清除无用注册表,最后重启电脑即可;

  • 用友T3-用友通标准版录完期初后,总账系统和往来管理中往来科目期初余额不一致

    用友T3-用友通标准版录完期初后,总账系统和往来管理中往来科目期初余额不一致

    用友T3-用友通标准版录完期初后,总账系统和往来管理中往来科目期初余额不一致 用友T3-用友通标准版录完期初后,总账系统和往来管理中往来科目期初余额不一致

    用友T3-用友通应收账款在总账系统明细表中期初余额为10元,但在往来管理客户科目余额表中期初余额为110元.
    挂上往来辅助核算之后在总账期初余额里录入期初,后来发现录错了,接着就取消往来辅助核算,直接清空总账期初余额表面的金额(下图红色),却没有删除期初余额往来中的明细(下图蓝色)

关于我们 | 公司动态 | 获奖记录 | 联系我们 | 招聘信息 | 用友产品中心 | 用友云基地
Copyright ©  www.kuaiji66.com  All Rights Reserved 天龙瑞德
京ICP备11046295号-1 技术支持 北京天龙瑞德信息技术有限责任公司   北京海淀上地十街辉煌国际大厦3号楼6层 总机:010-59798025   售后:4009908488
北京天龙瑞德信息技术有限责任公司