PHP面試(三)

XSS攻擊是什么


XSS

常見(jiàn)的 XSS 輸入
XSS 輸入通常包含 JavaScript 腳本,如彈出惡意警告框:<script>alert("XSS");</script>
XSS 輸入也可能是 HTML 代碼段秉沼,譬如:
網(wǎng)頁(yè)不停地刷新** <meta http-equiv="refresh" content="0;">**
嵌入其它網(wǎng)站的鏈接 <iframe src=http://xxxx width=250 height=250></iframe>

如何預(yù)防XSS

目前防御XSS的方式:

PHP 提供了htmlspecialchars()函數(shù)可以將 HTML 特殊字符轉(zhuǎn)化成在網(wǎng)頁(yè)上顯示的字符實(shí)體編碼袭蝗。這樣即使用戶輸入了各種 HTML 標(biāo)記蜓席,在讀回到瀏覽器時(shí)欢策,會(huì)直接顯示這些 HTML 標(biāo)記哼丈,而不是解釋執(zhí)行臣樱。htmlspecialchars()函數(shù)可以將以下五種 HTML 特殊字符轉(zhuǎn)成字符實(shí)體編碼:
- &轉(zhuǎn)成 &
- “轉(zhuǎn)成 "
- <轉(zhuǎn)成 <
- ·>轉(zhuǎn)成 & g t;
- ‘轉(zhuǎn)成 '

當(dāng)直接調(diào)用 htmlspecialchars($str)時(shí), & " < > 被轉(zhuǎn)義。
當(dāng)設(shè)置 ENT_QUOTES 標(biāo)記時(shí), 即調(diào)用htmlspecialchars($str, ENT_QUOTES)時(shí)再膳,單引號(hào)也被轉(zhuǎn)義挺勿。
當(dāng)設(shè)置 ENT_NOQUOTES 標(biāo)記時(shí),單引號(hào)和雙引號(hào)都不會(huì)被轉(zhuǎn)義饵史。即調(diào)用 htmlspecialchars($str, ENT_NOQUOTES)時(shí),只有& < > 被轉(zhuǎn)義胜榔。

<?php
    if (isset($_POST['name'])){
    $str = trim($_POST['name']);  //清理空格
    $str = strip_tags($str);   //過(guò)濾html標(biāo)簽
    $str = **htmlspecialchars**($str);   //將字符內(nèi)容轉(zhuǎn)化為html實(shí)體
    $str = addslashes($str);
    echo $str;
}
?>
<form method="post" action="">
<input name="name" type="text">
<input type="submit" value="提交" >
</form>

PHP 提供了strpos()胳喷、strstr()、preg_match()等函數(shù)可用于檢測(cè)非法字符和字符串夭织;preg_replace() 函數(shù)可用于替換非法字符串吭露。

CRSF(Cross-site request forgery),中文名稱:跨站請(qǐng)求偽造
那么CSRF到底能夠干嘛呢尊惰?你可以這樣簡(jiǎn)單的理解:攻擊者可以盜用你的登陸信息讲竿,以你的身份模擬發(fā)送各種請(qǐng)求。攻擊者只要借助少許的社會(huì)工程學(xué)的詭計(jì)弄屡,例如通過(guò)QQ等聊天軟件發(fā)送的鏈接(有些還偽裝成短域名题禀,用戶無(wú)法分辨),攻擊者就能迫使Web應(yīng)用的用戶去執(zhí)行攻擊者預(yù)設(shè)的操作膀捷。例如迈嘹,當(dāng)用戶登錄網(wǎng)絡(luò)銀行去查看其存款余額,在他沒(méi)有退出時(shí)全庸,就點(diǎn)擊了一個(gè)QQ好友發(fā)來(lái)的鏈接秀仲,那么該用戶銀行帳戶中的資金就有可能被轉(zhuǎn)移到攻擊者指定的帳戶中。

所以遇到CSRF攻擊時(shí)壶笼,將對(duì)終端用戶的數(shù)據(jù)和操作指令構(gòu)成嚴(yán)重的威脅神僵;當(dāng)受攻擊的終端用戶具有管理員帳戶的時(shí)候,CSRF攻擊將危及整個(gè)Web應(yīng)用程序覆劈。

