偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

如何書(shū)寫(xiě)安全的PHP代碼

安全 黑客攻防 后端
現(xiàn)在很多較新的Web開(kāi)發(fā)程序員, 甚至在沒(méi)有任何編程背景下學(xué)習(xí)PHP作為一種去增加一些互動(dòng)元素到他們的網(wǎng)站的人,并沒(méi)有覺(jué)察他們網(wǎng)站中潛在的安全風(fēng)險(xiǎn)。那我們?nèi)绾蝸?lái)避免這些風(fēng)險(xiǎn)呢?

PHP是一個(gè)很容易學(xué)習(xí)的語(yǔ)言, 許多人在沒(méi)有任何編程背景下學(xué)習(xí)它作為一種去增加一些互動(dòng)元素到他們的網(wǎng)站的方法. 不幸的是,這往往意味著PHP程序員,尤其是那些較新的Web開(kāi)發(fā)程序員, 并沒(méi)有覺(jué)察他們網(wǎng)站中潛在安全風(fēng)險(xiǎn). 這里是一些比較常見(jiàn)的安全問(wèn)題,以及如何去避免它們。

永遠(yuǎn),永遠(yuǎn)信任你的用戶(hù)

不能說(shuō)足夠的次數(shù),你應(yīng)該永遠(yuǎn),永遠(yuǎn), 信任你的用戶(hù)向你發(fā)送你期望的數(shù)據(jù). 我聽(tīng)到很多人回應(yīng),大概是"哦,沒(méi)有惡意的人將對(duì)我的網(wǎng)站感興趣"。這就錯(cuò)了, 這里總是有懷有惡意的用戶(hù)可以利用一個(gè)安全漏洞,問(wèn)題可以很容易被發(fā)現(xiàn),因?yàn)橐粋€(gè)用戶(hù)無(wú)意中做錯(cuò)了。

因此, 所有網(wǎng)頁(yè)的發(fā)展的戒律,我不能再壓縮了的話(huà)就是:永遠(yuǎn),永遠(yuǎn),相信你的用戶(hù)。假定你的網(wǎng)站從使用者收集的每片數(shù)據(jù)含有惡意代碼,始終, 你認(rèn)為已經(jīng)檢查客戶(hù)端驗(yàn)證的這些數(shù)據(jù),例如在JavaScript ,如果你能夠達(dá)到這個(gè)目標(biāo),你應(yīng)該有了一個(gè)良好的開(kāi)端。如果PHP的安全性很重要,這一點(diǎn)就要重要地學(xué)習(xí),個(gè)人來(lái)說(shuō),"PHP安全"是一個(gè)重大的問(wèn)題。

全局變量

在許多語(yǔ)言,你必須明確地設(shè)定一個(gè)變量以使用它。 在PHP中,有一個(gè)選項(xiàng)" , register_globals" , 你可以在php.ini中設(shè)置,讓你可以使用全局變量,而不需要事先聲明。

考慮下面的代碼:

if ($password == "my_password") {
$authorized = 1;
}

if ($authorized == 1) {
echo "Lots of important stuff.";
}

許多人看上去覺(jué)得沒(méi)什么問(wèn)題,而事實(shí)上,這方面的代碼在整個(gè)網(wǎng)站上應(yīng)用. 但是,如果一個(gè)服務(wù)器開(kāi)啟"register_globals"。然后,只需添加"?authorized=1"的URL將讓任何人都看到. 這是一個(gè)最普遍的PHP的安全問(wèn)題。

所幸的是,這有兩個(gè)簡(jiǎn)單的解決辦法. 第一,也許最好的,就是把"register_globals"關(guān)閉. 二是你必須明確只有你使用變量. 在上面的例子中,這將意味著加入"?authorized=0"; 在腳本的開(kāi)始:

$authorized = 0;
if ($password == "my_password") {
$authorized = 1;
}
if ($authorized == 1) {
echo "Lots of important stuff.";
}

錯(cuò)誤信息

