自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

網(wǎng)絡(luò)安全之PHP安全編程建議

安全 應(yīng)用安全
要提供互聯(lián)網(wǎng)服務(wù),當(dāng)你在開發(fā)代碼的時(shí)候必須時(shí)刻保持安全意識(shí)??赡艽蟛糠?PHP 腳本都對(duì)安全問題都不在意,這很大程度上是因?yàn)橛写罅康?無經(jīng)驗(yàn)程序員 在使用這門語言。但是,沒有理由讓你因?yàn)閷?duì)你的代碼的不確定性而導(dǎo)致不一致的安全策略。當(dāng)你在服務(wù)器上放任何涉及到錢的東西時(shí),就有可能會(huì)有人嘗試破解它。創(chuàng)建一個(gè)論壇程序或者任何形式的購物車,被攻擊的可能性就上升到了無窮大。

簡(jiǎn)介

要提供互聯(lián)網(wǎng)服務(wù),當(dāng)你在開發(fā)代碼的時(shí)候必須時(shí)刻保持安全意識(shí)。可能大部分 PHP 腳本都對(duì)安全問題都不在意,這很大程度上是因?yàn)橛写罅康?無經(jīng)驗(yàn)程序員 在使用這門語言。但是,沒有理由讓你因?yàn)閷?duì)你的代碼的不確定性而導(dǎo)致不一致的安全策略。當(dāng)你在服務(wù)器上放任何涉及到錢的東西時(shí),就有可能會(huì)有人嘗試破解它。創(chuàng)建一個(gè)論壇程序或者任何形式的購物車,被攻擊的可能性就上升到了無窮大。

背景

為了確保你的 web 內(nèi)容安全,這里有一些常規(guī)的安全準(zhǔn)則:

別相信表單

攻擊表單很簡(jiǎn)單。通過使用一個(gè)簡(jiǎn)單的 JavaScript 技巧,你可以限制你的表單只允許在評(píng)分域中填寫 1 到 5 的數(shù)字。如果有人關(guān)閉了他們?yōu)g覽器的 JavaScript 功能或者提交自定義的表單數(shù)據(jù),你客戶端的驗(yàn)證就失敗了。

用戶主要通過表單參數(shù)和你的腳本交互,因此他們是最大的安全風(fēng)險(xiǎn)。你應(yīng)該學(xué)到什么呢?在 PHP 腳本中,總是要驗(yàn)證 傳遞給任何 PHP 腳本的數(shù)據(jù)。在本文中,我們向你演示了如何分析和防范跨站腳本(XSS)攻擊,它可能會(huì)劫持用戶憑據(jù)(甚至更嚴(yán)重)。你也會(huì)看到如何防止會(huì)玷污或毀壞你數(shù)據(jù)的 MySQL 注入攻擊。

別相信用戶

假定你網(wǎng)站獲取的每一份數(shù)據(jù)都充滿了有害的代碼。清理每一部分,即便你相信沒有人會(huì)嘗試攻擊你的站點(diǎn)。

關(guān)閉全局變量

你可能會(huì)有的最大安全漏洞是啟用了 register_globals 配置參數(shù)。幸運(yùn)的是,PHP 4.2 及以后版本默認(rèn)關(guān)閉了這個(gè)配置。如果打開了 register_globals ,你可以在你的 php.ini 文件中通過改變 register_globals 變量為 Off 關(guān)閉該功能:

 

  1. register_globals = Off 

新手程序員覺得注冊(cè)全局變量很方便,但他們不會(huì)意識(shí)到這個(gè)設(shè)置有多么危險(xiǎn)。一個(gè)啟用了全局變量的服務(wù)器會(huì)自動(dòng)為全局變量賦任何形式的參數(shù)。為了了解它如何工作以及為什么有危險(xiǎn),讓我們來看一個(gè)例子。

假設(shè)你有一個(gè)稱為 process.php 的腳本,它會(huì)向你的數(shù)據(jù)庫插入表單數(shù)據(jù)。初始的表單像下面這樣:

