php安全性問題

來源:互聯網
上載者:User

標籤:rip   字元   加密   clu   命令   site   代碼   如何   類型   

源文來自部落格魅影星魂 https://www.cnblogs.com/xinghun/p/5660846.html

一、SQL注入

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

例如:

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

這樣就可以查到所有資訊,解決方案:

1. 手動檢查每一條資料是否為正確的資料類型,自己寫一個方法來過濾提交資料

2.系統內建的一個方法:mysql_real_escape_string()過濾資料,但該方法在未來版本會淘汰

<?phpinclude("../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預先處理

二、XSS攻擊

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

例如:

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

處理頁面:

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

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

因為IE沒有過濾方法,會彈出彈窗,而像Google、Firefox、360等瀏覽器會屏蔽掉,不會彈出彈窗。

解決方案:

1.自己寫一個方法屏蔽xss攻擊,過濾字串

2.系統內建方法解決

 View Code

 三、CSRF攻擊

CSRF(Cross-site request forgery跨站請求偽造,也被稱為“One Click Attack”或者Session Riding,通常縮寫為CSRF或者XSRF,是一種對網站的惡意利用。儘管聽起來像跨站指令碼(XSS),但它與XSS非常不同,並且攻擊方式幾乎相左。XSS利用網站內的信任使用者,而CSRF則通過偽裝來自受信任使用者的請求來利用受信任的網站。與XSS攻擊相比,CSRF攻擊往往不大流行(因此對其進行防範的資源也相當稀少)和難以防範,所以被認為比XSS更具危險性。

例如:

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

處理頁面:

<?phpsession_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方式,可以減少這種情況,也可以在表單中用隱藏欄位多提交一條資料,例如:

<?phpsession_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>

處理頁面:

<?phpsession_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()可以判斷是不是真實檔案。

以後做項目,有關安全性的地方一定要謹慎,千萬不要輕易相信使用者上傳或提交的任何資料,一定要進行正確處理。

php安全性問題

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.