1. 程式人生 > >PHP安全程式設計

PHP安全程式設計

背景:起初,自己買了域名,伺服器,搭建了一個簡易的blog系統,發發文章,記錄一下心情什麼的,以為這個小小的網站不會有人來搞事,關於安全方面幾乎沒做工作,犯了大忌,特去總結大神路數,以作應對之策。;


相關文章出處:https://www.codeproject.com/Articles/363897/PHP-Security  (需要翻牆)

簡介

要提供網際網路服務,當你在開發程式碼的時候必須時刻保持安全意識。可能大部分 PHP 指令碼都對安全問題都不在意,這很大程度上是因為有大量的無經驗程式設計師在使用這門語言。但是,沒有理由讓你因為對你的程式碼的不確定性而導致不一致的安全策略。當你在伺服器上放任何涉及到錢的東西時,就有可能會有人嘗試破解它。建立一個論壇程式或者任何形式的購物車,被攻擊的可能性就上升到了無窮大。

背景

為了確保你的 web 內容安全,這裡有一些常規的安全準則:

別相信表單

攻擊表單很簡單。通過使用一個簡單的 JavaScript 技巧,你可以限制你的表單只允許在評分域中填寫 1 到 5 的數字。如果有人關閉了他們瀏覽器的 JavaScript 功能或者提交自定義的表單資料,你客戶端的驗證就失敗了。

使用者主要通過表單引數和你的指令碼互動,因此他們是最大的安全風險。你應該學到什麼呢?在 PHP 指令碼中,總是要驗證 傳遞給任何 PHP 指令碼的資料。在本文中,我們向你演示瞭如何分析和防範跨站指令碼(XSS)攻擊,它可能會劫持使用者憑據(甚至更嚴重)。你也會看到如何防止會玷汙或毀壞你資料的 MySQL 注入攻擊。

別相信使用者

假定你網站獲取的每一份資料都充滿了有害的程式碼。清理每一部分,即便你相信沒有人會嘗試攻擊你的站點。

關閉全域性變數

你可能會有的最大安全漏洞是啟用了 register_globals 配置引數。幸運的是,PHP 4.2 及以後版本預設關閉了這個配置。如果打開了 register_globals,你可以在你的 php.ini 檔案中通過改變 register_globals 變數為 Off 關閉該功能:

1 register_globals = Off

新手程式設計師覺得註冊全域性變數很方便,但他們不會意識到這個設定有多麼危險。一個啟用了全域性變數的伺服器會自動為全域性變數賦任何形式的引數。為了瞭解它如何工作以及為什麼有危險,讓我們來看一個例子。

假設你有一個稱為 process.php 的指令碼,它會向你的資料庫插入表單資料。初始的表單像下面這樣:

XHTML
1 <input name = "username" type = "text" size = "15" maxlength = "64" >

執行 process.php 的時候,啟用了註冊全域性變數的 PHP 會將該引數賦值到 $username 變數。這會比通過 $_POST[‘username’] $_GET[‘username’] 訪問它節省擊鍵次數。不幸的是,這也會給你留下安全問題,因為 PHP 會設定該變數的值為通過 GET 或 POST 的引數傳送到指令碼的任何值,如果你沒有顯示地初始化該變數並且你不希望任何人去操作它,這就會有一個大問題。

看下面的指令碼,假如 $authorized 變數的值為 true,它會給使用者顯示通過驗證的資料。正常情況下,只有當用戶正確通過了這個假想的 authenticated_user() 函式驗證,$authorized 變數的值才會被設定為真。但是如果你啟用了 register_globals,任何人都可以傳送一個 GET 引數,例如 authorized=1 去覆蓋它:

PHP
1 2 3 4 5 6 <?php // Define $authorized = true only if user is authenticated if ( authenticated_user ( ) ) {      $authorized = true ; } ?>

這個故事的寓意是,你應該從預定義的伺服器變數中獲取表單資料。所有通過 post 表單傳遞到你 web 頁面的資料都會自動儲存到一個稱為 $_POST 的大陣列中,所有的 GET 資料都儲存在 $_GET 大陣列中。檔案上傳資訊儲存在一個稱為 $_FILES 的特殊資料中。另外,還有一個稱為 $_REQUEST 的複合變數。

要從一個 POST 方法表單中訪問 username 欄位,可以使用 $_POST[‘username’]。如果 username 在 URL 中就使用$_GET[‘username’]。如果你不確定值來自哪裡,用 $_REQUEST[‘username’]

PHP
1 2 3 4 5

相關推薦

PHP安全程式設計系列》系列分享專欄

PHP安全程式設計系列收藏夾收藏了有關PHP安全程式設計方面的知識,對PHP安全程式設計提供學習參考 《PHP安全程式設計系列》已整理成PDF文件,點選可直接下載至本地查閱 https://www.webfalse.com/read/201738.html 文章 discu

PHP安全程式設計

背景:起初,自己買了域名,伺服器,搭建了一個簡易的blog系統,發發文章,記錄一下心情什麼的,以為這個小小的網站不會有人來搞事,關於安全方面幾乎沒做工作,犯了大忌,特去總結大神路數,以作應對之策。; 相關文章出處:https://www.codeproject.com/Articles/

PHP安全程式設計:session劫持的防禦session 資料暴露