運(yùn)行 process.php 的時(shí)候,啟用了注冊(cè)全局變量的 PHP 會(huì)將該參數(shù)賦值到 $username 變量。這會(huì)比通過 $_POST[‘username’] 或 $_GET[‘username’] 訪問它節(jié)省擊鍵次數(shù)。不幸的是,這也會(huì)給你留下安全問題,因?yàn)?PHP 會(huì)設(shè)置該變量的值為通過 GET 或 POST 的參數(shù)發(fā)送到腳本的任何值,如果你沒有顯示地初始化該變量并且你不希望任何人去操作它,這就會(huì)有一個(gè)大問題。

看下面的腳本,假如 $authorized 變量的值為 true,它會(huì)給用戶顯示通過驗(yàn)證的數(shù)據(jù)。正常情況下,只有當(dāng)用戶正確通過了這個(gè)假想的 authenticated_user() 函數(shù)驗(yàn)證,$authorized 變量的值才會(huì)被設(shè)置為真。但是如果你啟用了 register_globals ,任何人都可以發(fā)送一個(gè) GET 參數(shù),例如 authorized=1 去覆蓋它:

這個(gè)故事的寓意是,你應(yīng)該從預(yù)定義的服務(wù)器變量中獲取表單數(shù)據(jù)。所有通過 post 表單傳遞到你 web 頁面的數(shù)據(jù)都會(huì)自動(dòng)保存到一個(gè)稱為 $_POST 的大數(shù)組中,所有的 GET 數(shù)據(jù)都保存在 $_GET 大數(shù)組中。文件上傳信息保存在一個(gè)稱為 $_FILES 的特殊數(shù)據(jù)中。另外,還有一個(gè)稱為 $_REQUEST 的復(fù)合變量。

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

$_REQUEST 是 $_GET、$_POST、和 $_COOKIE 數(shù)組的結(jié)合。如果你有兩個(gè)或多個(gè)值有相同的參數(shù)名稱,注意 PHP 會(huì)使用哪個(gè)。默認(rèn)的順序是 cookie、POST、然后是 GET。

推薦安全配置選項(xiàng)

這里有幾個(gè)會(huì)影響安全功能的 PHP 配置設(shè)置。下面是一些顯然應(yīng)該用于生產(chǎn)服務(wù)器的:

register_globals 設(shè)置為 off safe_mode 設(shè)置為 off error_reporting 設(shè)置為 off。如果出現(xiàn)錯(cuò)誤了,這會(huì)向用戶瀏覽器發(fā)送可見的錯(cuò)誤報(bào)告信息。對(duì)于生產(chǎn)服務(wù)器,使用錯(cuò)誤日志代替。開發(fā)服務(wù)器如果在防火墻后面就可以啟用錯(cuò)誤日志。(LCTT 譯注:此處據(jù)原文邏輯和常識(shí),應(yīng)該是“開發(fā)服務(wù)器如果在防火墻后面就可以啟用錯(cuò)誤報(bào)告,即 on。”) 停用這些函數(shù):system()、exec()、passthru()、shell_exec()、proc_open()、和 popen()。 open_basedir 為 /tmp(以便保存會(huì)話信息)目錄和 web 根目錄,以便腳本不能訪問這些選定區(qū)域外的文件。 expose_php 設(shè)置為 off。該功能會(huì)向 Apache 頭添加包含版本號(hào)的 PHP 簽名。 allow_url_fopen 設(shè)置為 off。如果你能夠注意你代碼中訪問文件的方式-也就是你驗(yàn)證所有輸入?yún)?shù),這并不嚴(yán)格需要。 allow_url_include 設(shè)置為 off。對(duì)于任何人來說,實(shí)在沒有明智的理由會(huì)想要訪問通過 HTTP 包含的文件。

一般來說,如果你發(fā)現(xiàn)想要使用這些功能的代碼,你就不應(yīng)該相信它。尤其要小心會(huì)使用類似 system() 函數(shù)的代碼-它幾乎肯定有缺陷。

啟用了這些設(shè)置后,讓我們來看看一些特定的攻擊以及能幫助你保護(hù)你服務(wù)器的方法。

SQL 注入攻擊

由于 PHP 傳遞到 MySQL 數(shù)據(jù)庫的查詢語句是用強(qiáng)大的 SQL 編程語言編寫的,就有了某些人通過在 web 查詢參數(shù)中使用 MySQL 語句嘗試 SQL 注入攻擊的風(fēng)險(xiǎn)。通過在參數(shù)中插入有害的 SQL 代碼片段,攻擊者會(huì)嘗試進(jìn)入(或破壞)你的服務(wù)器。

