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值進行比較,如果兩值相等則進行下一步操作,否則程序則中止運行