1、SQL注入
SQL注入是一種惡意攻擊,用戶利用在表單字段輸入SQL語句的方式來影響正常的SQL執行。還有一種是通過system()或exec()命令注入的,它具有相同的SQL注入機制,但只針對shell命令。
1
2
3
4
5
6
7
8
9
10
|
$username = $_POST [ 'username' ]; $query = "select * from auth where username = '" . $username . "'" ; echo $query ; $db = new mysqli( 'localhost' , 'demo' , ‘demo ', ‘demodemo' ); $result = $db ->query( $query ); if ( $result && $result ->num_rows) { echo "<br />Logged in successfully" ; } else { echo "<br />Login failed" ; } |
上面的代碼,在第一行沒有過濾或轉義用戶輸入的值($_POST['username'])。因此查詢可能會失敗,甚至會損壞數據庫,這要看$username是否包含變換你的SQL語句到別的東西上。
防止SQL注入
選項:
使用mysql_real_escape_string()過濾數據
手動檢查每一數據是否為正確的數據類型
使用預處理語句并綁定變量
使用準備好的預處理語句
分離數據和SQL邏輯
預處理語句將自動過濾(如:轉義)
把它作為一個編碼規范,可以幫助團隊里的新人避免遇到以上問題。
1
2
3
4
5
6
7
8
9
10
11
12
13
|
$query = 'select name, district from city where countrycode=?' ; if ( $stmt = $db ->prepare( $query ) ) { $countrycode = 'hk' ; $stmt ->bind_param( "s" , $countrycode ); $stmt ->execute(); $stmt ->bind_result( $name , $district ); while ( $stmt ( $stmt ->fetch() ){ echo $name . ', ' . $district ; echo '<br />' ; } $stmt ->close(); } |
2、XSS攻擊
XSS(跨站點腳本攻擊)是一種攻擊,由用戶輸入一些數據到你的網站,其中包括客戶端腳本(通常JavaScript)。如果你沒有過濾就輸出數據到另一個web頁面,這個腳本將被執行。
接收用戶提交的文本內容
1
2
3
4
5
6
7
8
9
10
11
12
|
<?php if ( file_exists ( 'comments' )) { $comments = get_saved_contents_from_file( 'comments' ); } else { $comments = '' ; } if (isset( $_POST [ 'comment' ])) { $comments .= '<br />' . $_POST [ 'comment' ]; save_contents_to_file( 'comments' , $comments ); } > |
輸出內容給(另一個)用戶
1
2
3
4
5
6
7
|
<form action= 'xss.php' method= 'POST' > Enter your comments here: <br /> <textarea name= 'comment' ></textarea> <br /> <input type= 'submit' value= 'Post comment' /> </form><hr /><br /> <?php echo $comments ; ?> |
將會發生什么事?
煩人的彈窗
刷新或重定向
損壞網頁或表單
竊取cookie
AJAX(XMLHttpRequest)
防止XSS攻擊
為了防止XSS攻擊,使用PHP的htmlentities()函數過濾再輸出到瀏覽器。htmlentities()的基本用法很簡單,但也有許多高級的控制,請參閱XSS速查表。
3、會話固定
會話安全,假設一個PHPSESSID很難猜測。然而,PHP可以接受一個會話ID通過一個Cookie或者URL。因此,欺騙一個受害者可以使用一個特定的(或其他的)會話ID 或者釣魚攻擊。

4、會議捕獲和劫持
這是與會話固定有著同樣的想法,然而,它涉及竊取會話ID。如果會話ID存儲在Cookie中,攻擊者可以通過XSS和JavaScript竊取。如果會話ID包含在URL上,也可以通過嗅探或者從代理服務器那獲得。
防止會話捕獲和劫持
更新ID
如果使用會話,請確保用戶使用SSL
5、跨站點請求偽造(CSRF)
CSRF攻擊,是指一個頁面發出的請求,看起來就像是網站的信任用戶,但不是故意的。它有許多的變體,比如下面的例子:
<img src='http://example.com/single_click_to_buy.php?user_id=123&item=12345'>
防止跨站點請求偽造
一般來說,確保用戶來自你的表單,并且匹配每一個你發送出去的表單。有兩點一定要記住:
對用戶會話采用適當的安全措施,例如:給每一個會話更新id和用戶使用SSL。
生成另一個一次性的令牌并將其嵌入表單,保存在會話中(一個會話變量),在提交時檢查它。
6、代碼注入
代碼注入是利用計算機漏洞通過處理無效數據造成的。問題出在,當你不小心執行任意代碼,通常通過文件包含。寫得很糟糕的代碼可以允許一個遠程文件包含并執行。如許多PHP函數,如require可以包含URL或文件名,例如:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
<form>Choose theme: <select name = theme> <option value = blue>Blue</option> <option value = green>Green</option> <option value = red>Red</option> </select> <input type = submit> </form> <?php if ( $theme ) { require ( $theme . '.txt' ); } ?> |
在上面的例子中,通過傳遞用戶輸入的一個文件名或文件名的一部分,來包含以"http://"開頭的文件。
防止代碼注入
過濾用戶輸入
在php.ini中設置禁用allow_url_fopen和allow_url_include。這將禁用require/include/fopen的遠程文件。
其他的一般原則
1. 不要依賴服務器配置來保護你的應用,特別是當你的web服務器/ PHP是由你的ISP管理,或者當你的網站可能遷移/部署到別處,未來再從別處遷移/部署在到其他地方。請在網站代碼中嵌入帶有安全意識的檢查/邏輯(HTML、JavaScript、PHP,等等)。
2. 設計服務器端的安全腳本:
—例如,使用單行執行 - 單點身份驗證和數據清理
—例如,在所有的安全敏感頁面嵌入一個PHP函數/文件,用來處理所有登錄/安全性邏輯檢查
3. 確保你的代碼更新,并打上最新補丁。
到此這篇關于6個常見的 PHP 安全性攻擊實例和阻止方法的文章就介紹到這了,更多相關PHP安全性攻擊內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!
原文鏈接:https://www.cnblogs.com/John727/p/4500111.html