假如說你有一個(gè)最終會(huì)放入變量 $product 的表單參數(shù),你使用了類似下面的 SQL 語句:

 

  1. $sql = "select * from pinfo where product = '$product'"

如果參數(shù)是直接從表單中獲得的,應(yīng)該使用 PHP 自帶的數(shù)據(jù)庫特定轉(zhuǎn)義函數(shù),類似:

 

  1. $sql = 'Select * from pinfo where product = '"' mysql_real_escape_string($product) . '"'; 

如果不這樣做的話,有人也許會(huì)把下面的代碼段放到表單參數(shù)中:

 

  1. 39'; DROP pinfo; SELECT 'FOO 

那么 $sql 的結(jié)果就是:

 

  1. selectproductfrompinfowhereproduct = '39'; DROPpinfo; SELECT 'FOO' 

由于分號(hào)是 MySQL 的語句分隔符,數(shù)據(jù)庫會(huì)運(yùn)行下面三條語句:

 

  1. select * frompinfowhereproduct = '39'DROPpinfoSELECT 'FOO' 

好了,你丟失了你的表。

注意實(shí)際上 PHP 和 MySQL 不會(huì)運(yùn)行這種特殊語法,因?yàn)?mysql_query() 函數(shù)只允許每個(gè)請(qǐng)求處理一個(gè)語句。但是,一個(gè)子查詢?nèi)匀粫?huì)生效。

要防止 SQL 注入攻擊,做這兩件事:

總是驗(yàn)證所有參數(shù)。例如,如果需要一個(gè)數(shù)字,就要確保它是一個(gè)數(shù)字。 總是對(duì)數(shù)據(jù)使用 mysql_real_escape_string() 函數(shù)轉(zhuǎn)義數(shù)據(jù)中的任何引號(hào)和雙引號(hào)。注意:要自動(dòng)轉(zhuǎn)義任何表單數(shù)據(jù),可以啟用魔術(shù)引號(hào)(Magic Quotes)。

一些 MySQL 破壞可以通過限制 MySQL 用戶權(quán)限避免。任何 MySQL 賬戶可以限制為只允許對(duì)選定的表進(jìn)行特定類型的查詢。例如,你可以創(chuàng)建只能選擇行的 MySQL 用戶。但是,這對(duì)于動(dòng)態(tài)數(shù)據(jù)并不十分有用,另外,如果你有敏感的用戶信息,可能某些人能訪問其中一些數(shù)據(jù),但你并不希望如此。例如,一個(gè)訪問賬戶數(shù)據(jù)的用戶可能會(huì)嘗試注入訪問另一個(gè)人的賬戶號(hào)碼的代碼,而不是為當(dāng)前會(huì)話指定的號(hào)碼。

防止基本的 XSS 攻擊

XSS 表示跨站腳本。不像大部分攻擊,該漏洞發(fā)生在客戶端。XSS 最常見的基本形式是在用戶提交的內(nèi)容中放入 JavaScript 以便偷取用戶 cookie 中的數(shù)據(jù)。由于大部分站點(diǎn)使用 cookie 和 session 驗(yàn)證訪客,偷取的數(shù)據(jù)可用于模擬該用戶-如果是一個(gè)常見的用戶賬戶就會(huì)深受麻煩,如果是管理員賬戶甚至是徹底的慘敗。如果你不在站點(diǎn)中使用 cookie 和 session ID,你的用戶就不容易被攻擊,但你仍然應(yīng)該明白這種攻擊是如何工作的。

不像 MySQL 注入攻擊,XSS 攻擊很難預(yù)防。Yahoo、eBay、Apple、以及 Microsoft 都曾經(jīng)受 XSS 影響。盡管攻擊不包含 PHP,但你可以使用 PHP 來剝離用戶數(shù)據(jù)以防止攻擊。為了防止 XSS 攻擊,你應(yīng)該限制和過濾用戶提交給你站點(diǎn)的數(shù)據(jù)。正是因?yàn)檫@個(gè)原因,大部分在線公告板都不允許在提交的數(shù)據(jù)中使用 HTML 標(biāo)簽,而是用自定義的標(biāo)簽格式代替,例如 [b] 和 [linkto] 。

