java程序员基础篇:代码优化,业务优化,防注入

关注本文评论提供java学习

优化篇

一、代码优化

代码结构层次的优化(目的:更加方便代码的维护--可维护性,可读性)

1.代码注释(代码规范)

2.工具类的封装(方便代码的维护,使代码结构更加清晰不臃肿,保证团队里代码 质量一致性)

3.公共部分的提取

代码性能的优化(目的:使程序的性能最优化)

1.使用一些性能比较高的类(bufferInputStream)

2.缓冲区块的大小(4k或者8k)

3.公共部分的提取

4.通常要用stringbuffer替代string加号拼接

二、业务优化

我们做项目的时候业务优化这方面最主要是从用户体验度角度进行考虑,减少用户操 作的步骤提高工作效率,通常有以下几种:

1.可以通过tabindex属性来改变tab键盘的操作顺序

2.可以通过回车键来进行搜索或者提交操作

3.对于单选按钮和复选按钮可以通过操作后面的文本来选择前面的单选按钮以及复选 按钮

4.添加的信息要按照id倒序进行排列

5.进行搜索操作时加入js loading操作(不仅告诉用户所进行的请求正在被处理,而 且防止用户多次点击提交操作)

6.当进行删除操作的时候要弹出提示框,警告用户要进行删除操作,是否确认。

7.根据returnURL在用户登录成功后直接跳到想要访问的资源。

8.进行删除操作时通过confirm提示用户是否确认删除操作,操作完后提示操作是否 成功。

9.减少用户操作的步骤

10.使用autocomplete插件快速进行搜索

必背,必做:

1.可以通过回车键来进行搜索或者提交操作

2.添加的信息要按照id倒序进行排列

3.进行搜索操作时加入js loading操作(不仅告诉用户所进行的请求正在被处理,而且防止用户多次点击提交操作)

4.当进行删除操作的时候要弹出提示框,警告用户要进行删除操作,是否确认,如果删除成功则弹出提示框告诉用户。

5.减少用户操作的步骤

6.通过ztree,以及kindeiditor来提高用户的体验度

三、sql优化

1、SELECT子句中避免使用 *, 尽量应该根据业务需求按字段进行查询

2、尽量多使用COMMIT如对大数据量的分段批量提交释放了资源,减轻了服务器压力

3、在写sql语句的话,尽量保持每次查询的sql语句字段用大写,因为oracle总是先解析 sql语句,把小写的字母转换成大写的再执行

4、用UNION-ALL 替换UNION,因为UNION-ALL不会过滤重复数据,所执行效率 要快于UNION,并且UNION可以自动排序,而UNION-ALL不会

5、避免在索引列上使用计算和函数,这样索引就不能使用

Sql优化精简版:

1.(重点)(必须说) SELECT语句中避免使用 *,

尽量应该根据业务需求按字段进行查询

举例:如果表中有个字段用的是clob或者是blob这种大数据字段的话,

他们的查询应该根据业务需要来进行指定字段的查询,切记勿直接用*

2.(重点) 删除重复记录(oracle):

最高效的删除重复记录方法 ( 因为使用了ROWID)例子:

DELETE FROM EMP E WHERE E.ROWID > (SELECT MIN(X.ROWID)

FROM EMP X WHERE X.EMP_NO = E.EMP_NO);

3. 用>=替换>

如一个表有100万记录,一个数值型字段A,

A=0时,有30万条;

A=1时,有30万条;

A=2时,有39万条;

A=3时,有1万记录。

那么执行 A>2 与 A>=3 的效果就有很大的区别了,因为 A>2 时,

ORACLE会先找出为2的记录索引再进行比较,

而A>=3时ORACLE则直接找到=3的记录索引。

4.(重点)尽量多使用COMMIT

如对大数据量的分段批量提交

5. (重点)用NOT EXISTS 或(外连接+判断为空)方案 替换 NOT IN操作符

此操作是强列推荐不使用的,因为它不能应用表的索引。

推荐方案:用NOT EXISTS 或(外连接+判断为空)方案代替

6.(重点 必须说)LIKE操作符(大数据的全文检索使用luncene)(solr)

因为使用like不当,会导致性能问题,原因是like在左右两边都有

%的时候,不会使用索引。

如LIKE '%5400%' 这种查询不会引用索引,

而LIKE 'X5400%' 则会引用范围索引。

一个实际例子:

查询营业编号 YY_BH LIKE '%5400%' 这个条件会产生全表扫描,

如果改成 YY_BH LIKE 'X5400%' OR YY_BH LIKE 'B5400%'

则会利用 YY_BH 的索引进行两个范围的查询,性能肯定大大提高。

7.(重点,必须说)避免在索引列上使用计算和函数,这样索引就不能使用

举例:

低效:

SELECT … FROM DEPT WHERE SAL * 12 > 25000;

高效:

SELECT … FROM DEPT WHERE SAL > 25000/12;

8.(重点 必须说)用UNION-ALL 替换UNION,

因为UNION-ALL不会过滤重复数据而且不会自动排序,

所执行效率要快于UNION。

9. (优化,重点,3个方面 a.缓存 b.分段批量 c.存储过程)减少访问数据库的次数

举例:如果批量删除多条数据,可以用 delete from tableName where id

in (1,2,3)

而不要用多条delete语句进行删除

10.(重点 必须说)用TRUNCATE替代DELETE

