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)用程序覆劈。
從上圖可以看出保礼,要完成一次CSRF攻擊沛励,受害者必須依次完成兩個(gè)步驟 :
登錄受信任網(wǎng)站A,并在本地生成Cookie 氓英。
在不退出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è)方面入手:
正確使用GET,POST和Cookie;
在非GET請(qǐng)求中增加偽隨機(jī)數(shù)抢野;
一般而言拷淘,普通的Web應(yīng)用都是以GET、POST為主指孤,還有一種請(qǐng)求是Cookie方式辕棚。我們一般都是按照如下方式設(shè)計(jì)應(yīng)用:
GET常用在查看,列舉邓厕,展示等不需要改變資源屬性的時(shí)候逝嚎;
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)求
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ù):
- 事務(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)跌造。
- 誰(shuí)用了索引杆怕,數(shù)取數(shù)據(jù)的行數(shù)少,誰(shuí)的效率就搞壳贪,它就好陵珍。不管它是group by, order, join.