讓我們來看一個(gè)如何防止這類攻擊的簡(jiǎn)單腳本。對(duì)于更完善的解決辦法,可以使用 SafeHTML,本文的后面部分會(huì)討論到。

 

  1. function transform_HTML($string, $length = null) {// Helps prevent XSS attacks // Remove dead space. $string = trim($string); // Prevent potential Unicode codec problems. $string = utf8_decode($string); // HTMLize HTML-specific characters. $string = htmlentities($string, ENT_NOQUOTES); $string = str_replace("#", "#", $string); $string = str_replace("%", "%", $string); $length = intval($length); if ($length > 0) { $string = substr($string, 0, $length); } return $string;} 

這個(gè)函數(shù)將 HTML 特定的字符轉(zhuǎn)換為 HTML 字面字符。一個(gè)瀏覽器對(duì)任何通過這個(gè)腳本的 HTML 以非標(biāo)記的文本呈現(xiàn)。例如,考慮下面的 HTML 字符串:

BoldText

一般情況下,HTML 會(huì)顯示為: Bold Text

但是,通過 transform_HTML() 后,它就像原始輸入一樣呈現(xiàn)。原因是處理的字符串中的標(biāo)簽字符串轉(zhuǎn)換為 HTML 實(shí)體。 transform_HTML() 的結(jié)果字符串的純文本看起來像下面這樣:

BoldText

該函數(shù)的實(shí)質(zhì)是 htmlentities() 函數(shù)調(diào)用,它會(huì)將 <、>、和 & 轉(zhuǎn)換為 < 、 > 、和 & 。盡管這會(huì)處理大部分的普通攻擊,但有經(jīng)驗(yàn)的 XSS 攻擊者有另一種把戲:用十六進(jìn)制或 UTF-8 編碼惡意腳本,而不是采用普通的 ASCII 文本,從而希望能繞過你的過濾器。他們可以在 URL 的 GET 變量中發(fā)送代碼,告訴瀏覽器,“這是十六進(jìn)制代碼,你能幫我運(yùn)行嗎?” 一個(gè)十六進(jìn)制例子看起來像這樣:

{C}

瀏覽器渲染這個(gè)信息的時(shí)候,結(jié)果就是:

  1. <script>Dosomethingmalicious</script> 

 

為了防止這種情況,transform_HTML() 采用額外的步驟把 # 和 % 符號(hào)轉(zhuǎn)換為它們的實(shí)體,從而避免十六進(jìn)制攻擊,并轉(zhuǎn)換 UTF-8 編碼的數(shù)據(jù)。

最后,為了防止某些人用很長的輸入超載字符串從而導(dǎo)致某些東西崩潰,你可以添加一個(gè)可選的 $length 參數(shù)來截取你指定最大長度的字符串。

使用 SafeHTML

之前腳本的問題比較簡(jiǎn)單,它不允許任何類型的用戶標(biāo)記。不幸的是,這里有上百種方法能使 JavaScript 跳過用戶的過濾器,并且要從用戶輸入中剝離全部 HTML,還沒有方法可以防止這種情況。

當(dāng)前,沒有任何一個(gè)腳本能保證無法被破解,盡管有一些確實(shí)比大部分要好。有白名單和黑名單兩種方法加固安全,白名單比較簡(jiǎn)單而且更加有效。

一個(gè)白名單解決方案是 PixelApes 的 SafeHTML 反跨站腳本解析器。

SafeHTML 能識(shí)別有效 HTML,能追蹤并剝離任何危險(xiǎn)標(biāo)簽。它用另一個(gè)稱為 HTMLSax 的軟件包進(jìn)行解析。

按照下面步驟安裝和使用 SafeHTML:

到 http://pixel-apes.com/safehtml/?page=safehtml 下載最新版本的 SafeHTML。 把文件放到你服務(wù)器的類文件夾。該文件夾包括 SafeHTML 和 HTMLSax 功能所需的所有東西。 在腳本中 include SafeHTML 類文件(safehtml.php)。 創(chuàng)建一個(gè)名為 $safehtml 的新 SafeHTML 對(duì)象。 用 $safehtml->parse() 方法清理你的數(shù)據(jù)。

這是一個(gè)完整的例子:

 

  1. parse($data);// Display result.echo 'The sanitized data is 
  2.  
  3. ' . $safe_data;?> 

 

如果你想清理腳本中的任何其它數(shù)據(jù),你不需要?jiǎng)?chuàng)建一個(gè)新的對(duì)象;在你的整個(gè)腳本中只需要使用 $safehtml->parse() 方法。

