php安全性問題

1、SQL注入php

所謂SQL注入,就是經過把SQL命令插入到Web表單提交或輸入域名或頁面請求的查詢字符串,最終達到欺騙服務器執行惡意的SQL命令。具體來講,它是利用現有應用程序,將(惡意)的SQL命令注入到後臺數據庫引擎執行的能力,它能夠經過在Web表單中輸入(惡意)SQL語句獲得一個存在安全漏洞的網站上的數據庫,而不是按照設計者意圖去執行SQL語句。好比先前的不少影視網站泄露VIP會員密碼大多就是經過WEB表單遞交查詢字符暴出的,這類表單特別容易受到SQL注入式攻擊.html

例如:mysql

<form action="sqlzhuru.php" method="post">
<input type="text" name="uid" />
<input type="submit" value="提交" />
</form>
sqlzhuru.php:
<?php
include("../DB.class.php");
$db = new DB();
$uid = $_POST["uid"];
$sql = "select * from users where uid = '{$uid}'";
echo $sql;
var_dump($db->Query($sql));

這樣就能夠查到全部信息,解決方法:sql

1. 手動檢查每一條數據是否爲正確的數據類型,本身寫一個方法來過濾提交數據數據庫

2.系統自帶的一個方法:mysql_real_escape_string()過濾數據,但該方法在將來版本會淘汰數組

<?php
include("../DB.class.php");
$db = new DB();
$uid = $_POST["uid"];
$uid = mysql_real_escape_string($uid); //系統自帶過濾方法,但已通過時了
$sql = "select * from users where uid = '{$uid}'";
echo $sql;
var_dump($db->Query($sql));

3.使用PDO預處理瀏覽器

2、XSS攻擊安全

跨站腳本攻擊(Cross Site Scripting),爲不和層疊樣式表(Cascading Style Sheets, CSS)的縮寫混淆,故將跨站腳本攻擊縮寫爲XSS。惡意攻擊者往Web頁面裏插入惡意Script代碼,當用戶瀏覽該頁之時,嵌入其中Web裏面的Script代碼會被執行,從而達到惡意攻擊用戶的特殊目的。服務器

例如:session

<form action="xssgongji.php" method="post">
<input type="text" name="test" />
<input type="submit" value="提交" />
</form>

處理頁面:

<?php
include("../DB.class.php");
$db = new DB();
echo $_POST["test"];

若用IE瀏覽器打開test頁面:

由於IE沒有過濾方法,會彈出彈窗,而像谷歌、火狐、360等瀏覽器會屏蔽掉,不會彈出彈窗。

解決方法:

1.本身寫一個方法屏蔽xss攻擊,過濾字符串

2.系統自帶方法解決

<?php
/**屏蔽xss攻擊方法
 * @blog http://www.phpddt.com
 * @param $string
 * @param $low 安全別級低
 */
function clean_xss(&$string, $low = False)
{
    if (! is_array ( $string ))
    {
        $string = trim ( $string );
        $string = strip_tags ( $string );
        $string = htmlspecialchars ( $string );
        if ($low)
        {
            return True;
        }
        $string = str_replace ( array ('"', "\\", "'", "/", "..", "../", "./", "//" ), '', $string );
        $no = '/%0[0-8bcef]/';
        $string = preg_replace ( $no, '', $string );
        $no = '/%1[0-9a-f]/';
        $string = preg_replace ( $no, '', $string );
        $no = '/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]+/S';
        $string = preg_replace ( $no, '', $string );
        return True;
    }
    $keys = array_keys ( $string );
    foreach ( $keys as $key )
    {
        clean_xss ( $string [$key] );
    }
}
//just a test
$str = 'phpddt.com<meta http-equiv="refresh" content="0;">';
clean_xss($str); //若是你把這個註釋掉,你就知道xss攻擊的厲害了
echo $str;
?>
View Code

 3、CSRF攻擊

CSRF(Cross-site request forgery跨站請求僞造,也被稱爲「One Click Attack」或者Session Riding,一般縮寫爲CSRF或者XSRF,是一種對網站的惡意利用。儘管聽起來像跨站腳本(XSS),但它與XSS很是不一樣,而且攻擊方式幾乎相左。XSS利用站點內的信任用戶,而CSRF則經過假裝來自受信任用戶的請求來利用受信任的網站。與XSS攻擊相比,CSRF攻擊每每不大流行(所以對其進行防範的資源也至關稀少)和難以防範,因此被認爲比XSS更具危險性。

例如:

<?php
session_start();
$_SESSION["uid"] = "lisi";
?>
<form action="csrfcl.php" method="get">
<input type="text" name="qian" />
<input type="submit" value="提交" />
</form>

處理頁面:

<?php
session_start();
include("../DB.class.php");
$db = new DB();
if(empty($_SESSION["uid"]))
{
    echo "未登陸";    
}
else
{    $qian = $_GET["qian"];    
    $sql = "update login set account = account-{$qian} where username = '{$_SESSION['uid']}'";
    echo $sql;
    $db->Query($sql,1);    
}

打開csrf.php頁面:

    

數據庫中數據:

這種get傳值方式會在地址欄顯示提交數據,在不關閉頁面的狀況下,再作一個頁面,把地址複製進去

<body>
<img src="http://localhost/phpanquan/csrfcl.php?qian=100" />
</body>

這樣請求這個頁面,也會將數據庫中數據改掉:

而若是改爲POST方式,能夠減小這種狀況,也能夠在表單中用隱藏域多提交一條數據,例如:

<?php
session_start();
$_SESSION["uid"] = "lisi";
$str = md5($_SESSION["uid"]);
?>
<form action="csrfcl.php" method="post">
<input type="hidden" value="<?php echo $str ?>" name="xinxi" />
<input type="text" name="qian" />
<input type="submit" value="提交" />
</form>

處理頁面:

<?php
session_start();
include("../DB.class.php");
$db = new DB();

if(empty($_SESSION["uid"]))
{
    echo "未登陸";    
}
else
{
    $uid =md5($_SESSION["uid"]);
    $str = $_POST["xinxi"];    
    if($uid == $str)
    {
        $qian = $_POST["qian"];    
        $sql = "update login set account = account-{$qian} where username = '{$_SESSION['uid']}'";
        echo $sql;
        $db->Query($sql,1);
    }
}

可是這種方式也不能徹底避免CSRF攻擊,即便用MD5加密,也仍是有人能夠解出來,最好的方法仍是使用驗證碼。你不知道驗證碼是怎麼生成的,就沒法進行CSRF攻擊。

SQL注入只需過濾提交的字符串便可,XSS攻擊用PDO預處理,CSRF攻擊用驗證碼就可解決。

有些黑客會僞造FILE數組上傳,如何辨別:move_upload_file()能夠判斷是否是真實文件。

之後作項目,有關安全性的地方必定要謹慎,千萬不要輕易相信用戶上傳或提交的任何數據,必定要進行正確處理。

相關文章
相關標籤/搜索