欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

PHP數(shù)據(jù)單向加密,PHP加密函數(shù)

php excel加密的實(shí)現(xiàn)方法有什么

PHP中的加密方式有如下幾種

創(chuàng)新互聯(lián)建站-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價(jià)比寶應(yīng)網(wǎng)站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式寶應(yīng)網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋寶應(yīng)地區(qū)。費(fèi)用合理售后完善,10多年實(shí)體公司更值得信賴。

1. MD5加密

string md5 ( string $str [, bool $raw_output = false ] )

參數(shù)

str -- 原始字符串。

raw_output -- 如果可選的 raw_output 被設(shè)置為 TRUE,那么 MD5 報(bào)文摘要將以16字節(jié)長度的原始二進(jìn)制格式返回。

這是一種不可逆加密,執(zhí)行如下的代碼

$password = ‘123456‘;

echo md5($password);

得到結(jié)果是e10adc3949ba59abbe56e057f20f883e

2. Crype加密

string crypt ( string $str [, string $salt ] )

crypt() 返回一個(gè)基于標(biāo)準(zhǔn) UNIX DES 算法或系統(tǒng)上其他可用的替代算法的散列字符串。

參數(shù)

str -- 待散列的字符串。

salt -- 可選的鹽值字符串。如果沒有提供,算法行為將由不同的算法實(shí)現(xiàn)決定,并可能導(dǎo)致不可預(yù)料的結(jié)束。

這是也一種不可逆加密,執(zhí)行如下的代碼

代碼如下:

$password = ‘123456‘;

$salt = "test";// 只取前兩個(gè)

echo crypt($password, $salt);

得到的結(jié)果是teMGKvBPcptKo

使用自動(dòng)鹽值的例子如下:

代碼如下:

$password = crypt(‘mypassword‘); // 自動(dòng)生成鹽值

/* 你應(yīng)當(dāng)使用 crypt() 得到的完整結(jié)果作為鹽值進(jìn)行密碼校驗(yàn),以此來避免使用不同散列算法導(dǎo)致的問題。(如上所述,基于標(biāo)準(zhǔn) DES 算法的密碼散列使用 2 字符鹽值,但是基于 MD5 算法的散列使用 12 個(gè)字符鹽值。)*/

if (crypt(‘mypassword‘, $password) == $password) {

echo "Password verified!";

}

執(zhí)行結(jié)果是輸出 Password verified!

以不同散列類型使用 crypt()的例子如下:

代碼如下:

if (CRYPT_STD_DES == 1) {

echo ‘Standard DES: ‘ . crypt(‘rasmuslerdorf‘, ‘rl‘) . "\n";

}

if (CRYPT_EXT_DES == 1) {

echo ‘Extended DES: ‘ . crypt(‘rasmuslerdorf‘, ‘_J9..rasm‘) . "\n";

}

if (CRYPT_MD5 == 1) {

echo ‘MD5: ‘ . crypt(‘rasmuslerdorf‘, ‘$1$rasmusle$‘) . "\n";

}

if (CRYPT_BLOWFISH == 1) {

echo ‘Blowfish: ‘ . crypt(‘rasmuslerdorf‘, ‘$2a$07$usesomesillystringforsalt$‘) . "\n";

}

if (CRYPT_SHA256 == 1) {

echo ‘SHA-256: ‘ . crypt(‘rasmuslerdorf‘, ‘$5$rounds=5000$usesomesillystringforsalt$‘) . "\n";

}

if (CRYPT_SHA512 == 1) {

echo ‘SHA-512: ‘ . crypt(‘rasmuslerdorf‘, ‘$6$rounds=5000$usesomesillystringforsalt$‘) . "\n";

}

其結(jié)果如下

Standard DES: rl.3StKT.4T8M

Extended DES: _J9..rasmBYk8r9AiWNc

MD5: $1$rasmusle$rISCgZzpwk3UhDidwXvin0

Blowfish: $2a$07$usesomesillystringfore2uDLvp1Ii2e./U9C8sBjqp8I90dH6hi

SHA-256: $5$rounds=5000$usesomesillystri$KqJWpanXZHKq2BOB43TSaYhEWsQ1Lr5QNyPCDH/Tp.6

SHA-512: $6$rounds=5000$usesomesillystri$D4IrlXatmP7rx3P3InaxBeoomnAihCKRVQP22JZ6EY47Wc6BkroIuUUBOov1i.S5KPgErtP/EN5mcO.ChWQW21