什么可能會(huì)出現(xiàn)問題?

你可能犯的最大錯(cuò)誤是假設(shè)這個(gè)類能完全避免 XSS 攻擊。SafeHTML 是一個(gè)相當(dāng)復(fù)雜的腳本,幾乎能檢查所有事情,但沒有什么是能保證的。你仍然需要對(duì)你的站點(diǎn)做參數(shù)驗(yàn)證。例如,該類不能檢查給定變量的長度以確保能適應(yīng)數(shù)據(jù)庫的字段。它也不檢查緩沖溢出問題。

XSS 攻擊者很有創(chuàng)造力,他們使用各種各樣的方法來嘗試達(dá)到他們的目標(biāo)。可以閱讀 RSnake 的 XSS 教程 http://ha.ckers.org/xss.html ,看一下這里有多少種方法嘗試使代碼跳過過濾器。SafeHTML 項(xiàng)目有很好的程序員一直在嘗試阻止 XSS 攻擊,但無法保證某些人不會(huì)想起一些奇怪和新奇的方法來跳過過濾器。

注意:XSS 攻擊嚴(yán)重影響的一個(gè)例子 http://namb.la/popular/tech.html ,其中顯示了如何一步一步創(chuàng)建一個(gè)讓 MySpace 服務(wù)器過載的 JavaScript XSS 蠕蟲。用單向哈希保護(hù)數(shù)據(jù)

該腳本對(duì)輸入的數(shù)據(jù)進(jìn)行單向轉(zhuǎn)換,換句話說,它能對(duì)某人的密碼產(chǎn)生哈希簽名,但不能解碼獲得原始密碼。為什么你希望這樣呢?應(yīng)用程序會(huì)存儲(chǔ)密碼。一個(gè)管理員不需要知道用戶的密碼,事實(shí)上,只有用戶知道他/她自己的密碼是個(gè)好主意。系統(tǒng)(也僅有系統(tǒng))應(yīng)該能識(shí)別一個(gè)正確的密碼;這是 Unix 多年來的密碼安全模型。單向密碼安全按照下面的方式工作:

當(dāng)一個(gè)用戶或管理員創(chuàng)建或更改一個(gè)賬戶密碼時(shí),系統(tǒng)對(duì)密碼進(jìn)行哈希并保存結(jié)果。主機(jī)系統(tǒng)會(huì)丟棄明文密碼。 當(dāng)用戶通過任何方式登錄到系統(tǒng)時(shí),再次對(duì)輸入的密碼進(jìn)行哈希。 主機(jī)系統(tǒng)丟棄輸入的明文密碼。 當(dāng)前新哈希的密碼和之前保存的哈希相比較。 如果哈希的密碼相匹配,系統(tǒng)就會(huì)授予訪問權(quán)限。

主機(jī)系統(tǒng)完成這些并不需要知道原始密碼;事實(shí)上,原始密碼完全無所謂。一個(gè)副作用是,如果某人侵入系統(tǒng)并盜取了密碼數(shù)據(jù)庫,入侵者會(huì)獲得很多哈希后的密碼,但無法把它們反向轉(zhuǎn)換為原始密碼。當(dāng)然,給足夠時(shí)間、計(jì)算能力,以及弱用戶密碼,一個(gè)攻擊者還是有可能采用字典攻擊找出密碼。因此,別輕易讓人碰你的密碼數(shù)據(jù)庫,如果確實(shí)有人這樣做了,讓每個(gè)用戶更改他們的密碼。

加密 Vs 哈希

技術(shù)上來來說,哈希過程并不是加密。哈希和加密是不同的,這有兩個(gè)理由:

不像加密,哈希數(shù)據(jù)不能被解密。

是有可能(但非常罕見)兩個(gè)不同的字符串會(huì)產(chǎn)生相同的哈希。并不能保證哈希是唯一的,因此別像數(shù)據(jù)庫中的唯一鍵那樣使用哈希。

 

  1. function hash_ish($string) { return md5($string);} 

