前段时间去听了内部4399手游老大讲了一些php安全方面的知识,有的是我也没听过的,有的是听过的,觉得比较好的,记录下来
Sql注入的原理非常简单,就是用户输入的数据,程序把这些数据也当做成了命令去执行,这就产生了Sql注入
解决这个问题,也非常简单..如果我把用户输入的数据当做是数据,而不是程序去执行,那么自然就不会产生Sql注入问题.
如何把用户的输入当做是数据而不程序?
方法即就是使用sql预编译
熟悉java ee的人都应该比较清楚hibernate
经常可以看到hibernate类似的语法是
insert into table (username,password)values(?,?);
其实这样的语法是数据库自带的,并不是hibernate所编写的,这样的方式其实就是预编译,完成的sql语句就是
prepare pstmt from 'insert
into table (username,password)values(?,?)';
prepare:数据库关键字
pstmt :为这个预编译起个名(待会会根据这个名字进行调用,在通俗点可以理解为自定义的函数名)
from :不解释
insert into table (username,password)values(?,?) 就是预编译的sql语句
接下来调用的时候就是
set @username='我是用户名'
set @password='我是密码'
execute pstmt using @username,@password;
使用预编译的方式能大大的提高防御sql注入
至于能不能百分之百?我想应该不可能的,这个世界只要是放在互联网上的数据,都是不安全的.