在 crypt() 函數(shù)支持多重散列的系統(tǒng)上,下面的常量根據(jù)相應(yīng)的類型是否可用被設(shè)置為 0 或 1:

CRYPT_STD_DES - 基于標(biāo)準(zhǔn) DES 算法的散列使用 "./0-9A-Za-z" 字符中的兩個(gè)字符作為鹽值。在鹽值中使用非法的字符將導(dǎo)致 crypt() 失敗。

CRYPT_EXT_DES - 擴(kuò)展的基于 DES 算法的散列。其鹽值為 9 個(gè)字符的字符串,由 1 個(gè)下劃線后面跟著 4 字節(jié)循環(huán)次數(shù)和 4 字節(jié)鹽值組成。它們被編碼成可打印字符,每個(gè)字符 6 位,有效位最少的優(yōu)先。0 到 63 被編碼為 "./0-9A-Za-z"。在鹽值中使用非法的字符將導(dǎo)致 crypt() 失敗。

CRYPT_MD5 - MD5 散列使用一個(gè)以 $1$ 開始的 12 字符的字符串鹽值。

CRYPT_BLOWFISH - Blowfish 算法使用如下鹽值:“$2a$”,一個(gè)兩位 cost 參數(shù),“$” 以及 64 位由 “./0-9A-Za-z” 中的字符組合而成的字符串。在鹽值中使用此范圍之外的字符將導(dǎo)致 crypt() 返回一個(gè)空字符串。兩位 cost 參數(shù)是循環(huán)次數(shù)以 2 為底的對數(shù),它的范圍是 04-31,超出這個(gè)范圍將導(dǎo)致 crypt() 失敗。

CRYPT_SHA256 - SHA-256 算法使用一個(gè)以 $5$ 開頭的 16 字符字符串鹽值進(jìn)行散列。如果鹽值字符串以 “rounds=$” 開頭,N 的數(shù)字值將被用來指定散列循環(huán)的執(zhí)行次數(shù),這點(diǎn)很像 Blowfish 算法的 cost 參數(shù)。默認(rèn)的循環(huán)次數(shù)是 5000,最小是 1000,最大是 999,999,999。超出這個(gè)范圍的 N 將會(huì)被轉(zhuǎn)換為最接近的值。

CRYPT_SHA512 - SHA-512 算法使用一個(gè)以 $6$ 開頭的 16 字符字符串鹽值進(jìn)行散列。如果鹽值字符串以 “rounds=$” 開頭,N 的數(shù)字值將被用來指定散列循環(huán)的執(zhí)行次數(shù),這點(diǎn)很像 Blowfish 算法的 cost 參數(shù)。默認(rèn)的循環(huán)次數(shù)是 5000,最小是 1000,最大是 999,999,999。超出這個(gè)范圍的 N 將會(huì)被轉(zhuǎn)換為最接近的值。

3. Sha1加密

string sha1 ( string $str [, bool $raw_output = false ] )

參數(shù)

str -- 輸入字符串。

raw_output -- 如果可選的 raw_output 參數(shù)被設(shè)置為 TRUE,那么 sha1 摘要將以 20 字符長度的原始格式返回,否則返回值是一個(gè) 40 字符長度的十六進(jìn)制數(shù)字。

這是也一種不可逆加密,執(zhí)行如下代碼:

$password = ‘123456‘;

echo sha1($password);

得到的結(jié)果是7c4a8d09ca3762af61e59520943dc26494f8941b

以上幾種雖然是不可逆加密,但是也可以根據(jù)查字典的方式去解密。如下的地址中就提供了可以將上面的加密結(jié)果解密出來的功能。

那大家是不是加了就算加了密,也沒用啊,其實(shí)不然,只要你的加密足夠復(fù)雜,被破解出的可能性就越小,比如用以上三種加密方式混合加密,之后我會(huì)推薦給大家一個(gè)php的加密庫。

4. URL加密

string urlencode ( string $str )

此函數(shù)便于將字符串編碼并將其用于 URL 的請求部分,同時(shí)它還便于將變量傳遞給下一頁。

返回字符串,此字符串中除了 -_. 之外的所有非字母數(shù)字字符都將被替換成百分號(%)后跟兩位十六進(jìn)制數(shù),空格則編碼為加號(+)。此編碼與 WWW 表單 POST 數(shù)據(jù)的編碼方式是一樣的,同時(shí)與 application/x-www-form-urlencoded 的媒體類型編碼方式一樣。由于歷史原因,此編碼在將空格編碼為加號(+)方面與 RFC1738 編碼不同。