image.png

從上圖可以看出保礼,要完成一次CSRF攻擊沛励,受害者必須依次完成兩個(gè)步驟 :

  1. 登錄受信任網(wǎng)站A,并在本地生成Cookie 氓英。

  2. 在不退出A的情況下侯勉,訪問(wèn)危險(xiǎn)網(wǎng)站B。

看到這里铝阐,讀者也許會(huì)問(wèn):“如果我不滿足以上兩個(gè)條件中的任意一個(gè)址貌,就不會(huì)受到CSRF的攻擊”。是的徘键,確實(shí)如此练对,但你不能保證以下情況不會(huì)發(fā)生:
你不能保證你登錄了一個(gè)網(wǎng)站后,不再打開一個(gè)tab頁(yè)面并訪問(wèn)另外的網(wǎng)站吹害,特別現(xiàn)在瀏覽器都是支持多tab的螟凭。
你不能保證你關(guān)閉瀏覽器了后,你本地的Cookie立刻過(guò)期它呀,你上次的會(huì)話已經(jīng)結(jié)束螺男。
上圖中所謂的攻擊網(wǎng)站,可能是一個(gè)存在其他漏洞的可信任的經(jīng)常被人訪問(wèn)的網(wǎng)站纵穿。
因此對(duì)于用戶來(lái)說(shuō)很難避免在登陸一個(gè)網(wǎng)站之后不點(diǎn)擊一些鏈接進(jìn)行其他操作下隧,所以隨時(shí)可能成為CSRF的受害者。
CSRF攻擊主要是因?yàn)閃eb的隱式身份驗(yàn)證機(jī)制谓媒,Web的身份驗(yàn)證機(jī)制雖然可以保證一個(gè)請(qǐng)求是來(lái)自于某個(gè)用戶的瀏覽器淆院,但卻無(wú)法保證該請(qǐng)求是用戶批準(zhǔn)發(fā)送的。

服務(wù)端的預(yù)防CSRF攻擊的方式方法有多種句惯,但思想上都是差不多的土辩,主要從以下2個(gè)方面入手:

  1. 正確使用GET,POST和Cookie;

  2. 在非GET請(qǐng)求中增加偽隨機(jī)數(shù)抢野;

一般而言拷淘,普通的Web應(yīng)用都是以GET、POST為主指孤,還有一種請(qǐng)求是Cookie方式辕棚。我們一般都是按照如下方式設(shè)計(jì)應(yīng)用:

  1. GET常用在查看,列舉邓厕,展示等不需要改變資源屬性的時(shí)候逝嚎;

  2. POST常用在下達(dá)訂單,改變一個(gè)資源的屬性或者做其他一些事情详恼;

接下來(lái)我就以Java語(yǔ)言來(lái)舉例說(shuō)明补君,如何限制對(duì)資源的訪問(wèn)方法:

Blade.regRoute("/user/:uid", IndexRoute.class, "getuser", HttpMethod.GET);
Blade.regRoute("/user/:uid", IndexRoute.class, "modifyuser", HttpMethod.POST);

代碼是blade框架的寫法。

這樣處理后昧互,因?yàn)槲覀兿薅诵薷闹荒苁褂肞OST挽铁,當(dāng)GET方式請(qǐng)求時(shí)就拒絕響應(yīng)伟桅,所以上面圖示中GET方式的CSRF攻擊就可以防止了,但這樣就能全部解決問(wèn)題了嗎叽掘?當(dāng)然不是楣铁,因?yàn)镻OST也是可以模擬的。

因此我們需要實(shí)施第二步更扁,在非GET方式的請(qǐng)求中增加隨機(jī)數(shù)盖腕,這個(gè)大概有三種方式來(lái)進(jìn)行:

為每個(gè)用戶生成一個(gè)唯一的cookie token,所有表單都包含同一個(gè)偽隨機(jī)值浓镜,這種方案最簡(jiǎn)單溃列,因?yàn)楣粽卟荒塬@得第三方的Cookie(理論上),所以表單中的數(shù)據(jù)也就構(gòu)造失敗膛薛,但是由于用戶的Cookie很容易由于網(wǎng)站的XSS漏洞而被盜取听隐,所以這個(gè)方案必須要在沒(méi)有XSS的情況下才安全。

