1、sql注入
什么是sql注入?就是用户输入特殊字符改变原有sql的语义,这就叫sql注入。
我们看一下例子:
首先建立一个简单的user表模拟一下sql注入,如图所示
然后我们模拟一下用户登录:
$username = $_POST['username'];
$passwd = $_POST['passwd'];
$sql = "select * from user where username='$username' and passwd='$passwd'";
$result = mysql_query($sql);
if($result){
echo 'login success';
}else{
echo 'login failed';
}
如果用户输入的username=beggar和passwd=123456,此用户是可以登录的。
思考一下,如果用户输入的数据为username=beggar和passwd=' or '1=1',此时的sql语句为select * from user where username='beggar' and passwd='' or '1=1';
这样这个用户就可以在不知道密码的情况下登录成功。
如何防止呢?
在后台应当对用户输入的数据进行一定的过滤,我们也可以写一个方法进行处理接收到的数据,如:
function add_slashes($name, $type){
switch ($type){
case 'integer' :
if(is_array($name)){
foreach ($name as $key=>$val){
$name[$key] = intval($val);
}
}else{
if(isset($_POST[$name])){
$name = intval($_POST[$name]);
}elseif(isset($_GET[$name])){
$name = intval($_GET[$name]);
}
}
break;
case 'string' :
if(!get_magic_quotes_gpc()){
if(is_array($name)){
foreach ($name as $key=>$val){
$name[$key] = addslashes($val);
}
}elseif(isset($_GET[$name])){
if(isset($_POST[$name])){
$name = addslashes($_POST[$name]);
}else{
$name = addslashes($_GET[$name]);
}
}
}
break;
}
return strip_tags($name);
}
2、XSS攻击
后台接收到数据并显示出来:
$username = $_POST['username'];
$passwd = $_POST['passwd'];
echo 'user info :<br/>';
echo 'username:' . $username . '<br/>';
echo 'passwd:' . $passwd . '<br/>';
当用户输入的username为<script>alert("you are a bitch! haha...")</script> (开个玩笑)
在展示的页面中则会弹出you are a bitch! haha...
如何防止呢?
使用PHP自带的strip_tags函数、htmlspecialchars、htmlentities这三个函数都可以对html进行过滤,第一个函数会去除所有html标签,第二个和三个函数则会html标签进行转义
3、csrf攻击
常用方法是在隐藏表单中加入token法,token是个随机数,在提交表单时候会把token传过去,后台接收到token后则和后台session中的token值进行比较,如果两值相等则进行下一步操作,否则程序则中止运行