string urldecode ( string $str )

解碼給出的已編碼字符串中的任何 %##。 加號(‘+‘)被解碼成一個(gè)空格字符。

這是一種可逆加密,urlencode方法用于加密,urldecode方法用于解密,執(zhí)行如下代碼:

$url = ‘‘;

$encodeUrl = urlencode($url);

echo $encodeUrl . "\n";// 如果是在網(wǎng)頁上展示的,就將\n修改為

echo urldecode($encodeUrl);

得到的結(jié)果如下

http%3A%2F%2F

基于RFC 3986的加密URL的方法如下:

代碼如下:

function myUrlEncode($string) {

$entities = array(‘%21‘, ‘%2A‘, ‘%27‘, ‘%28‘, ‘%29‘, ‘%3B‘, ‘%3A‘, ‘%40‘, ‘%26‘, ‘%3D‘, ‘%2B‘, ‘%24‘, ‘%2C‘, ‘%2F‘, ‘%3F‘, ‘%25‘, ‘%23‘, ‘%5B‘, ‘%5D‘);

$replacements = array(‘!‘, ‘*‘, "‘", "(", ")", ";", ":", "@", "", "=", "+", "$", ",", "/", "?", "%", "#", "[", "]");

return str_replace($entities, $replacements, urlencode($string));

}

5. Base64信息編碼加密

string base64_encode ( string $data )

使用 base64 對 data 進(jìn)行編碼。

設(shè)計(jì)此種編碼是為了使二進(jìn)制數(shù)據(jù)可以通過非純 8-bit 的傳輸層傳輸,例如電子郵件的主體。

Base64-encoded 數(shù)據(jù)要比原始數(shù)據(jù)多占用 33% 左右的空間。

string base64_decode ( string $data [, bool $strict = false ] )

對 base64 編碼的 data 進(jìn)行解碼。

參數(shù)

data -- 編碼過的數(shù)據(jù)。

strict -- 如果輸入的數(shù)據(jù)超出了 base64 字母表,則返回 FALSE。

執(zhí)行如下代碼:

代碼如下:

$name = ‘CraryPrimitiveMan‘;

$encodeName = base64_encode($name);

echo $encodeName . "\n";

echo base64_decode($encodeName);

其結(jié)果如下

代碼如下:

Q3JhcnlQcmltaXRpdmVNYW4=

CraryPrimitiveMan

推薦phpass

經(jīng) phpass 0.3 測試,在存入數(shù)據(jù)庫之前進(jìn)行哈希保護(hù)用戶密碼的標(biāo)準(zhǔn)方式。 許多常用的哈希算法如 md5,甚至是 sha1 對于密碼存儲(chǔ)都是不安全的, 因?yàn)轳斂湍軌蚴褂媚切┧惴ㄝp而易舉地破解密碼。

對密碼進(jìn)行哈希最安全的方法是使用 bcrypt 算法。開源的 phpass 庫以一個(gè)易于使用的類來提供該功能。

代碼如下:

?php

// Include phpass 庫

require_once(‘phpass-03/PasswordHash.php‘)

// 初始化散列器為不可移植(這樣更安全)

$hasher = new PasswordHash(8, false);

// 計(jì)算密碼的哈希值。$hashedPassword 是一個(gè)長度為 60 個(gè)字符的字符串.

$hashedPassword = $hasher-HashPassword(‘my super cool password‘);

// 你現(xiàn)在可以安全地將 $hashedPassword 保存到數(shù)據(jù)庫中!

// 通過比較用戶輸入內(nèi)容(產(chǎn)生的哈希值)和我們之前計(jì)算出的哈希值,來判斷用戶是否輸入了正確的密碼

$hasher-CheckPassword(‘the wrong password‘, $hashedPassword); // false

$hasher-CheckPassword(‘my super cool password‘, $hashedPassword); // true

?

php源碼怎么加密

一、無需任何PHP擴(kuò)展的加密

此類加密的代表有 威盾PHP加密專家、PHP在線加密平臺(tái)、PHP神盾 等。

此類加密都是以eval函數(shù)為核心,輔以各式各樣的字符串混淆和各種小技巧,來達(dá)到加密目的(更準(zhǔn)確的說,應(yīng)該算是混淆)。下面以一個(gè)簡單的hello world為例來說明此類加密的大體過程。

