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值进行比较,如果两值相等则进行下一步操作,否则程序则中止运行
时间: 2024-10-16 00:46:32