所谓SQL注入,就是经过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。php
咱们永远不要信任用户的输入,咱们必须认定用户输入的数据都是不安全的,咱们都须要对用户输入的数据进行过滤处理。html
如下实例中,输入的用户名必须为字母、数字及下划线的组合,且用户名长度为 8 到 20 个字符之间:mysql
if (preg_match("/^\w{8,20}$/", $_GET['username'], $matches)){ $result = mysqli_query($conn, "SELECT * FROM users WHERE username=$matches[0]"); } else { echo "username 输入异常"; }
让咱们看下在没有过滤特殊字符时,出现的SQL状况:正则表达式
// 设定$name 中插入了咱们不须要的SQL语句 $name = "Qadir'; DELETE FROM users;"; mysqli_query($conn, "SELECT * FROM users WHERE name='{$name}'");
以上的注入语句中,咱们没有对 $name 的变量进行过滤,$name 中插入了咱们不须要的SQL语句,将删除 users 表中的全部数据。sql
在PHP中的 mysqli_query() 是不容许执行多个 SQL 语句的,可是在 SQLite 和 PostgreSQL 是能够同时执行多条SQL语句的,因此咱们对这些用户的数据须要进行严格的验证。数据库
防止SQL注入,咱们须要注意如下几个要点:安全
在脚本语言,如Perl和PHP你能够对用户输入的数据进行转义从而来防止SQL注入。服务器
PHP的MySQL扩展提供了mysqli_real_escape_string()函数来转义特殊的输入字符。函数
if (get_magic_quotes_gpc()) { $name = stripslashes($name); } $name = mysqli_real_escape_string($conn, $name); mysqli_query($conn, "SELECT * FROM users WHERE name='{$name}'");
like查询时,若是用户输入的值有"_"和"%",则会出现这种状况:用户原本只是想查询"abcd_",查询结果中却有"abcd_"、"abcde"、"abcdf"等等;用户要查询"30%"(注:百分之三十)时也会出现问题。工具
在PHP脚本中咱们可使用addcslashes()函数来处理以上状况,以下实例:
$sub = addcslashes(mysqli_real_escape_string($conn, "%something_"), "%_"); // $sub == \%something\_ mysqli_query($conn, "SELECT * FROM messages WHERE subject LIKE '{$sub}%'");
addcslashes() 函数在指定的字符前添加反斜杠。
语法格式:
addcslashes(string,characters)
参数 | 描述 |
---|---|
string | 必需。规定要检查的字符串。 |
characters | 可选。规定受 addcslashes() 影响的字符或字符范围。 |
具体应用能够查看:PHP addcslashes() 函数
查看: http://www.runoob.com/mysql/mysql-sql-injection.html
MySQL中myisam与innodb的区别
(1)、不一样;
(2)、innodb引擎的4大特性
插入缓冲(insert buffer),二次写(double write),自适应哈希索引(ahi),预读(read ahead)
(3)、2者select count(*)哪一个更快,为何
myisam更快,由于myisam内部维护了一个计数器,能够直接调取。
1)范式优化: 好比消除冗余(节省空间。。)
2)反范式优化:好比适当加冗余等(减小join)
3)拆分表: 分区将数据在物理上分隔开,不一样分区的数据能够制定保存在处于不一样磁盘上的数据文件里。这样,当对这个表进行查询时,只须要在表分区中进行扫描,而没必要进行全表扫描,明显缩短了查询时间,另外处于不一样磁盘的分区也将对这个表的数据传输分散在不一样的磁盘I/O,一个精心设置的分区能够将数据传输对磁盘I/O竞争均匀地分散开。对数据量大的时时表可采起此方法。可按月自动建表分区。
4)拆分其实又分垂直拆分和水平拆分: 案例: 简单购物系统暂设涉及以下表:
方案: 用户表经过性别拆分为男用户表和女用户表 订单表经过已完成和完成中拆分为已完成订单和未完成订单 产品表 未完成订单放一个server上 已完成订单表盒男用户表放一个server上 女用户表放一个server上
数据类型
大体能够分为三类:数值、日期/时间和字符串(字符)类型。