關於PHP安全程式設計的一些建議

2020-07-16 10:05:41
簡介

背景

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

1、別相信表單

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

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

2、別相信使用者

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

3、關閉全域性變數

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

register_globals = Off

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

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

<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
// 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
$post_value = $_POST['post_value'];
$get_value = $_GET['get_value'];
$some_variable = $_REQUEST['some_value']; 
?>

$_REQUEST $_GET$_POST、和 $_COOKIE 陣列的結合。如果你有兩個或多個值有相同的引數名稱,注意 PHP 會使用哪個。預設的順序是 cookiePOST、然後是 GET

以上就是為大家整理的一些程式設計安全建議。更過相關問題請存取PHP中文網:https://www.php.cn/

以上就是關於PHP安全程式設計的一些建議的詳細內容,更多請關注TW511.COM其它相關文章!