TRUNCATE不记录日志,DELETE记录日志,所以TRUNCATE要快于DELETE

但是一旦用TRUNCATE进行删除就不能进行恢复,TRUNCATE是删除整张表的数据

不能加where条件。

==================================================================

mysql,sqlserver中如果

id为自增类型,那么如果用TRUNCATE删除,则id字段再插入数据时从1开始,

如果delete删除的话,则从删除之前的id的值继续增长。

四、防sql注入

针对防sql注入,我们通常是这样做的:

首先在前台页面对用户输入信息进行js验证,对一些特殊字符进行屏蔽,

比如:or ,单引号,--,= ,还有就是限制用户名输入的长度,我们一般

将其限制在6---13位。另外,对于用户的敏感信息我们进行Md5加密,还有

,为了增加用户体验度和用户友好度,为了不使用户看到一些详细的异常信息

我们会进行错误信息页面的定制,像404,500错误。另一个我层面讲,这样做

也是为了保护我们的一些重要信息。此外,我们会给特定的人分配定定的权限

,而不是给其分配管理员权限!

sql注入

所谓SQL注入,就是通过一些含有特殊字符的sql语句发送到服务器欺骗服务器并进行攻击。(特殊字符:or, 单引号,--,空格)

Sql注入的防护

1.永远不要信任用户的输入。对用户的输入进行校验,可以通过正则表达式(js正则或者java后台正则),或限制长度;对单引号和双"-"进行转换等。

2.永远不要使用动态拼装sql,使用参数化的sql。(永远不要使用+号拼接sql字符串,而是使用?传参的方式进行)

3.不要给用户太高的权限而根据需求进行赋权

4.对敏感信息进行加密 如md5(单向加密不可逆转)。

5.自定义错误页面。目的是为了不把我们的程序的bug暴露在别有用心的人的面前。而去不会让用户看到报错的页面,也提高了用户的体验度。

SQL注入防范

使用参数化的过滤性语句

要防御SQL注入,用户的输入就绝对不能直接被嵌入到SQL语句中。恰恰相反,用户的输入必须进行过滤,或者使用参数化的语句。参数化的语句使用参数而不是将用户输入嵌入到语句中。在多数情况中,SQL语句就得以修正。然后,用户输入就被限于一个参数。

输入验证

检查用户输入的合法性,确信输入的内容只包含合法的数据。数据检查应当在客户端和服务器端(java代码)都执行之所以要执行服务器端验证,是为了弥补客户端验证机制脆弱的安全性。

在客户端,攻击者完全有可能获得网页的源代码,修改验证合法性的脚本(或者直接删除脚本),然后将非法内容通过修改后的表单提交给服务器。因此,要保证验证操作确实已经执行,唯一的办法就是在服务器端也执行验证。你可以使用许多内建的验证对象,例如Regular Expression Validator,它们能够自动生成验证用的客户端脚本,当然你也可以插入服务器端的方法调用。如果找不到现成的验证对象,你可以通过Custom Validator自己创建一个。

错误消息处理

防范SQL注入,还要避免出现一些详细的错误消息,因为黑客们可以利用这些消息。要使用一种标准的输入确认机制来验证所有的输入数据的长度、类型、语句、企业规则等。

加密处理

将用户登录名称、密码等数据加密保存。加密用户输入的数据,然后再将它与数据库中保存的数据比较,这相当于对用户输入的数据进行了“消毒”处理,用户输入的数据不再对数据库有任何特殊的意义,从而也就防止了攻击者注入SQL命令。

存储过程来执行所有的查询

SQL参数的传递方式将防止攻击者利用单引号和连字符实施攻击。此外,它还使得数据库权限可以限制到只允许特定的存储过程执行,所有的用户输入必须遵从被调用的存储过程的安全上下文,这样就很难再发生注入式攻击了。

使用专业的漏洞扫描工具

攻击者们目前正在自动搜索攻击目标并实施攻击,其技术甚至可以轻易地被应用于其它的Web架构中的漏洞。企业应当投资于一些专业的漏洞扫描工具,如大名鼎鼎的Acunetix的Web漏洞扫描程序等。一个完善的漏洞扫描程序不同于网络扫描程序,它专门查找网站上的SQL注入式漏洞。最新的漏洞扫描程序可以查找最新发现的漏洞。

确保数据库安全

锁定你的数据库的安全,只给访问数据库的web应用功能所需的最低的权限,撤销不必要的公共许可,使用强大的加密技术来保护敏感数据并维护审查跟踪。如果web应用不需要访问某些表,那么确认它没有访问这些表的权限。如果web应用只需要只读的权限,那么就禁止它对此表的 drop 、insert、update、delete 的权限,并确保数据库打了最新补丁。

安全审评

在部署应用系统前,始终要做安全审评。建立一个正式的安全过程,并且每次做更新时,要对所有的编码做审评。开发队伍在正式上线前会做很详细的安全审评,然后在几周或几个月之后他们做一些很小的更新时,他们会跳过安全审评这关, “就是一个小小的更新,我们以后再做编码审评好了”。请始终坚持做安全审评。

五、数据库中常用术语:

ddl:数据定义语言 Create Drop Alter

dml:数据操纵语言 insert update delete select

dcl:数据控制语言 grant revoke

tcl:事务控制语言 commit rollback

关注本文评论提供java学习

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180326A1Q0L400?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券