?php

echo "hello world";

首先 ,我們把這段代碼變?yōu)橥ㄟ^eval執(zhí)行的

?php

eval('echo "hello world";');

然后 ,我們再進(jìn)行一些轉(zhuǎn)換,比如說base64編碼

?php

eval(base64_decode('ZWNobyAiaGVsbG8gd29ybGQiOw=='));

就這樣子,我們的第一個(gè)加密過的php代碼新鮮出爐了。。。

上面這個(gè)例子非常非常簡單,基本上任何有一點(diǎn)php語言基礎(chǔ)甚至別的語言基礎(chǔ)的人都能輕松的看懂并解密。因此,我們需要一些方法讓這個(gè)加密至少看上去不是那么簡單。

二、同時(shí)采用多種編碼函數(shù)

除了剛才提到的base64,php還有許多內(nèi)置的編碼函數(shù),例如urlencode、gzcompress等。把這些函數(shù)混合使用可以提高解密的復(fù)雜度(不是難度),此外還可以使用strtr來制定自己的編碼規(guī)則。 使用變量來代替函數(shù)名 使用特定字符來命名變量

這兒所說的特定字符是一些極其相似的字符,如I和1,0和O。試想一下滿屏都是O和0組成的變量,并且每一個(gè)的名字長度都在10個(gè)字符以上。。。 判斷文件自身是否被修改

這個(gè)功能看似容易,對文件做一下摘要再進(jìn)行下對比即可知道是否被修改了,但是如何才能在文件內(nèi)把摘要嵌入進(jìn)去呢?我沒有找到完美的方案,但一個(gè)變通的方案還是很容易的。。。

?php

$code = substr(file_get_contents(__FILE__), 0, -32);

$hash = substr(file_get_contents(__FILE__), -32);

if (md5($code) !== $hash) {

exit('file edited');

}

ACBC41F727E00F85BEB3440D751BB4E3

當(dāng)然,你可以把這個(gè)校驗(yàn)字符串放在別的位置來提高破解的難度。有了這個(gè),別人想破解你的程序可就得多費(fèi)一點(diǎn)功夫了。。。

既然知道了原理,那解密自然也就非常簡單了,總體來說就三步:

把eval替換為輸出,比如echo 根據(jù)編碼規(guī)則把字符串還原 如果文件未解密完全,從第一步開始繼續(xù)

當(dāng)然,實(shí)際上的解密過程并沒有這么簡單,比如說如果加密的時(shí)候使用了gzcompress,那得到的數(shù)據(jù)將會(huì)包含一些二進(jìn)制數(shù)據(jù),而采用一般的文本編輯器打開時(shí)這些數(shù)據(jù)都會(huì)顯示為亂碼,并且在保存時(shí)丟失部分?jǐn)?shù)據(jù)。解決方法很簡單也很麻煩,那就是使用二進(jìn)制(16進(jìn)制)方式打開、修改和保存。

PHP如何取得數(shù)組的上標(biāo)和下標(biāo)

獲取下標(biāo):$array=array('a'=1,'b'=3,'c'=4);$a=array_keys($array);echo end($a)。

PHP的加密函數(shù)有crypt()、 md5() 和sha1() 這3種, 其中crypt() 用于單向加密, 所謂的單向加密就是將需要加密的內(nèi)容進(jìn)行加密之后, 無法將密文轉(zhuǎn)換成為可讀的內(nèi)容。

因此單向加密的應(yīng)用范圍較狹窄, 一般用于用戶名認(rèn)證和密碼輸入等情況; 當(dāng)用戶進(jìn)入系統(tǒng)時(shí),只需要將密文口令輸 入,經(jīng)過系統(tǒng)驗(yàn)證與存儲(chǔ)的口令一致, 即可通過。

擴(kuò)展資料:

主要特點(diǎn):

(一)開源性和免費(fèi)性

由于PHP的解釋器的源代碼是公開的,所以安全系數(shù)較高的網(wǎng)站可以自己更改PHP的解釋程序。另外,PHP 運(yùn)行環(huán)境的使用也是免費(fèi)的。

(二)快捷性

PHP是一種非常容易學(xué)習(xí)和使用的一門語言,它的語法特點(diǎn)類似于C語言,但又沒有C語言復(fù)雜的地址操作,而且又加入了面向?qū)ο蟮母拍睿偌由纤哂泻啙嵉恼Z法規(guī)則,使得它操作編輯非常簡單,實(shí)用性很強(qiáng)。

