阿里巴巴-心里的一座山

来源:互联网 发布:网络道德的特点 编辑:程序博客网 时间:2024/04/29 03:44

从找工到现在,一共面了三次阿里巴巴。无一中的。

------------------------------------------------------
三次机会都把握不住,也没什么怨言了。
这次问到的问题:
1、如果让你改进mysql,有什么想法?
2、dba和开发dba的区别?
3、自己的特别的地方。
4、自己提到的多级索引的概念。
5、对事务的理解,到什么程度?
6、对java掌握到什么程度?
7、你是怎么防止sql注入的?
还有什么不记得了。
只记得,不断提升自己,才能立于稳定。

------------------------------------------------------

1、我提出的是二级索引的概念。这里说的二级索引并不是mysql中原有的那个secondary index。而是类似这样的结构:

我所说的二级索引,是指,一个索引查询完毕之后,指针指向的不是具体表数据,而是指向了另外一个索引。在这个索引中查找之后,这个索引指向的才是真正的表数据。

这样做的好处是,能降低最顶层索引的大小。提高顶层索引的查找效率。【没有验证过这样的正确性】

2、

3、

4、见1。

5、事务?理解到什么程度?一听到这个问题就有点晕了。事务就是事务,就是acid,还能有什么程度之分吗?

只能说说acid的一些内容。

持久性是说,修改一旦完成,即成永远。mysql在做修改的时候,是先写log。写完log再写数据库。如果写完log还没来得及写数据库,那么是可以根据log来恢复数据的。

其中隔离性还是有必要仔细说说的。

隔离性是说,不同的事务之间,互不干扰。一个事务不可能看到其他事务在执行期间的中间数据的。

但是完全的隔离性也是不可能的。如果想做到完全的隔离,可以同一个时间点只执行一个sql。但是这样的话,效率可想而知。

在数据库中,事务之间的影响分为以下几个:

事务之间的互相影响的情况分为几种,分别为:脏读,不可重复读,幻读

脏读意味着一个事务读取了另一个事务未提交的数据,而这个数据是有可能回滚的。

例子:两个事务,事务A插入一条数据,但未提交,事务B在此期间进行了读取,读取到了事务A未提交的数据,造成脏读

不可重复读意味着,在数据库访问中,一个事务范围内两个相同的查询却返回了不同数据。这是由于查询时系统中其他事务修改的提交而引起的。

幻读,是指当事务不是独立执行时发生的一种现象,例如第一个事务对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行。同时,第二个事务也修改这个表中的数据,这种修改是向表中插入一行新数据。那么,以后就会发生操作第一个事务的用户发现表中还有没有修改的数据行,就好象发生了幻觉一样。比如,事务B更新表中所有的数据,在此期间事务A插入了一条数据,事务B再次查询后,发现居然还有没有修改的数据,产生幻读。 

6、对java掌握到什么程度?这个问题问的不好。让我自己怎么回答自己掌握的有多好?

7、怎么预防sql注入?什么是sql注入,自己之前有过了解。但是怎么预防,却没有详细的去看过。所以只是回答了在应用前端去做这个事情,在用户输入数据的时候防止一些特殊符号的出现。比如说分号,',-,/**/ 等。没有能更详细的回答了。

【其实现在想想,在前端做这个工作,用处不是很大。因为如果黑客能绕过前端,那么前端所做的一切,都是徒劳了】

现在整理一下这个问题。

------------------------------------------防止sql注入---------------------------------------------

1、在后端,使用存储过程来验证用户的输入。

2、在多层环境中,所有数据都应该在验证之后才允许进入可信区域。未通过验证过程的数据应被拒绝,并向前一层返回一个错误。

3、对于jsp而言我们一般采取以下策略来应对。PreparedStatement
如果你已经是稍有水平开发者,你就应该始终以PreparedStatement代替Statement.
以下是几点原因
1)、代码的可读性和可维护性.
2)、PreparedStatement尽最大可能提高性能.
3)、最重要的一点是极大地提高了安全性.
如果使用的是预编译语句,那么传入的任何内容就不会和原来的语句发生任何匹配的关系。(前提是数据库本身支持预编译)而如果使用普通的 statement,有可能要对drop,delete等做费尽心机的判断和过虑。

注入之后,可以做很多事情,比如说窃取用户名密码、删除表甚至是drop掉整个数据库。

比如说下面这句话就删除了一个表。

---------------------------------------------------------

关键是明白原理,其实防范很简单的, 
1、过滤SQL需要的参数中的敏感字符(注意加入忽略大小写)。
2、屏蔽服务器异常信息。别有用心的人可能会通过服务器的异常信息来猜测表名或者数据库名。

0 0
原创粉丝点击