上面的 md5() 函數(shù)基于 RSA 數(shù)據(jù)安全公司的消息摘要算法(即 MD5)返回一個(gè)由 32 個(gè)字符組成的十六進(jìn)制串。然后你可以將那個(gè) 32 位字符串插入到數(shù)據(jù)庫中和另一個(gè) md5 字符串相比較,或者直接用這 32 個(gè)字符。

破解腳本

幾乎不可能解密 MD5 數(shù)據(jù)?;蛘哒f很難。但是,你仍然需要好的密碼,因?yàn)橛靡徽麄€(gè)字典生成哈希數(shù)據(jù)庫仍然很簡(jiǎn)單。有一些在線 MD5 字典,當(dāng)你輸入 06d80eb0c50b49a509b49f2424e8c805 后會(huì)得到結(jié)果 “dog”。因此,盡管技術(shù)上 MD5 不能被解密,這里仍然有漏洞,如果某人獲得了你的密碼數(shù)據(jù)庫,你可以肯定他們肯定會(huì)使用 MD5 字典破譯。因此,當(dāng)你創(chuàng)建基于密碼的系統(tǒng)的時(shí)候尤其要注意密碼長度(最小 6 個(gè)字符,8 個(gè)或許會(huì)更好)和包括字母和數(shù)字。并確保這個(gè)密碼不在字典中。

用 Mcrypt 加密數(shù)據(jù)

如果你不需要以可閱讀形式查看密碼,采用 MD5 就足夠了。不幸的是,這里并不總是有可選項(xiàng),如果你提供以加密形式存儲(chǔ)某人的信用卡信息,你可能需要在后面的某個(gè)地方進(jìn)行解密。

最早的一個(gè)解決方案是 Mcrypt 模塊,這是一個(gè)用于允許 PHP 高速加密的插件。Mcrypt 庫提供了超過 30 種用于加密的計(jì)算方法,并且提供口令確保只有你(或者你的用戶)可以解密數(shù)據(jù)。

讓我們來看看使用方法。下面的腳本包含了使用 Mcrypt 加密和解密數(shù)據(jù)的函數(shù):

mcrypt()函數(shù)需要幾個(gè)信息:

需要加密的數(shù)據(jù) 用于加密和解鎖數(shù)據(jù)的口令,也稱為鍵。 用于加密數(shù)據(jù)的計(jì)算方法,也就是用于加密數(shù)據(jù)的算法。該腳本使用了 MCRYPT_SERPENT_256 ,但你可以從很多算法中選擇,包括 MCRYPT_TWOFISH192 、MCRYPT_RC2 、 MCRYPT_DES 、和 MCRYPT_LOKI97 。 加密數(shù)據(jù)的模式。這里有幾個(gè)你可以使用的模式,包括電子密碼本(Electronic Codebook) 和加密反饋(Cipher Feedback)。該腳本使用 MCRYPT_MODE_CBC密碼塊鏈接。 一個(gè) 初始化向量 -也稱為 IV 或者種子,用于為加密算法設(shè)置種子的額外二進(jìn)制位。也就是使算法更難于破解的額外信息。 鍵和 IV 字符串的長度,這可能隨著加密和塊而不同。使用 mcrypt_get_key_size() 和 mcrypt_get_block_size() 函數(shù)獲取合適的長度;然后用 substr() 函數(shù)將鍵的值截取為合適的長度。(如果鍵的長度比要求的短,別擔(dān)心,Mcrypt 會(huì)用 0 填充。)

如果有人竊取了你的數(shù)據(jù)和短語,他們只能一個(gè)個(gè)嘗試加密算法直到找到正確的那一個(gè)。因此,在使用它之前我們通過對(duì)鍵使用 md5() 函數(shù)增加安全,就算他們獲取了數(shù)據(jù)和短語,入侵者也不能獲得想要的東西。

入侵者同時(shí)需要函數(shù),數(shù)據(jù)和口令,如果真是如此,他們可能獲得了對(duì)你服務(wù)器的完整訪問,你只能大清洗了。

這里還有一個(gè)數(shù)據(jù)存儲(chǔ)格式的小問題。Mcrypt 以難懂的二進(jìn)制形式返回加密后的數(shù)據(jù),這使得當(dāng)你將其存儲(chǔ)到 MySQL 字段的時(shí)候可能出現(xiàn)可怕錯(cuò)誤。因此,我們使用 base64encode() 和 base64decode() 函數(shù)轉(zhuǎn)換為和 SQL 兼容的字母格式和可檢索行。