(三)數(shù)據(jù)庫連接的廣泛性

PHP可以與很多主流的數(shù)據(jù)庫建立起連接,如MySQL、ODBC、Oracle等,PHP是利用編譯的不同函數(shù)與這些數(shù)據(jù)庫建立起連接的,PHPLIB就是常用的為一般事務(wù)提供的基庫。

參考資料來源:百度百科-PHP

PHP如何做好最基礎(chǔ)的安全防范

PHP如何做好最基礎(chǔ)的安全防范

php給了開發(fā)者極大的靈活性,但是這也為安全問題帶來了潛在的隱患,PHP如何做好最基礎(chǔ)的安全防范呢?下面我為大家解答一下,希望能幫到您!

當(dāng)開發(fā)一個(gè)互聯(lián)網(wǎng)服務(wù)的時(shí)候,必須時(shí)刻牢記安全觀念,并在開發(fā)的代碼中體現(xiàn)。PHP腳本語言對安全問題并不關(guān)心,特別是對大多數(shù)沒有經(jīng)驗(yàn)的開發(fā)者來說。每當(dāng)你講任何涉及到錢財(cái)事務(wù)等交易問題時(shí),需要特別注意安全問題的考慮,例如開發(fā)一個(gè)論壇或者是一個(gè)購物車等。

   安全保護(hù)一般性要點(diǎn)

不相信表單

對于一般的Javascript前臺(tái)驗(yàn)證,由于無法得知用戶的行為,例如關(guān)閉了瀏覽器的javascript引擎,這樣通過POST惡意數(shù)據(jù)到服務(wù)器。需要在服務(wù)器端進(jìn)行驗(yàn)證,對每個(gè)php腳本驗(yàn)證傳遞到的數(shù)據(jù),防止XSS攻擊和SQL注入。

不相信用戶

要假設(shè)你的網(wǎng)站接收的每一條數(shù)據(jù)都是存在惡意代碼的,存在隱藏的威脅,要對每一條數(shù)據(jù)都進(jìn)行清理

   關(guān)閉全局變量

在php.ini文件中進(jìn)行以下配置:

register_globals = Off

如果這個(gè)配置選項(xiàng)打開之后,會(huì)出現(xiàn)很大的安全隱患。例如有一個(gè)process.php的腳本文件,會(huì)將接收到的數(shù)據(jù)插入到數(shù)據(jù)庫,接收用戶輸入數(shù)據(jù)的表單可能如下:

input name="username" type ="text" size = "15" maxlength = "64"

這樣,當(dāng)提交數(shù)據(jù)到process.php之后,php會(huì)注冊一個(gè)$username變量,將這個(gè)變量數(shù)據(jù)提交到process.php,同時(shí)對于任何POST或GET請求參數(shù),都會(huì)設(shè)置這樣的變量。如果不是顯示進(jìn)行初始化那么就會(huì)出現(xiàn)下面的問題:

?php

// Define $authorized = true only if user is authenticated

if

(authenticated_user()) {

$authorized = true;

}

?

此處,假設(shè)authenticated_user函數(shù)就是判斷$authorized變量的值,如果開啟了register_globals配置,那么任何用戶都可以發(fā)送一個(gè)請求,來設(shè)置$authorized變量的值為任意值從而就能繞過這個(gè)驗(yàn)證。所有的這些提交數(shù)據(jù)都應(yīng)該通過PHP預(yù)定義內(nèi)置的全局?jǐn)?shù)組來獲取,包括$_POST、$_GET、$_FILES、$_SERVER、$_REQUEST等,其中$_REQUEST是一個(gè)$_GET/$_POST/$_COOKIE三個(gè)數(shù)組的聯(lián)合變量,默認(rèn)的順序是$_COOKIE、$_POST、$_GET。

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

error_reporting設(shè)置為Off:不要暴露錯(cuò)誤信息給用戶,開發(fā)的時(shí)候可以設(shè)置為ON

safe_mode設(shè)置為Off

register_globals設(shè)置為Off

將以下函數(shù)禁用:system、exec、passthru、shell_exec、proc_open、popen

open_basedir設(shè)置為 /tmp ,這樣可以讓session信息有存儲(chǔ)權(quán)限,同時(shí)設(shè)置單獨(dú)的網(wǎng)站根目錄expose_php設(shè)置為Offallow_url_fopen設(shè)置為Offallow_url_include設(shè)置為Off