GET / HTTP/1.1 Host: example.org User-Agent: Firefox/1.0 Accept: text/html, image/png, image/jpeg, image/gif, */* Cookie: PHPSESSID=1234你應該意識到請求的一致性,並把不一致的

PHP安全程式設計:防止SQL注入

SQL 注入是PHP應用中最常見的漏洞之一。事實上令人驚奇的是,開發者要同時犯兩個錯誤才會引發一個SQL注入漏洞,一個是沒有對輸入的資料進行過濾(過濾輸入),還有一個是沒有對傳送到資料庫的資料進行轉義(轉義輸出)。這兩個重要的步驟缺一不可,需要同時加以特別關注以減少程式錯誤

PHP安全程式設計:session劫持的防禦

session 資料暴露 會話資料常會包含一些個人資訊和其它敏感資料。基於這個原因,會話資料的暴露是被普遍關心的問題。一般來說,暴露的範圍不會很大,因為會話資料是儲存在伺服器環境中的,而不是在資料庫或檔案系統中。因此,會話資料自然不會公開暴露。使用SSL是一種特別有效的手段

PHP安全程式設計:不要暴露資料庫訪問許可權

資料庫使用中需要關注的主要問題之一是訪問許可權即使用者名稱及密碼的暴露。在程式設計中為了方便,一般都會用一個db.inc檔案儲存,如: <?php   $db_user = 'myuser';   $db_pass = 'mypass';   $db_host =

PHP安全防範與程式設計

 簡介   當開發一個網際網路服務的時候,必須時刻牢記安全觀念,並在開發的程式碼中體現。PHP指令碼語言對安全問題並不關心,特別是對大多數沒有經驗的開發者來說。每當你講任何涉及到錢財事務等交易問題時,需要特別注意安全問題的考慮,例如開發一個論壇或者是一個購物車

Windows下PHP安全環境的搭建

版本 right AC info 所有 lock 六月 .com ash 筆者一直在Windows環境下搭建PHP的運行環境,大大小小的運行環境用過不少,從開始的WAMP到後來的XAMPP以及PHPnow。WAMP和XAMPP都是繼承mysql apache以及PHP庫的運

php安全入門

cookies 又是 use 輸入 only .net csr 文件的 預編譯 參考網址: https://www.cnblogs.com/luyucheng/p/6234524.html https://blog.csdn.net/luyaran/article/deta

安全程式設計(十六)- 楊輝三角

1.簡單介紹           楊輝三角大家應該都不陌生,我就不多說了! 1 1 1 1 2 1

安全程式設計(十五)- finally程式碼塊和Exception物件

1.異常處理的時候,finally程式碼塊的作用是什麼?         無論是否丟擲異常,fianlly程式碼塊總會被執行!就算沒有catch的情況下丟擲異常,finally任會被執行。finally程式碼塊的作用是釋放資源,比如I/O緩衝區,資料庫的連

安全程式設計(十四)- Java中throw和throws的區別

1.粗淺來說         throw是一個語句丟擲異常,throws是一個方法丟擲異常;         throw不是和try-catch-finally配套使用就是和throws配套使用,而throws可

安全程式設計(十三)- 異常

1.引言         Throwable類所有的異常和錯誤的超類,有兩個子類Error和Exception,分別表示錯誤和異常。其中異常類Exception又分為執行類異常(RuntimeException)和非執行時異常。   &nbs

安全程式設計(十二) - static

1.引言         java中被static修飾的成員叫做靜態成員或類成員。她屬於整個類所有,而非某一個物件所有,即被類的所以物件所共享。靜態成員可以使用類名直接訪問,也可以使用物件名進行訪問。大多時候推薦使用類名進行訪問。   &nb

安全程式設計(十一)- ArrayList,Vector,LinkedList

1.三者介紹 1.1ArrayList     1.1.1簡單介紹:         ArrayList是Java集合中常用的資料結構,繼承自AbstractList,實現了List介面,是一個動態陣列,支援大小的改變,可以靈活

安全程式設計(十)- 垃圾收集器

1.Java中垃圾收集器有什麼作用?什麼時候進行垃圾回收?         眾所周知,基本資料型別,區域性變數都是存放在棧記憶體中的,用完就消失;而用new建立的例項化物件和陣列,是存放在堆記憶體中的,用完之後就需要一個東西來清除回收它們。  

安全程式設計(九)- Java集合類框架的最佳實踐

1.引言         根據應用的需要正確選定集合型別對效能非常重要! 2.例項         2.1假如集合元素的大小是固定的,而且能事先知道,我們就應該用Array而不是用ArrayList。文章

安全程式設計(八 . 二)- 有序陣列的實現

1.引言         有序陣列:陣列儲存有序的元素; 2.實現(暫不考慮重複元素)         (1).程式主體: public class OrderArray { priva

安全程式設計(七)- Java優先佇列(PriorityQueue)

1.引言         我們知道佇列是遵循先進先出(First-In-First-Out)模式的,但有些時候需要在佇列中基於優先順序處理物件。舉個例子,比方說我們有一個每日交易時段生成股票報告的應用程式,需要處理大量資料並且花費很多處理時間。客

安全程式設計(六)- Java集合類2

1.陣列(Array)和列表(ArrayList)有什麼區別?什麼時候應該使用Array而不是ArrayList?         Array可以包含基本資料型別和物件型別,ArrayList只能包含物件型別;