常見漏洞及處理方法
阿新 • • 發佈:2018-12-27
1、sql注入
什麼是sql注入?就是使用者輸入特殊字元改變原有sql的語義,這就叫sql注入。
我們看一下例子:
首先建立一個簡單的user表模擬一下sql注入,如圖所示
然後我們模擬一下使用者登入:
如果使用者輸入的username=beggar和passwd=123456,此使用者是可以登入的。$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=' or '1=1',此時的sql語句為select * from user where username='beggar' and passwd='' or '1=1';
這樣這個使用者就可以在不知道密碼的情況下登入成功。
如何防止呢?
在後臺應當對使用者輸入的資料進行一定的過濾,我們也可以寫一個方法進行處理接收到的資料,如:
2、XSS攻擊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); }
後臺接收到資料並顯示出來:
$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值進行比較,如果兩值相等則進行下一步操作,否則程式則中止執行