錯(cuò)誤信息是一個(gè)非常有用的工具,無(wú)論是程序員和黑客. 開(kāi)發(fā)者需要它們?nèi)ジ恼e(cuò)誤. 黑客可以利用它們來(lái)找出一個(gè)網(wǎng)站的各種信息, 從目錄結(jié)構(gòu)的服務(wù)器,數(shù)據(jù)庫(kù)登錄信息. 如果可能的話(huà),最好是關(guān)閉所有的錯(cuò)誤報(bào)告. PHP可以完成這項(xiàng)工作. htaccess或php.ini,設(shè)置"error_reporting" 的值改為"0" . 如果你有一個(gè)開(kāi)發(fā)環(huán)境,您可以設(shè)定不同的錯(cuò)誤報(bào)告級(jí)別。

#p#

SQL注入

PHP的一個(gè)最大優(yōu)點(diǎn)就是,它可以方便地與數(shù)據(jù)庫(kù)中操作,最顯著的MySQL的. 很多人使用這個(gè)數(shù)據(jù)庫(kù)。不少網(wǎng)站,包括這一個(gè),依賴(lài)于數(shù)據(jù)庫(kù)的函數(shù). 然而,正如你所料,有這么大的權(quán)力你就要夠面對(duì)龐大的潛在安全問(wèn)題. 所幸的是,有很多解決辦法. 最常見(jiàn)面安全問(wèn)題是一個(gè)數(shù)據(jù)庫(kù) SQL注入-當(dāng)用戶(hù)利用一個(gè)安全故障在你的數(shù)據(jù)庫(kù)運(yùn)行SQL語(yǔ)句. 讓我們用一個(gè)常見(jiàn)的例子. 許多登錄系統(tǒng)具有以下特點(diǎn):一條線(xiàn),看起來(lái)象不像是在檢查從表單輸入的用戶(hù)名和密碼, 比如去控制訪問(wèn)一個(gè)管理員區(qū):

