数据库设计规范
逻辑设计 ->物理设计
实际工作中:
逻辑设计+物理设计
物理设计
表名 字段名 字段类型
- 数据库命名规范
- 所有数据库对象名称必须使用小写字母并用下划线分割
- 所有数据库名称禁止使用mysql保留关键字
- 数据库命名做到见名识义,最好不要超过32个字符 mc_userdb(用户数据库) user_account(用户账号表)
- 临时表必须以tmp为前缀并以日期为后缀
- 备份表,备份表必须以bak为前缀并以日期为后缀
5 . 存储相同数据的列名和列类型必须一致
- 数据库基本设计规范
- 所有表必须使用Innodb存储引擎(5.6以后的默认引擎 支持事物,行级锁,更好的恢复性,高并发下性能好)
- 数据库和表的字符集统一规范UTF8(避免字符集转换成乱码 mysql中utf8字符集汉子3个字节,ASCII码占用1个字节)
- 所有表和字段需要字段 (使用comment 添加备注 从一开始进行数据字典的维护)
- 尽量控制单表数据量的大小,尽量控制500万以内 (这种限制取决于存储设置和文件系统)
- 数据库索引设计规范
- 数据库字段设计规范
- 数据库sql开发规范
- 数据库操作行为规范
什么是sql注入
sql注入是一种将sql代码添加到输入参数中,传递到sql服务器解析并执行的一种攻击手法
sql产生
- web开发人员无法保证所有的输入都已经过滤
- 攻击者利用发送sql服务器的输入数据构造可执行的sql代码
- 数据库为做想应的配置
如何寻找sql漏洞
借助逻辑推理
- 识别web应用中所有输入点
- 了解哪些类型的请求会触发异常
- 检测服务器响应中的异常
如何进行sql注入攻击
- 数字注入
- 使where 条件永远为真 构造 sql语句转换 where id =-1 or 1=1
- 字符串注入
- 参数 lala'# lala'-- sql语句转换 where name ='lala'#' and password = '123123'
如何预防sql注入
1. 数字类型 $id = isset($_GET['id']) ? $_GET['id'] :'';
if(empty($id) || !is_numeric($id))
{
die('参数有误');
}
2. 字符串类型 if(empty($user_name) || !preg_match("/^[a-zA-Z0-9]{6,}$/",$user_name))3.转义字符串
3. 转义字符 php函数
$sql ="select * from user where user_name = '" . addslashes($user_name) ."' and pass ='".md5($pass) . "'";
mysql函数
$sql ="select * from user where user_name = '" . mysqli_real_escape_string($db,$user_name) ."' and pass ='".md5($pass) . "'";
4. 利用mysql的预编译机制 $sql = "select id,user_name from user where user_name = ? and pass = ?";