EXPLAIN  + SQL查询语句

比如:EXPLAIN   select * from user;

来源

表单输入或者url传参

常见攻击方式

  • 使用';--
SELECT * FROM  adv where title='zhangsan';DROP TABLE article--'

引号和分号是为了隔离前面的sql语句,后面的--代表注释。因为最后一个'可能会影响删表,所以使用注释不影响执行删表。注意:最后一个引号来自代码封装:原语句可能如下的写法:


$sql = "SELECT * FROM  adv where title='".$_GET['title']."'";
#这句php代码因为title本身是被引号的
  • 使用 ';' +or + --
SELECT * FROM  adv where title='zhangsan' or DROP TABLE article--'

注意:在PHP中的 mysql_query() 是不允许执行多个SQL语句的,但是还是可以通过or and 等语句来执行。

预防sql注入

  • 开启php魔术模式,magic_quotes_gpc=on;
  • 打开php.ini中的安全模式 safe_mode = on
  • 关闭危险函数,比如system,chmod等函数;
  • 错误信息控制 ,让非开发人员看到有关数据库错误信息是很危险的,这会泄露数据库,表,字段等名称信息以及其他不安全因素。
  • 使用php自带函数将一些特殊字符转义后再执行sql语句:
    • addslashes() 是强行加\;
    • mysql_real_escape_string() 会判断字符集,但是对PHP版本有要求;
    • mysql_escape_string不考虑连接的当前字符集。


主键:

唯一标识一条记录,不能有重复的,不允许为空,一个表只有一个主键,用于保证数据的唯一,完整性。

外键:

表的外键是另一表的主键, 外键可以有重复的, 可以是空值,一个表可以有多个主键,用来和其他表建立关系。

索引:

分主键索引(唯一,不允许空、重复),唯一索引(唯一,可空),普通索引(可空,重复),多个索引,用于加快查询。


NULL 是一个特殊的值,在数据库中表示未知或不可用的值。它表示某个字段没有有效值,或者在查询中没有找到匹配的值。

特性:

  • 对NULL这个值的任何比较都会生产一个NULL值;
  • 您不能把任何值与一个 NULL值进行比较,并在逻辑上希望获得一个答案;
  • 使用IS NULL来进行NULL判断

基本表是本身独立存在的表,在 SQL 中一个关系就对应一个表。

第一范式:1NF是对属性的原子性约束,要求属性具有原子性,不可再分解;

第二范式:2NF是对记录的惟一性约束,要求记录有惟一标识,即实体的惟一性;

第三范式:3NF是对字段冗余性的约束,即任何字段不能由其他字段派生出来,它要求字段没有冗余

索引就一种特殊的查询表,数据库的搜索引擎可以利用它加速对数据的检索。它很类似与现实生活中书的目录,不需要查询整本书内容就可以找到想要的数据。索引可以是唯一的,创建索引允许指定单个列或者是多个列。

缺点是它减慢了数据录入的速度,同时也增加了数据库的尺寸大小。

数据库存储过程是一种数据库应用程序,它使用一组特定的SQL语句来操作数据库中的数据。存储过程可以用来提高数据库的性能,提供可重复使用的功能,以及提高数据库的安全性。

优点:

1.可以提高数据库的性能:存储过程可以提高数据库的性能,因为它可以将一组SQL语句封装为一个单独的过程,而不是每次执行SQL语句时都要重新编译它们。

2.可重复使用:存储过程可以被多次使用,这样可以节省开发时间,减少重复代码。

3.提高安全性:存储过程可以提高数据库的安全性,因为它可以限制用户对数据库的访问,同时也可以防止用户误操作数据库。

数据库视图是一种特殊的虚拟表,它的内容来自一个或多个表,可以把多个表的数据组合在一起,以便简化查询。

游标是一种用于遍历数据集的特殊对象,它可以用来查询特定的行,更新特定的行,或者删除特定的行。它可以用来检索数据库中的数据,并在过程中控制行的处理方式,一般不使用游标,但是需要逐条处理数据的时候,游标显得十分重要。

视图的优点:

(1) 视图能够简化用户的操作

(2) 视图使用户能以多种角度看待同一数据;

(3) 视图为数据库提供了一定程度的逻辑独立性;

(4) 视图能够对机密数据提供安全保护。