每個(gè)請(qǐng)求使用驗(yàn)證碼哄啄,這個(gè)方案是完美的雅任,因?yàn)橐啻屋斎腧?yàn)證碼,所以用戶友好性很差咨跌,所以不適合實(shí)際運(yùn)用沪么。

不同的表單包含一個(gè)不同的偽隨機(jī)值

一次完整的網(wǎng)絡(luò)請(qǐng)求
一次完整的網(wǎng)絡(luò)請(qǐng)求.png
PCNTL

PHP使用PCNTL系列的函數(shù)也能做到多進(jìn)程處理一個(gè)事務(wù)。比如我需要從數(shù)據(jù)庫(kù)中獲取80w條的數(shù)據(jù)虑润,再做一系列后續(xù)的處理成玫,這個(gè)時(shí)候加酵,用單進(jìn)程拳喻?你可以等到明年今天了。猪腕。冗澈。所以應(yīng)該使用pcntl函數(shù)了。
假設(shè)我想要啟動(dòng)20個(gè)進(jìn)程陋葡,將1-80w的數(shù)據(jù)分成20份來(lái)做亚亲,主進(jìn)程等待所有子進(jìn)程都結(jié)束了才退出:

$max = 800000;
$workers = 20;
$pids = array();
for($i = 0; $i < $workers; $i++){
    $pids[$i] = pcntl_fork();
    switch ($pids[$i]) {
        case -1:
        echo "fork error : {$i} \r\n";
        exit;
    case 0:
        $param = array(
            'lastid' => $max / $workers * $i,
            'maxid' => $max / $workers * ($i+1),
        );
        $this->executeWorker($input, $output, $param);
        exit;
    default:
        break;
}

}

foreach ($pids as $i => $pid) {
if($pid) {
    pcntl_waitpid($pid, $status);
}

}
這里當(dāng)pcntl_fork出來(lái)以后,會(huì)返回一個(gè)pid值腐缤,這個(gè)pid在子進(jìn)程中看是0捌归,在父進(jìn)程中看是子進(jìn)程的pid(>0)藻肄,如果pid為-1說(shuō)明fork出錯(cuò)了剂买。

使用一個(gè)$pids數(shù)組就可以讓主進(jìn)程等候所有進(jìn)程完結(jié)之后再結(jié)束了

PHP socket

Socket是什么

socket的英文原義是“孔”或“插座”逗宁。作為BSD UNIX的進(jìn)程通信機(jī)制草娜,取后一種意思拯杠。通常也稱作”套接字”俄占,用于描述IP地址和端口如捅,是一個(gè)通信鏈的句柄秆吵。在Internet上的主機(jī)一般運(yùn)行了多個(gè)服務(wù)軟件,同時(shí)提供幾種服務(wù)角塑。每種服務(wù)都打開一個(gè)Socket蔫磨,并綁定到一個(gè)端口上,不同的端口對(duì)應(yīng)于不同的服務(wù)圃伶。

以上內(nèi)容來(lái)自百度百科

簡(jiǎn)單說(shuō)來(lái)堤如,socket可以幫助不同的服務(wù)在不同的端口進(jìn)行通信。

PHP curl

cURL 是一個(gè)利用URL語(yǔ)法規(guī)定來(lái)傳輸文件和數(shù)據(jù)的工具留攒,支持很多協(xié)議和選項(xiàng)煤惩,如HTTP、FTP炼邀、TELNET等魄揉,能提供 URL 請(qǐng)求相關(guān)的各種細(xì)節(jié)信息。最爽的是拭宁,PHP 也支持 cURL 庫(kù)洛退。

數(shù)組函數(shù)array_merge和+的區(qū)別:
$a=array('a'=>1,'b'=>2,'c'=>3);
$b=array('b'=>5,'c'=>6,'d'=>7);

print_r(array_merge($a,$b));
print_r($a+$b);

就輸出:
array(
[a]=>1
[b]=>5
[c]=>6
[d]=>7
)
array
(
[a]=>1
[b]=>2
[c]=>3
[d]=>7
)

