正常SQL语句:
select * from users where name='zhangsan' and password=md5('12345678')
不正常执行的sql语句:
用户名:’ or 1 #
select * from users where name='' or 1 #' and password=md5('789789')
用户名:’ or 1 or ’
select * from users where name='' or 1 or '' and password=md5('789789')
SQL语句除了登录的地方其他使用到的sql语句都存在注入
例如 删除数据库的sql语句
select * from users where name=' or 1;drop database abcd;#' and password=md5('789789')
**
解决方式
**
1、 在业务逻辑上预防,比如要求用户名只能由特定的字符组成(比如数字字母下划线)(使用正则表达式)
2、 使用PHP函数addslashes(最常用)其中:strip_tags(trim($data)是防止JS注入的!!
/**
* 对用户的数据进行安全过滤
*/
protected function escapeData($data) {
return addslashes(strip_tags(trim($data)));
}
3、 使用MySQL提供的数据转义函数:mysqli_real_escape_string($data, $link);不过有一个前提是必须连接上数据库之后才可以使用!
4、 使用预处理技术,因为预处理是强制将sql语句的结构和数据部分分开!