SQL注入攻擊

對于操作數(shù)據(jù)庫的SQL語句,需要特別注意安全性,因?yàn)橛脩艨赡茌斎胩囟ㄕZ句使得原有的SQL語句改變了功能。類似下面的例子:

$sql ="select * from pinfo where product = '$product'";

此時(shí)如果用戶輸入的$product參數(shù)為:'39'; DROP pinfo; SELECT 'FOO

那么最終SQL語句就變成了如下的`樣子:

select product from pinfo where product = '39';

DROP pinfo;

SELECT 'FOO'

這樣就會(huì)變成三條SQL語句,會(huì)造成pinfo表被刪除,這樣會(huì)造成嚴(yán)重的后果。這個(gè)問題可以簡單的使用PHP的內(nèi)置函數(shù)解決:

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

防止SQL注入攻擊需要做好兩件事:對輸入的參數(shù)總是進(jìn)行類型驗(yàn)證對單引號、雙引號、反引號等特殊字符總是使用mysql_real_escape_string函數(shù)進(jìn)行轉(zhuǎn)義但是,這里根據(jù)開發(fā)經(jīng)驗(yàn),不要開啟php的Magic Quotes,這個(gè)特性在php6中已經(jīng)廢除,總是自己在需要的時(shí)候進(jìn)行轉(zhuǎn)義。

防止基本的XSS攻擊

XSS攻擊不像其他攻擊,這種攻擊在客戶端進(jìn)行,最基本的XSS工具就是防止一段javascript腳本在用戶待提交的表單頁面,將用戶提交的數(shù)據(jù)和cookie偷取過來。XSS工具比SQL注入更加難以防護(hù),各大公司網(wǎng)站都被XSS攻擊過,雖然這種攻擊與php語言無關(guān),但可以使用php來篩選用戶數(shù)據(jù)達(dá)到保護(hù)用戶數(shù)據(jù)的目的,這里主要使用的是對用戶的數(shù)據(jù)進(jìn)行過濾,一般過濾掉HTML標(biāo)簽,特別是a標(biāo)簽。下面是一個(gè)普通的過濾方法:

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實(shí)體,瀏覽器在渲染這段文本的時(shí)候以純文本形式顯示。如bold會(huì)被顯示為: BoldText 上述函數(shù)的核心就是htmlentities函數(shù),這個(gè)函數(shù)將html特殊標(biāo)簽轉(zhuǎn)換為html實(shí)體字符,這樣可以過濾大部分的XSS攻擊。但是對于有經(jīng)驗(yàn)的XSS攻擊者,有更加巧妙的辦法進(jìn)行攻擊:將他們的惡意代碼使用十六進(jìn)制或者utf-8編碼,而不是普通的ASCII文本,例如可以使用下面的方式進(jìn)行:

   這樣瀏覽器渲染的結(jié)果其實(shí)是:

a href = ""

SCRIPT Dosomethingmalicious

這樣就達(dá)到了攻擊的目的。為了防止這種情況,需要在transform_HTML函數(shù)的基礎(chǔ)上再將#和%轉(zhuǎn)換為他們對應(yīng)的實(shí)體符號,同時(shí)加上了$length參數(shù)來限制提交的數(shù)據(jù)的最大長度。

   使用SafeHTML防止XSS攻擊

上述關(guān)于XSS攻擊的防護(hù)非常簡單,但是不包含用戶的所有標(biāo)記,同時(shí)有上百種繞過過濾函數(shù)提交javascript代碼的方法,也沒有辦法能完全阻止這個(gè)情況。目前,沒有一個(gè)單一的腳本能保證不被攻擊突破,但是總有相對來說防護(hù)程度更好的。一共有兩個(gè)安全防護(hù)的方式:白名單和黑名單。其中白名單更加簡單和有效。一種白名單解決方案就是SafeHTML,它足夠智能能夠識別有效的HTML,然后就可以去除任何危險(xiǎn)的標(biāo)簽。這個(gè)需要基于HTMLSax包來進(jìn)行解析。安裝使用SafeHTML的方法:

1、前往 下載最新的SafeHTML

2、將文件放入服務(wù)器的classes 目錄,這個(gè)目錄包含所有的SafeHTML和HTMLSax庫

3、在自己的腳本中包含SafeHTML類文件

4、建立一個(gè)SafeHTML對象

5、使用parse方法進(jìn)行過濾

?php/* If you're storing the HTMLSax3.php in the /classes directory, along

with the safehtml.php script, define XML_HTMLSAX3 as a null string. */define(XML_HTMLSAX3, '' );// Include the class file.require_once ( 'classes/safehtml.php' );

// Define some sample bad code.

$data = This data would raise an alert

" ;// Create a safehtml object.$safehtml = new safehtml();// Parse and sanitize the data.$safe_data = $safehtml -parse( $data );// Display result. echo 'The sanitized data is ' . $safe_data ;

?

SafeHTML并不能完全防止XSS攻擊,只是一個(gè)相對復(fù)雜的腳本來檢驗(yàn)的方式。

使用單向HASH加密方式來保護(hù)數(shù)據(jù)

單向hash加密保證對每個(gè)用戶的密碼都是唯一的,而且不能被破譯的,只有最終用戶知道密碼,系統(tǒng)也是不知道原始密碼的。這樣的一個(gè)好處是在系統(tǒng)被攻擊后攻擊者也無法知道原始密碼數(shù)據(jù)。加密和Hash是不同的兩個(gè)過程。與加密不同,Hash是無法被解密的,是單向的;同時(shí)兩個(gè)不同的字符串可能會(huì)得到同一個(gè)hash值,并不能保證hash值的唯一性。MD5函數(shù)處理過的hash值基本不能被破解,但是總是有可能性的,而且網(wǎng)上也有MD5的hash字典。

使用mcrypt加密數(shù)據(jù)MD5 hash函數(shù)可以在可讀的表單中顯示數(shù)據(jù),但是對于存儲(chǔ)用戶的信用卡信息的時(shí)候,需要進(jìn)行加密處理后存儲(chǔ),并且需要之后進(jìn)行解密。最好的方法是使用mcrypt模塊,這個(gè)模塊包含了超過30中加密方式來保證只有加密者才能解密數(shù)據(jù)。

?php$data = "Stuff you want encrypted" ;

$key = "Secret passphrase used to encrypt your data" ;

$cipher = "MCRYPT_SERPENT_256" $mode = "MCRYPT_MODE_CBC" ;function encrypt( $data, $key , cipher , $mode ) {// Encrypt datareturn (string) base64_encode ( mcrypt_encrypt ( $cipher , substr (md5( $key ),0,mcrypt_get_key_size( $cipher , $mode )), $data , $mode , substr (md5( $key ),0,mcrypt_get_block_size( $cipher , $mode )) ) );

}function decrypt( $data , $key ,$cipher , $mode ) {// Decrypt data

return (string) mcrypt_decrypt ( $cipher , substr (md5( $key ),0,mcrypt_get_key_size( $cipher , $mode )), base64_decode ( $data ), $mode , substr (md5( $key ),0,mcrypt_get_block_size( $cipher , $mode )) );

}?

mcrypt函數(shù)需要以下信息:

1、待加密數(shù)據(jù)

2、用來加密和解密數(shù)據(jù)的key

3、用戶選擇的加密數(shù)據(jù)的特定算法(cipher:

如 MCRYPT_TWOFISH192

,MCRYPT_SERPENT_256, MCRYPT_RC2

, MCRYPT_DES

, and MCRYPT_LOKI97

4、用來加密的模式

5、加密的種子,用來起始加密過程的數(shù)據(jù),是一個(gè)額外的二進(jìn)制數(shù)據(jù)用來初始化加密算法

6、加密key和種子的長度,使用mcrypt_get_key_size函數(shù)和mcrypt_get_block_size函數(shù)可以獲取如果數(shù)據(jù)和key都被盜取,那么攻擊者可以遍歷ciphers尋找開行的方式即可,因此我們需要將加密的key進(jìn)行MD5一次后保證安全性。同時(shí)由于mcrypt函數(shù)返回的加密數(shù)據(jù)是一個(gè)二進(jìn)制數(shù)據(jù),這樣保存到數(shù)據(jù)庫字段中會(huì)引起其他錯(cuò)誤,使用了base64encode將這些數(shù)據(jù)轉(zhuǎn)換為了十六進(jìn)制數(shù)方便保存。

;

PHP常用加密解密方法

作者/上善若水

1.md5(string $str,bool $flag = false);

$flag = false 默認(rèn)返回32位的16進(jìn)至數(shù)據(jù)散列值

$flag = true ?返回原始流數(shù)據(jù)

2.sha1($string,$flag = false)

$flag = false 默認(rèn)返回40位的16進(jìn)至數(shù)據(jù)散列值

true ?返回原始流數(shù)據(jù)

3.hash(string $algo,srting $str,bool $flag);

$algo : 算法名稱,可通過hash_algos()函數(shù)獲取所有hash加密的算法

如:md5,sha1等,采用md5,sha1加密所得結(jié)果和1,2兩種方式結(jié) 果相同。

$flag = false 默認(rèn)返回16進(jìn)至的數(shù)據(jù)散列值,具體長度根據(jù)算法不同

而不同。

true ?返回原始流數(shù)據(jù)。

4.crypt(string $str,$string $salt);

函數(shù)返回使用 DES、Blowfish 或 MD5 算法加密的字符串。

具體算法依賴于PHP檢查之后支持的算法和$salt的格式和長度,當(dāng) 然具體結(jié)果也和操作系統(tǒng)有關(guān)。比較結(jié)果采用 hash_equals($crypted,crypt($input,$salt));//且salt值相同

Password_verify($str,$crypted);

5.password_hash ( string $str, integer $algo [, array $options ] )

函數(shù)返回哈希加密后的密碼字符串, password_hash() 是crypt()的 一個(gè)簡單封裝

$algo : 算法 PASSWORD_DEFAULT ,PASSWORD_BCRYPT

$options = [

“cost”=10,//指明算法遞歸的層數(shù),

“salt”=“xxadasdsad”//加密鹽值,即將被遺 棄,采用系統(tǒng)自動(dòng)隨機(jī)生成安全性更高

];

使用的算法、cost 和鹽值作為哈希的一部分返回

Password_verify($str,$hashed);

6.base64_encode(string $str)

設(shè)計(jì)此種編碼是為了使二進(jìn)制數(shù)據(jù)可以通過非純 8-bit 的傳輸層 傳輸,例如電子郵件的主體。base64_decode(string $encoded)

可以進(jìn)行解碼;

7.mcrypt_encrypt ( string $cipher , string $key , string $data ,

string $mode [, string $iv ] )

mcrypt_decrypt ( string $cipher , string $key , string $crypted ,

string $mode [, string $iv ] )

$ciper:加密算法,mcrypt_list_algorithms()可以獲取該函數(shù)所有支持的算法

如MCRYPT_DES(“des”),MCRYPT_RIJNDAEL_128(“rijndael-128”);

$mode : 加密模式 ,mcrypt_list_modes()獲取所有支持的加密模式,ecb,cbc

$key: 加密的秘鑰,mcrypt_get_key_size ( string $cipher , string $mode )

獲取指定的算法和模式所需的密鑰長度。$key要滿足這個(gè)長度,如果長 度無效會(huì)報(bào)出警告。

$iv : 加密的初始向量,可通過mcrypt_create_iv ( int $size [, int $source = MCRYPT_DEV_URANDOM ] ),

Iv的參數(shù)size:

通過mcrypt_get_iv_size ( string $cipher , string $mode )獲取

Iv 的參數(shù)source:

初始向量數(shù)據(jù)來源。可選值有: MCRYPT_RAND (系統(tǒng)隨機(jī)數(shù)生成 器), MCRYPT_DEV_RANDOM (從 /dev/random 文件讀取數(shù)據(jù)) 和 ?MCRYPT_DEV_URANDOM (從 /dev/urandom 文件讀取數(shù)據(jù))。 在 Windows 平臺(tái),PHP 5.3.0 之前的版本中,僅支持 MCRYPT_RAND。

請注意,在 PHP 5.6.0 之前的版本中, 此參數(shù)的默認(rèn)值 為 MCRYPT_DEV_RANDOM。

Note: 需要注意的是,如果沒有更多可用的用來產(chǎn)生隨機(jī)數(shù)據(jù)的信息, 那么 MCRYPT_DEV_RANDOM 可能進(jìn)入阻塞狀態(tài)。

$data : 要加密的字符串?dāng)?shù)據(jù)

網(wǎng)頁標(biāo)題:PHP數(shù)據(jù)單向加密,PHP加密函數(shù)
轉(zhuǎn)載源于:http://chinadenli.net/article36/hsgcpg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站制作動(dòng)態(tài)網(wǎng)站網(wǎng)站設(shè)計(jì)公司網(wǎng)站內(nèi)鏈商城網(wǎng)站移動(dòng)網(wǎng)站建設(shè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都網(wǎng)頁設(shè)計(jì)公司