array_merge()
如果輸入的數(shù)組中有相同的字符串鍵名,則該鍵名后面的值將覆蓋前一個(gè)值杰标。對(duì)于使用+合并數(shù)組
如果數(shù)組中有相同的字符串鍵名(不管是不是數(shù)字)兵怯,則會(huì)把最先出現(xiàn)的值作為最終結(jié)果返回,而把后面的數(shù)組擁有相同鍵名的那些值拋棄掉 腔剂。

isset如果變量存在(非NULL)則返回TRUE,否則返回FALSE.變量設(shè)置為NULL,返回也是FALSE.PHP的isset()函數(shù) 一般用來(lái)檢測(cè)變量是否設(shè)置
empty.如果變量時(shí)非空和非零的值媒区,則empty返回FALSE,換句話說(shuō),NULL,FALSE,0,$var未定義掸犬。以及沒(méi)有屬性的對(duì)象都被認(rèn)為是空的袜漩。如果var為空,則返回true湾碎。**PHP的empty()函數(shù) 判斷值為否為空 **

TCP和UDP的區(qū)別

TCP:面向連接宙攻、傳輸可靠(保證數(shù)據(jù)正確性,保證數(shù)據(jù)順序)、用于傳輸大量數(shù)據(jù)(流模式)介褥、速度慢座掘,建立連接需要開銷較多(時(shí)間,系統(tǒng)資源)柔滔。
UDP:面向非連接溢陪、傳輸不可靠、用于傳輸少量數(shù)據(jù)(數(shù)據(jù)包模式)睛廊、速度快形真。

數(shù)據(jù)庫(kù)的事務(wù):
  1. 事務(wù)具有原子性,就是把多個(gè)數(shù)據(jù)庫(kù)操作合并成一個(gè)操作喉前,讓它具有原子性没酣,有一個(gè)操作失敗會(huì)回滾王财。(多個(gè)操作,會(huì)有出錯(cuò)的裕便,有一個(gè)失敗的話绒净,整個(gè)操作會(huì)回滾。)
    2偿衰。 可移植性
    會(huì)把自己操作過(guò)的數(shù)據(jù)設(shè)置一個(gè)所挂疆,在這個(gè)數(shù)據(jù)沒(méi)有結(jié)束之前,其他人都不能操作這個(gè)數(shù)據(jù)下翎。
兩個(gè)數(shù)據(jù)庫(kù)的操作

兩個(gè)數(shù)據(jù)庫(kù)需要兩次鏈接
兩次都需要啟動(dòng)事務(wù)缤言,每個(gè)事務(wù)都成功之后,在提交视事。
A數(shù)據(jù)庫(kù) 執(zhí)行兩條語(yǔ)句胆萧,成功
B數(shù)據(jù)庫(kù) 執(zhí)行三條語(yǔ)句,成功
之后再提交俐东。

索引的作用

從數(shù)據(jù)結(jié)構(gòu)角度想:B+樹跌穗。
存在葉子節(jié)點(diǎn)上面的是數(shù)據(jù),innodb虏辫。
存在葉子結(jié)點(diǎn)上面的是物理地址蚌吸,MYiSAM.
對(duì)于這種自己不會(huì)的問(wèn)題,引導(dǎo)到自己會(huì)的問(wèn)題上面砌庄。

連表查詢和嵌套查詢的那個(gè)效率更高:

如果自己不知道哪一個(gè)效率高羹唠,這個(gè)應(yīng)該考慮的是優(yōu)化的問(wèn)題,你可以說(shuō)娄昆,我還沒(méi)有做過(guò)實(shí)驗(yàn)佩微,但是可以用explain做一下實(shí)踐。
優(yōu)化就是sql的關(guān)鍵點(diǎn)稿黄。
哪種效率最高喊衫,哪種最優(yōu)跌造。

  1. 誰(shuí)用了索引杆怕,數(shù)取數(shù)據(jù)的行數(shù)少,誰(shuí)的效率就搞壳贪,它就好陵珍。不管它是group by, order, join.