破解腳本

除了實(shí)驗(yàn)多種加密方法,你還可以在腳本中添加一些便利。例如,不用每次都提供鍵和模式,而是在包含的文件中聲明為全局常量。

生成隨機(jī)密碼

隨機(jī)(但難以猜測(cè))字符串在用戶安全中很重要。例如,如果某人丟失了密碼并且你使用 MD5 哈希,你不可能,也不希望查找回來。而是應(yīng)該生成一個(gè)安全的隨機(jī)密碼并發(fā)送給用戶。為了訪問你站點(diǎn)的服務(wù),另外一個(gè)用于生成隨機(jī)數(shù)字的應(yīng)用程序會(huì)創(chuàng)建有效鏈接。下面是創(chuàng)建密碼的一個(gè)函數(shù):

  1. 0) && (! is_null($num_chars))) { $password = ''; $accepted_chars = 'abcdefghijklmnopqrstuvwxyz1234567890'; // Seed the generator if necessary. srand(((int)((double)microtime()*1000003)) ); for ($i=0; $i<=$num_chars; $i++) { $randrandom_number = rand(0, (strlen($accepted_chars) -1)); $password .= $accepted_chars[$random_number] ; } return $password; }}?> 

使用腳本

make_password()函數(shù)返回一個(gè)字符串,因此你需要做的就是提供字符串的長度作為參數(shù):

函數(shù)按照下面步驟工作:

函數(shù)確保 $num_chars 是非零的正整數(shù)。 函數(shù)初始化 $accepted_chars 變量為密碼可能包含的字符列表。該腳本使用所有小寫字母和數(shù)字 0 到 9,但你可以使用你喜歡的任何字符集合。(LCTT 譯注:有時(shí)候?yàn)榱吮阌谌庋圩R(shí)別,你可以將其中的 0 和 O,1 和 l 之類的都去掉。) 隨機(jī)數(shù)生成器需要一個(gè)種子,從而獲得一系列類隨機(jī)值(PHP 4.2 及之后版本中并不需要,會(huì)自動(dòng)播種)。 函數(shù)循環(huán) $num_chars 次,每次迭代生成密碼中的一個(gè)字符。 對(duì)于每個(gè)新字符,腳本查看 $accepted_chars 的長度,選擇 0 和長度之間的一個(gè)數(shù)字,然后添加 $accepted_chars 中該數(shù)字為索引值的字符到 $password。 循環(huán)結(jié)束后,函數(shù)返回 $password 。許可證

責(zé)任編輯:趙寧寧 來源: 紅黑聯(lián)盟
相關(guān)推薦

2011-03-17 13:32:45

2021-03-03 12:20:42

網(wǎng)絡(luò)安全DLL編程

2021-12-28 00:11:40

網(wǎng)絡(luò)安全攻擊

2021-12-21 06:07:10

網(wǎng)絡(luò)安全網(wǎng)絡(luò)攻擊網(wǎng)絡(luò)威脅

2021-01-26 13:45:03

網(wǎng)絡(luò)安全Winsock編程

2021-03-05 13:46:56

網(wǎng)絡(luò)安全遠(yuǎn)程線程

2021-04-30 18:50:44

網(wǎng)絡(luò)安全PE編程添加節(jié)區(qū)

2021-02-21 18:19:43

網(wǎng)絡(luò)安全網(wǎng)絡(luò)安全編程創(chuàng)建進(jìn)程

2022-01-05 00:05:07

安全設(shè)備網(wǎng)絡(luò)

2021-02-23 10:20:07

網(wǎng)絡(luò)安全進(jìn)程代碼

2021-04-26 10:32:38

網(wǎng)絡(luò)安全PE編程工具

2022-02-09 00:16:13

信息安全指南

2018-10-30 14:49:30

2011-07-06 14:28:32

2011-03-17 11:24:18

2015-09-07 09:18:43

企業(yè)安全安全維度網(wǎng)絡(luò)安全

2021-05-08 11:50:59

網(wǎng)絡(luò)安全API函數(shù)代碼

2021-03-31 11:35:00

網(wǎng)絡(luò)安全OllyDbg分析工具

2021-04-14 15:53:58

網(wǎng)絡(luò)安全C語言wcslen

2019-03-29 10:31:53

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)