$check = mysql_query("Select Username, Password, UserLevel FROM Users Where Username 
= '".$_POST['username']."' and Password = '".$_POST['password']."'");

看上去很眼熟? 就表面看來(lái),它好像做得不錯(cuò).上述并不像可以做許多破壞. 但話(huà)又說(shuō)回來(lái),我在"username" 輸入框輸入這樣的值并提交:

'' 或者 1=1 #

這個(gè)執(zhí)行語(yǔ)句現(xiàn)在是這個(gè)樣子:

elect Username, Password FROM Users Where Username = '' or 1=1 #' and Password = '';

散列符號(hào)(#)告訴MySQL的它之后一切,都會(huì)被忽略. 所以實(shí)際上只是執(zhí)行的SQL到這一點(diǎn). 1永遠(yuǎn)等于1 ,所以SQL將從數(shù)據(jù)庫(kù)返回所有的用戶(hù)名和密碼. 在大多數(shù)用戶(hù)登錄數(shù)據(jù)庫(kù)的首個(gè)戶(hù)名和密碼組合都是管理員用戶(hù), 他干脆輸入了幾個(gè)符號(hào)作為管理員已登錄你的網(wǎng)站, 果他們其實(shí)都知道的用戶(hù)名和密碼,他們會(huì)有同樣的權(quán)力如。

一個(gè)小創(chuàng)意,上述情況可以進(jìn)一步發(fā)揮,讓用戶(hù)建立自己的登錄帳號(hào), 閱讀信用卡號(hào)碼,甚至刪除數(shù)據(jù)庫(kù)。

所幸的是,這種情況還是很容易避免. 通過(guò)檢查要進(jìn)入數(shù)據(jù)庫(kù)的數(shù)據(jù),并刪除或取消它們, 我們可以防止任何人在這個(gè)數(shù)據(jù)庫(kù)上執(zhí)行他們自己的SQL語(yǔ)句. 函數(shù)的方法如下:

function make_safe($variable) {
$variable = addslashes(trim($variable));
return $variable;
}

現(xiàn)在,修改了我們的執(zhí)行語(yǔ)句.用_POST取代上面的執(zhí)行變量, 我們現(xiàn)在把所有的用戶(hù)數(shù)據(jù)通過(guò)make_safe函數(shù),在以下代碼:

$username = make_safe($_POST['username']);
$password = make_safe($_POST['password']);
$check = mysql_query("Select Username, Password, UserLevel FROM Users Where Username
= '".$username."' and Password = '".$password."'");

現(xiàn)在,如果一個(gè)用戶(hù)輸入惡意的上述數(shù)據(jù),查詢(xún)看上去像下面這樣,是完全無(wú)害. 以下查詢(xún)將選擇從數(shù)據(jù)庫(kù)中的用戶(hù)都和"\' or 1=1 #"相等的。

Select Username, Password, UserLevel FROM Users Where Username 
= '\' or 1=1 #' and Password = ''

現(xiàn)在,除非你曾經(jīng)提供了一個(gè)非常特殊的用戶(hù)名和空白密碼, 你的惡意攻擊者將不能做任何損害的事. 像這樣檢查所有的數(shù)據(jù)通過(guò)你的數(shù)據(jù)庫(kù)是非常重要的,盡管你認(rèn)為這是已經(jīng)很安全. HTTP頭可以由用戶(hù)偽造. 他們參照地址可以偽造.瀏覽器用戶(hù)字符串可以偽造. 不要信任一條用戶(hù)發(fā)送的數(shù)據(jù),雖然,你認(rèn)為是安全的。

文件操作

一些現(xiàn)今的網(wǎng)站的URL,是這個(gè)樣子的:

index.php?page=contactus.html

"index.php"文件包括"contactus.html"文件,而且這個(gè)網(wǎng)站似乎正常運(yùn)行. 不過(guò),用戶(hù)可以很容易地將"contactus.html"改成他們自己喜的東西. 舉例來(lái)說(shuō), 如果您正在使用Apache的mod_auth去保護(hù)文件,并儲(chǔ)存你的密碼在一個(gè)文件名為".htpasswd"(傳統(tǒng)姓名)里 ,然后,如果用戶(hù)訪問(wèn)以下地址, 腳本將輸出你的用戶(hù)名和密碼:

index.php?page=.htpasswd

通過(guò)改變URL,在某些系統(tǒng)中, 在另一個(gè)可以運(yùn)行PHP的服務(wù)器去引用文件。害怕? 你應(yīng)該害怕. 再次所幸的是,這是比較容易防范. 首先,你必須確保正確設(shè)置" open_basedir"在你的php.ini文件,并已設(shè)置"allow_url_fopen "為"Off" . 這將阻止大多數(shù)這類(lèi)型的攻擊,以保護(hù)遠(yuǎn)程文件和文件系統(tǒng). 其次,如果可以的話(huà),請(qǐng)檢查文件要求對(duì)有效文件. 如果你限制了某些文件可以用這個(gè)腳本, 你可以節(jié)省不少后來(lái)惡果。

使用默認(rèn)

當(dāng)mysql是安裝,它使用了默認(rèn)用戶(hù)的"root"和空白的密碼. SQL Server的用途"sa"作為默認(rèn)的用戶(hù)和提供了一個(gè)空白的密碼. 如果有人發(fā)現(xiàn)你的數(shù)據(jù)庫(kù)服務(wù)器地址,并想嘗試登錄, 這些都是首次組合,他們會(huì)嘗試. 如果你沒(méi)有設(shè)定不同的密碼(最好也和用戶(hù), 那么你很可能一天一覺(jué)醒來(lái)發(fā)現(xiàn)你的數(shù)據(jù)庫(kù)已經(jīng)被刪除,所有用戶(hù)號(hào)碼被盜. 和所有軟件一樣,你如果使用的軟件是默認(rèn)用戶(hù)名和密碼,改變他們。

不要讓安裝文件在線(xiàn)

很多PHP項(xiàng)目用安裝文件來(lái)安裝. 其中有不少是一旦運(yùn)行就自我刪除的,但許多不是這樣的,直到您刪除安裝文件. 如果讓安裝文件在線(xiàn)請(qǐng)注,他們可能仍然可用, 有人可以用它來(lái)復(fù)蓋你的整個(gè)網(wǎng)站。

預(yù)見(jiàn)性

試想一下,你的網(wǎng)站讓一個(gè)壞人盯上. 這個(gè)壞的人要打破你的管理區(qū), 改變你的所有產(chǎn)品的描述如"這個(gè)產(chǎn)品很差勁" . 我猜測(cè),他們首先會(huì)去http://www.yoursite.com/admin/ -萬(wàn)一它存在. 將你的敏感文件和文件夾像預(yù)測(cè)一樣,他們很容易就受到黑客攻擊。

為此,要確保你的姓名你的敏感文件和文件夾,讓他們很難猜測(cè). 把你的 admin 位于http://www.yoursite.com/jsfh8sfsifuhsi8392/ 或者更難去寫(xiě)的,但它為你的網(wǎng)站添加一些額外的保障.如果你需要一個(gè)記得快的地址, 但不用"admin"或"administration" (或你的用戶(hù)名和密碼) . 用一些不經(jīng)常用的。

這同樣適用于用戶(hù)名和密碼. 如果你有管理區(qū),不要使用" admin "作為用戶(hù)名和" password "作為密碼. 針對(duì)一些特殊的情況,最好是兩個(gè)字母和數(shù)字(有的黑客利用一些所謂的"詞典攻擊" , 嘗試每一個(gè)字,在字典里的密碼,直到他們找到密碼。添加一對(duì)密碼,使這一類(lèi)攻擊無(wú)用) . 這也是明智的去定期改變你的密碼 (每?jī)蓚€(gè)月). 最后,要確保當(dāng)一個(gè)用戶(hù)名輸入" Wrong Password " 當(dāng)錯(cuò)誤的密碼輸入時(shí)你的錯(cuò)誤訊息給沒(méi)有輸出.如: " Unknown Username ",惡意用戶(hù)都知道,他們已經(jīng)成功地猜測(cè)一個(gè)有效的用戶(hù)名. 對(duì)上述兩種手段,采用通用的"登錄錯(cuò)誤"的錯(cuò)誤信息 ,如果是用戶(hù)名和密碼輸入錯(cuò)誤的惡意用戶(hù)就沒(méi)有任何辦法設(shè)想正確的用戶(hù)和密碼。

最后,徹底和完全地設(shè)想

你假設(shè)你的網(wǎng)站不會(huì)受到攻擊,或面要對(duì)任何問(wèn)題的話(huà),但當(dāng)最終出事,你將有大量的麻煩. 如果,在另一方面, 假設(shè)你的每一個(gè)客人到你的網(wǎng)站是為了攻擊你,你永遠(yuǎn)處于戰(zhàn)爭(zhēng)狀態(tài), 你就能幫助你把你的網(wǎng)站做得安全,并準(zhǔn)備得沒(méi)有一點(diǎn)閃失。

【編輯推薦】

  1. Java和PHP在Web開(kāi)發(fā)方面的比較
  2. 國(guó)外主流PHP框架對(duì)比評(píng)測(cè)
  3. 精通PHP需要注意的十大要點(diǎn)
責(zé)任編輯:楊鵬飛 來(lái)源: shuro的博客
相關(guān)推薦

2011-07-08 10:01:05

PHP

2013-06-05 09:51:04

2020-11-06 15:00:58

PHPMySQL數(shù)據(jù)庫(kù)

2020-11-09 15:49:38

PHPMemcache網(wǎng)絡(luò)安全

2020-08-19 15:30:04

PHP網(wǎng)絡(luò)安全代碼

2020-10-14 11:30:10

PHP網(wǎng)絡(luò)安全加密

2022-12-21 15:56:23

代碼文檔工具

2009-12-03 16:30:24

PHP代碼解析損耗

2020-09-18 07:57:10

代碼編碼開(kāi)發(fā)

2018-10-06 05:00:53

2021-06-25 14:13:14

態(tài)勢(shì)感知

2021-04-23 11:06:14

網(wǎng)絡(luò)數(shù)據(jù)技術(shù)

2010-07-13 11:47:47

2022-06-13 10:11:19

項(xiàng)目文檔PRD

2009-12-01 16:12:37

PHP HTML截取代

2009-12-02 09:21:04

PHP數(shù)據(jù)過(guò)濾

2009-12-04 09:00:05

PHP垃圾代碼

2010-08-04 11:37:44

PHP NFS

2010-07-15 15:49:53

PHP網(wǎng)站安全

2011-07-05 17:52:41

PHP
點(diǎn)贊
收藏

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