還有對(duì)于自己簡(jiǎn)歷上面的寫的東西,自己一定要會(huì)违施。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末互纯,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子磕蒲,更是在濱河造成了極大的恐慌留潦,老刑警劉巖只盹,帶你破解...
    沈念sama閱讀 223,002評(píng)論 6 519
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異兔院,居然都是意外死亡殖卑,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,357評(píng)論 3 400
  • 文/潘曉璐 我一進(jìn)店門坊萝,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)孵稽,“玉大人,你說(shuō)我怎么就攤上這事十偶∑邢剩” “怎么了?”我有些...
    開封第一講書人閱讀 169,787評(píng)論 0 365
  • 文/不壞的土叔 我叫張陵惦积,是天一觀的道長(zhǎng)接校。 經(jīng)常有香客問(wèn)我,道長(zhǎng)狮崩,這世上最難降的妖魔是什么馅笙? 我笑而不...
    開封第一講書人閱讀 60,237評(píng)論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮厉亏,結(jié)果婚禮上董习,老公的妹妹穿的比我還像新娘。我一直安慰自己爱只,他們只是感情好皿淋,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,237評(píng)論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著恬试,像睡著了一般窝趣。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上训柴,一...
    開封第一講書人閱讀 52,821評(píng)論 1 314
  • 那天哑舒,我揣著相機(jī)與錄音,去河邊找鬼幻馁。 笑死洗鸵,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的仗嗦。 我是一名探鬼主播膘滨,決...
    沈念sama閱讀 41,236評(píng)論 3 424
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼稀拐!你這毒婦竟也來(lái)了火邓?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,196評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎铲咨,沒(méi)想到半個(gè)月后躲胳,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,716評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡纤勒,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,794評(píng)論 3 343
  • 正文 我和宋清朗相戀三年泛鸟,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片踊东。...
    茶點(diǎn)故事閱讀 40,928評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡北滥,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出闸翅,到底是詐尸還是另有隱情再芋,我是刑警寧澤,帶...
    沈念sama閱讀 36,583評(píng)論 5 351
  • 正文 年R本政府宣布坚冀,位于F島的核電站济赎,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏记某。R本人自食惡果不足惜司训,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,264評(píng)論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望液南。 院中可真熱鬧壳猜,春花似錦、人聲如沸滑凉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,755評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)畅姊。三九已至咒钟,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間若未,已是汗流浹背朱嘴。 一陣腳步聲響...
    開封第一講書人閱讀 33,869評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留粗合,地道東北人萍嬉。 一個(gè)月前我還...
    沈念sama閱讀 49,378評(píng)論 3 379
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像舌劳,于是被迫代替她去往敵國(guó)和親帚湘。 傳聞我的和親對(duì)象是個(gè)殘疾皇子玫荣,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,937評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容

  • 防止SQL注入簡(jiǎn)單回答:防止——利用即有的應(yīng)用甚淡、功能,將(惡意)SQL命令發(fā)送到到后臺(tái)數(shù)據(jù)庫(kù)引擎。 防止SQL注入...
    幼稚園靚仔閱讀 1,340評(píng)論 1 13
  • 從三月份找實(shí)習(xí)到現(xiàn)在贯卦,面了一些公司资柔,掛了不少,但最終還是拿到小米撵割、百度贿堰、阿里、京東啡彬、新浪羹与、CVTE、樂(lè)視家的研發(fā)崗...
    時(shí)芥藍(lán)閱讀 42,281評(píng)論 11 349
  • 本博客轉(zhuǎn)自:「作者:若愚鏈接:https://zhuanlan.zhihu.com/p/22361337來(lái)源:知乎...
    韓寶億閱讀 2,769評(píng)論 0 3
  • 1. 我不要再喜歡你了庶灿。 2. 自去年十一和你在公交車上遇見(jiàn)纵搁,已過(guò)去半年的時(shí)光。十一返校的公交車太過(guò)擁擠往踢,我被人流...
    南方笑佳人閱讀 1,148評(píng)論 0 0
  • 沒(méi)想到把這么多作品放一起的時(shí)候還是有點(diǎn)震撼的腾誉,雖然每次交作業(yè)的時(shí)候都從作品里看出各種不如意但一起看還是不敢相信這些...
    小喬127閱讀 184評(píng)論 4 1