整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          爬蟲瑞數5案例:某通信

          爬蟲瑞數5案例:某通信

          明:

          該文章為學習使用,嚴禁用于商業用途和非法用途,違者后果自負,由此產生的一切后果均與作者無關

          一、瑞數簡介

          瑞數動態安全 Botgate(機器人防火墻)以“動態安全”技術為核心,通過動態封裝、動態驗證、動態混淆、動態令牌等技術對服務器網頁底層代碼持續動態變換,增加服務器行為的“不可預測性”,實現了從用戶端到服務器端的全方位“主動防護”,為各類 Web、HTML5 提供強大的安全保護。

          二、瑞數特點

          1. 會有多層debugger,可以點擊Never pause here過掉debugger
          2. 會有多次請求
          • 瑞數4、瑞數5有兩次相同的請求,瑞數4第一個請求狀態碼202,瑞數5第一個請求狀態412,第一次請求響應的html,會有個script標簽外鏈js加載$_ts=window['$_ts'],外鏈js代碼可以固定,也可以通過對外鏈js發送請求獲取js代碼
          • 瑞數5.5有兩次相同的請求,第一次請求狀態碼412,響應的html有外鏈js,此外鏈js代碼可以固定,也可以通過對外鏈js發送請求獲取js代碼
          • 瑞數6和瑞數5.5編譯過程差不多
          1. 第一次響應的html,都會包含動態加載的meta標簽包含content、兩個script標簽,
          • 瑞數4、瑞數5用第一個script加載包含_ts=window['$_ts']的js文件,第二個script加載一段自執行的js,用于把之前加載的代碼處理成可用的js代碼,處理后的js字符串,通過call執行,并生成cookie
          • 瑞數5.5用第一個script加載包含_ts=window['$_ts']代碼,第二個script加載自執行js文件,用于把之前加載的代碼處理成可用的js代碼,處理后的js字符串,通過call執行,并生成cookie
          1. 都會有特有的cookie標識
          • 瑞數4:FSSBBIl1UgzbN7N80T,生成值的第一個字符就是代數
          • 瑞數5:IdlEqTWW2ERnT,生成值的第一個字符就是代數
          • 瑞數5.5:1EzPGwRUoQaWT,生成值的第一個字符就是代數
          1. 瑞數會檢測當前執行的文件是哪一個,可以使用delete __filename、delete __dirname

          三、瑞數5特點

          1. 兩層debugger,可以點擊Never pause here過掉debugger
          2. 同一個請求兩次
          3. 第一次請求失敗,狀態碼是412
          • 首先會生成一個js文件:$_ts=window['$_ts'],代碼可以固定
          • 然后響應返回一個html頁面,里面會有動態加載的meta標簽包含content、一個script標簽加載剛才js文件、一段script標簽包含的js代碼
          • 這段js代碼是個自執行方法,會把之前的js代碼,轉換成可用的js代碼,并通過call方法執行eval函數生成vm文件,在vm文件生成cookie,賦值給document.cookie
          • 響應的cookie名字是:IdlEqTWW2ERnS
          1. 第一次請求js代碼生成的 cookie的名字是:IdlEqTWW2ERnT,生成值的第一個字符就是代數
          2. 第二次請求,會正確拿到數據

          四、找出需要加密的參數

          1. js運行atob('aHR0cHM6Ly93d3cuMTAwMTAuY29tL25ldDUvMDc0Lw==') 拿到網址,F12打開調試工具(打開F12會遇到無限debugger,這是個eval執行的debugger,右擊左側代碼行點擊Never pause here過掉即可),刷新頁面,找到 net5/074/ 請求(狀態200),鼠標右擊請求找到Copy>Copy as cUrl(cmd)

          1. 打開網站:https://spidertools.cn/#/curl2Request,把拷貝好的curl轉成python代碼,新建 liantong.py,把代碼復制到該文件

          1. 多運行幾次liantong.py,會發現請求失敗,狀態碼是412,仔細分析cookie會發現IdlEqTWW2ERnS、IdlEqTWW2ERnT,而IdlEqTWW2ERnT值得第一個字符是5,這是瑞數特點之一,字符5代表是瑞數5代

          1. 新建liantong.js,用于放扣下的代碼

          五、瑞數5 cookie 分析

          1. 使用hook定位IdlEqTWW2ERnT,參數生成位置,這里我使用的是油猴

          1. 編輯好油猴腳本,啟動該腳本,切換到Application,清除瀏覽器的cookie,一定要清除cookie

          1. 清除cookie后,刷新頁面后會進入油猴腳本里的debugger,一直點擊跳過當前函數執行,就會找到IdlEqTWW2ERnT賦值的地方

          1. 分析IdlEqTWW2ERnT賦值的地方,會發現是在_$MK函數中,搜索_$MK會找到調用該函數地方,點擊跳過斷點,會進入該斷點。注意這是個虛擬文件,每次生成的都不一樣,需結合當前代碼分析

          1. 分析右側的堆棧,找到不屬于該虛擬文件的棧,分別點擊查看會發現一個call方法,該方法就是生成虛擬文件的地方,這個文件是第一次請求的響應結果

          1. 使用無痕窗口打開網站,F12打開調試工具,點擊sources,找到事件監聽勾選script

          1. 切換到Application,清除瀏覽器的cookie,一定要先清除cookie,清除cookie后,刷新頁面,會看到一個js文件,這是第一次請求生成的,把這個文件代碼全部拷貝到liantong.js

          1. 點擊跳過斷點,會進入一個html文件,這是第一次請求響應結果,分析文件會發現一個meta標簽、一個script標簽引入了剛才生成的js、還有一個script標簽里面有很多代碼,代碼用于把之前的js轉換成可用的js代碼

          1. 在該文件搜索.call,會找到一個.call方法執行,在該行打上斷點

          1. 點擊跳過斷點,鼠標懸浮到_$PU上會發現很多js字符串,這就是經過該自執行方法轉換后的js

          1. 這里要注意虛擬文件是動態生成的,每次獲取到的都是不一樣的,為了方便調試,把html文件替換成本地文件,這樣每次生成的虛擬文件就是一樣的,右擊該html文件名稱,點擊Override content,如果替換成功后代碼都在一行,可以在本地找到該文件,用編輯器打開,格式化一下,并在call的位置打上斷點

          1. 把script中的自執行方法全部拷貝到liantong.js,運行liantong.js,會發現報window的錯誤,window是瀏覽器環境的,node環境不存在,接下來開始補環境

          六、補環境

          1. 首選在代碼頂部補上window環境,并用代理自動把需要補的環境吐出來,新建jsProxy.js把下面代碼拷貝過去
          // 代理器封裝
          function getEnv(proxy_array) {
              for(var i=0; i<proxy_array.length; i++){
                  handler=`{\n
                      get: function(target, property, receiver) {\n
                             console.log('方法:get','    對象:${proxy_array[i]}','    屬性:',property,'    屬性類型:',typeof property,'    屬性值類型:',typeof target[property]);
                             return target[property];
                      },
                      set: function(target, property, value, receiver){\n
                              console.log('方法:set','    對象:${proxy_array[i]}','    屬性:',property,'    屬性類型:',typeof property,'    屬性值類型:',typeof target[property]);
                              return Reflect.set(...arguments);
                      }
                  }`;
                  eval(`
                      try{\n
                          ${proxy_array[i]};\n
                          ${proxy_array[i]}=new Proxy(${proxy_array[i]},${handler});
                      }catch(e){\n
                          ${proxy_array[i]}={};\n
                          ${proxy_array[i]}=new Proxy(${proxy_array[i]},${handler});
                      }   
                  `)
              }
          }
          
          // proxy_array=['window', 'document', 'location', 'navigator', 'history','screen','target' ]
          // getEnv(proxy_array)
          
          module.exports=getEnv

          1. 運行liantong.js,會發現在獲取window.top時報錯了,在控制臺輸出window.top得知 window.top=window,在代碼頂部補上window.top

          1. 運行liantong.js,會發現在獲取document.createElement時報錯了,document.createElement是用來創建標簽的,在代碼頂部補上document.createElement,之所以return出一個json,是因為標簽也是一個對象

          1. 運行liantong.js,會發現在獲取document.createElement時又報錯了,創建的標簽是div,補上div,并找到打印信息最后的位置,會看到報錯代碼

          1. 在瀏覽器call斷點處,點擊進入該方法內部會找到虛擬文件,在虛擬文件內搜索$xX[_$rB[157]],會找到該方法的位置,在該行打上斷點,點擊跳過斷點,會進入剛才的斷點,把代碼信息在控制輸出,會發現是獲取div下的i標簽,獲取出的結果是 length:0,在代碼頂部補上該代碼

          1. 運行liantong.js,會發現在獲取window.attachEvent時報錯了,找到打印信息最后的位置,會看到報錯代碼,在虛擬文件內搜索g[_$rB[195]],會找到該方法的位置,在該代碼處有個判斷,在if和else中都打上斷點,點擊跳過斷點,if斷點,把代碼信息在控制輸出,會發現是window.addEventListener,獲取出的結果是 undefined,在代碼頂部補上該代碼

          1. 運行liantong.js,會發現在獲取document.getElementsByTagName時報錯了,找到打印信息最后的位置,會看到報錯代碼,在虛擬文件內搜索f[_$rB[157]],會找到多個該方法的位置,在所有的f[_$rB[157]]打上斷點,點擊跳過斷點,會進入某一個斷點,打印出信息,會發現是兩個meta對象和length,在代碼頂部補上代碼

          1. 兩個meta標簽需要補什么代碼,就要分析下面的邏輯了,點擊跳過當前函數執行,分析代碼,會發現需要最后一個標簽上的content,需要最后一個標簽parentNode.removeChild 移除標簽,最后會把content返回,根據分析補上代碼

          1. 重復運行liantong.js,按照上面的方法補全環境
          2. 補完環境,修改liantong.js,再運行,會發現已經拿到IdlEqTWW2ERnT

          七、python代碼驗證結果

          1. 修改liantong.js,因為meta中的content、還有js代碼都是動態生成的,所以要用字符暫時占位,分別注釋掉之前content的值和js,用meta_content、js_code代替

          1. 修改fdc.py

          1. 點擊運行fdc.py,會發現第二個請求報400,那是因為瑞數會檢測當前執行的文件是哪一個

          1. 修改liantong.js,再運行fdc.py,會發現數據獲取成功

          八、最終代碼

          1. liantong.js,代碼太多只貼補環境的那塊兒
          delete __dirname
          delete __filename
          
          
          var getEnv=require('./jsProxy')
          
          //補window環境
          window=global
          window.top=window
          window.addEventListener=function (event) {
              console.log('window中的addEventListener接受的值:', event)
          }
          
          //補document
          div={
              getElementsByTagName: function (res) {
                  console.log('div中的getElementsByTagName接受的值:', res)
                  if (res=='i') {
                      return {length: 0}
                  }
              }
          }
          
          meta={
              0: {},
              1: {
                  // content: '{qqiWR9xjADLqtZr.GKDUqs39vLCd6fuDojxTsXPqq|[MOVUqGS9kDwYAY2MHmG8qqenYagvFTYnqaVRkcNykUE2QpL1UOm3DmV.UaxMHf24DULSwPQ.o1WoFaQ0osgoFcNzHGWFl1x7iueMEnWPYsGUinpbxrEUmkAWiA36crg6r1VwErNIEG9BVaVFkaqEkf9kra7lrS9tYs3eEPaaxSeIEA9HkkfRiYYWHS7gkPZdkrEPtnQwYs3.eahnr50RXqCjtH09dcbnU7yq4AOBU4TRXVkvoMVtL1OLxi7NNT4YAHqEZm5GKFxqZfCPrWTwLGBbkWL54mK.oiLLSmOEEieM2f_8iwg4amB1DX0kaTVQrgEnzs8CJMW67uDuJ.35XOKaH.0ac80{AVhRPOD1oF7LTncUsEzy56uo8iJ7aOK.T3d7d7kbbH.qS7sbNHjwPZbUgFjASBsb.WM9dBo_PH_LpL1cfl4096k162hsQioxBGHtAihVlwBPeCtEe8.qfQg.wHVg9MepzcbGPT1sAl.orvE_e5EwA2MzQ9Wbt9r1r0r4q!x7z,aac,amr,asm,avi,bak,bat,bmp,bin,c,cab,css,csv,com,cpp,dat,dll,doc,dot,docx,exe,eot,fla,flc,fon,fot,font,gdb,gif,gz,gho,hlp,hpp,htc,ico,ini,inf,ins,iso,js,jar,jpg,jpeg,json,java,lib,log,mid,mp4,mpa,m4a,mp3,mpg,mkv,mod,mov,mim,mpp,msi,mpeg,obj,ocx,ogg,olb,ole,otf,py,pyc,pas,pgm,ppm,pps,ppt,pdf,pptx,png,pic,pli,psd,qif,qtx,ra,rm,ram,rmvb,reg,res,rtf,rar,so,sbl,sfx,swa,swf,svg,sys,tar,taz,tif,tiff,torrent,txt,ttf,vsd,vss,vsw,vxd,woff,woff2,wmv,wma,wav,wps,xbm,xpm,xls,xlsx,xsl,xml,z,zip,apk,plist,ipaqqqqqqqqqqqqqqkRxA1WYW8i2ZaYc0IH9V_UAlwSf3|gYBRPSpKnWLGmzpn1RFgTvfn.WMN2nKrBqVWPwqrME6aBAcYAxK7XifNgJ9qoIDrOhYVmscevR1Qa3rJyk2QrpCg4rYlO8OZfH6qvFCY8H209hArJH6q1VnpSrlaPkAxixrTXpaEYh2ZXAfJ4JoABM1TUmKV0p1w6lTaAFbYgEArBRbVr393oFOmsRvqi8DwDEYpOFkzaRuL9ECQFHfAFhcyeEqLuhcQr3al2qpe5oO7YraggcozOmq06MaQaWcW5HOqD3aEPhnL4hrVNECWVlGqJ3C0IMkzUomlrq 0wR7HvJ6IsUC410DntKRngA;QyqA82EGtIB6ePNEeYo9NG;iEm6gdSTTpYiqU10OlvsnG;yMG8gk5okQ97gP4eb.IadA;T8F36FaS9AtR4sXBkRr0iG;RTlM3IYjAzboXbIiNSIFRA;t7_svh3Kc3.VU9jOjAJgdq;.8D9Zx78FrKF.Zn4xbfmIG;IMhCM7gXESIqShs5TNMo9A;pvBPF7OtrK6trS5vZYizwa;9qxqLXuEeDQeAlNfAL_l.A;VNeyFcNDtQZhV2sfCxyHqA;kT4JL2WRSOhvUIEcOjSrva;LpFhLGWYI8eFx_X999MLEq;NqssQaVItFB0TevtNxJrkG;AI3RN3R7lP0BBnYsoCO5KG;xrYRhwM6FYW7zCsPL.iecq;0kOXzZzt1eXLrlPo.QQ4xG;ApKNqLIRoybF5rIxSnabBG;hfgZrtz_KscdFC6a3f1wKA;Ddfe167m26649h_g.S8UKVgXBt1074790432r0YQLJiVGhVajrMQpjFqUZuNqV80Tt89zds6ycR9fGsCNkl3650r0q}!DBEbb61kMgq_GKiDIZLg9oiwINe0CsjYI7qgLVKAwKS03oewpcl4FvNLIO7y1Tff8kgLIo2mtKfXR6JJw6Y_YTwPJKJxRTp2FUNdsvSGFU2gYvm7YUlP16wcwTJjWYNC36rssnfssmwnM0eVKbYnVvZFwTxcov2N1Dx0MKEKUCfl1YLAi0Y_KDyAxfA7VnfnQ9fZKcfIsvwaIDWDEvy5tmVaiUaqqqqqqqqqqqqqq',
                  content:'meta_content',
                  parentNode: {
                      removeChild: function (tag) {
                          console.log('meta中的removeChild接受的值:', tag)
                      }
                  }
              },
              length: 2
          }
          
          script={
              0: {
                  getAttribute: function (attr) {
                      if (attr=='r') {
                          return 'm'
                      } else {
                          console.log('script-0中的getAttribute接受的值:', attr)
                      }
                  },
                  parentElement: {
                      removeChild: function (tag) {
                          console.log('script-0中的removeChild接受的值:', tag)
                      }
                  }
              },
              1: {
                  getAttribute: function (attr) {
                      if (attr=='r') {
                          return 'm'
                      } else {
                          console.log('script-1中的getAttribute接受的值:', attr)
                      }
                  },
                  parentElement: {
                      removeChild: function (tag) {
                          console.log('script-1中的removeChild接受的值:', tag)
                      }
                  }
              },
              length: 2
          }
          
          document={
              createElement: function (tag) {
                  if (tag=='div') {
                      return div
                  } else {
                      console.log('document中的createElement接受的值:', tag)
                      return {}
                  }
              },
              getElementsByTagName: function (tag) {
                  if (tag=='meta') {
                      return meta
                  } else if (tag=='script') {
                      return script
                  } else {
                      console.log('document中的etElementsByTagName接受的值:', tag)
                      return {}
                  }
              },
              addEventListener: function (event) {
                  console.log('addEventListener中的addEventListener接受的值:', event)
              }
          }
          
          //補location
          location={
              "href": "http://www.fangdi.com.cn/index.html",
              "origin": "http://www.fangdi.com.cn",
              "protocol": "http:",
              "host": "www.fangdi.com.cn",
              "hostname": "www.fangdi.com.cn",
              "pathname": "/index.html",
          }
          
          
          proxy_array=['window', 'document', 'location', 'navigator', 'history', 'screen', 'target']
          getEnv(proxy_array)
          
          setTimeout=function () {}
          setInterval=function () {}
          1. liantong.py

          言:

          最近總結了一些自己做題過程中遇到的易錯問題,附帶解析,希望對大家有幫助。
          

          1.下面哪些執行結果為true()

          A 'foo'==new function(){ return String('foo'); };

          B 'foo'==new function(){ return new String('foo'); };

          C []==0

          D ![]

          E !0

          點擊查看答案

          答案:B C E

          點擊查看涉及到的知識點

          1.new返回值

          2.String()與 new String()區別

          3.隱式類型轉換

          解析:

          A 'foo'==new function(){ return String('foo'); };

          1. String('foo')=> 'foo'
          2. new functionreturn會判斷返回值是否為引用數據類型,如果不是引用數據類型會返回空對象{},所以new function(){ return String('foo'); }返回{}
          3. 'foo'=={}{}進行隱式類型轉換,{}調用valueOf方法返回{}對象,判斷{}不是基本數據類型,繼續調用toString()方法,返回'[object Object]'。
          4. 'foo'=='[object Object]',返回false

          B 'foo'==new function(){ return new String('foo'); };

          1. new String('foo');返回String對象。
          2. 'foo'==new String('foo'), new String('foo')調用自身valueOf方法,返回'foo'
          3. 'foo'=='foo' 返回 true

          C []==0

          引用數據類型會先轉換為String,然后再轉換為number

          1. 數組會先調用自身toString()方法 [].toString();=> ''
          2. 使用Number('')轉為數字 Number('')=> 0
          3. 0==0=> true

          D ![]

          將[]隱式轉化為布爾值

          1. Boolean([])=> true
          2. !true=> false

          E !0

          1. Boolean(0)=> false
          2. !false=> true

          Tips:

          在==比較時遵循以下原則

          1. 如果有一個操作數是布爾值,則在比較相等性之前,將其轉換為數值;
          
          2. 如果一個操作數是字符串,另一個操作數是數值,在比較之前先將字符串轉換為數值;
          
          3. 如果一個操作數是對象,另一個操作數不是,則調用對象的 valueOf() 方法,用得到的基本類型值按照前面的規則進行比較;
          
          4. 如果有一個操作數是 NaN,無論另一個操作數是什么,相等操作符都返回 false;
          
          5. 如果兩個操作數都是對象,則比較它們是不是同一個對象。如果指向同一個對象,則相等操作符返回 true;
          
          6. 在比較相等性之前,不能將 null 和 undefined 轉成其他值。
          
          7. null 和 undefined 是相等的。
          

          2.以下哪些事件會在頁面加載完成(onload)之前觸發?

          A readystatechange

          B pageshow

          C beforeunload

          D DOMContentLoaded

          點擊查看答案

          答案:A D

          點擊查看涉及到的知識點

          1.渲染過程

          解析

          A readystatechange

          document有個readyState屬性來描述document的狀態,當readyState發生變化時會觸發readystatechange事件。

          loading:文檔加載中

          interactive:文檔加載完畢,此時同樣會觸發DOMContentLoaded事件

          complete:文檔以及所引入的圖片等資源加載完畢,此時同樣會觸發load事件

          B pageshow

          當load事件觸發完畢后會觸發pageshow事件

          C beforeunload

          當dom卸載時會觸發,瀏覽器刷新頁面、跳轉頁面、關閉頁面時會觸發。

          D DOMContentLoaded

          當dom解析完畢,同步js、css加載完畢時觸發,會早于load事件。

          Tips

          頁面加載渲染簡易流程

          html解析為DOM,css解析為CSSOM,合并css與dom生成渲染樹,布局,并進行渲染

          1.瀏覽器請求html

          2.瀏覽器獲取到html

          3.瀏覽器解析html

          4.解析到head標簽,如果同步js則停止dom解析(等待js下載完畢并執行后繼續dom解析),如果是css則不影響dom繼續解析(但是影響dom渲染)。

          5.進入body標簽

          1. 如果只有dom則解析dom,同css樹合并為渲染樹,進行渲染。
          2. 如果有外鏈js,如果是同步js則下載并執行js,此時dom暫停解析,等待js執行完畢后繼續解析,解析后生成dom樹,并渲染。
          3. 如果有js也有css引入,同步js阻塞dom解析,dom等待js下載執行完,dom解析完畢后還需要等待css下載完成,然后dom與cssom合并為渲染樹然后渲染。 6.當dom解析完畢

          Tips:

          瀏覽器遇到通過src引入外部js時,會先渲染已解析的dom

          例:

          
          引入外部js, 遇到script src時會先渲染已解析的dom
          
          test.js
          
          var i = 1000000000
          while(i>0){
              i--
          }
          console.log("解析完成")
          
          html
          
          <h1>Hello</h1>
          <script type="text/javascript" src="test.js"></script>
          <h1>world</h1>
          
          執行時,頁面會先顯示Hello,等幾秒后會顯示world
          
          
          頁面內寫的js會阻塞dom解析與渲染
          <h1>Hello</h1>
          <script type="text/javascript">
           var i = 1000000000
           while(i>0){
               i--
           }
           console.log("解析完成")
          </script>
          <h1>world</h1>
          
          js執行完后才會顯示 Hello world
          

          3.關于這段代碼正確的結論是:()

          var F=function(){};
          
          Object.prototype.a=function(){};
          
          Function.prototype.b=function(){};
          
          var f=new F();
          

          A f能取到a,但取不到b

          B f能取到a,b

          C F能取到b,不能取到a

          D F能取到a,不能取到b

          點擊查看答案

          答案:A

          點擊查看涉及到的知識點

          1.原型

          解析

          一. f能訪問那些

          1. f__proto__指向的是F構造函數的prototype。
          2. 屬性查找是通過原型鏈查找的。
          3. f.__proto__=F.prototype ,F.prototype.__proto__=Object.prototype,Object.prototype.__proto__=null。
          4. f可以獲取到a

          二. F能訪問那些

          1. F.proto=Function.prototype。所以F能訪問到b
          2. Function.prototype.proto=Object.prototype。所以F能訪問a。
          3. 結論,F能訪問a跟b。

          4.以下結果里,返回 false 的是?

          A []==true

          B !![]

          C NaN==NaN

          D null==undefined

          點擊查看答案

          答案:A C

          點擊查看涉及到的知識點

          1.隱式類型轉換

          解析:

          A []==true

          如果有一個操作數是布爾值,則在比較相等性之前,將其轉換為數值;

          1. []==Number(true)=> []==1
          2. [].toString()==1=> ''==1
          3. Number('')==1=> 0==1
          4. false

          B !![]

          1. Boolean([])=> true
          2. !true=> false
          3. !false=> true

          C NaN==NaN

          如果有一個操作數是 NaN,無論另一個操作數是什么,相等操作符都返回 false;

          1. false

          D null==undefined

          null 和 undefined 是相等的。

          1. true

          5.下面的代碼將返回:

          Number(null);

          A Null

          B 0

          C undefined

          D 1

          點擊查看答案

          答案:B

          點擊查看涉及到的知識點

          1.Number函數的用法

          解析:

          1. Number(null)=> 0
          2. Number(undefined)=> NaN
          3. Number(123a)=> NaN

          6.假設有如下代碼,那么a(10)的返回結果是?( )

          function a(a)
          {
            a^=(1<<4)-1;
             return a;
          }
          

          A 5

          B 10

          C 15

          D 16

          點擊查看答案

          答案:A

          點擊查看涉及到的知識點

          1.二進制轉換

          2.左移運算符

          3.異或運算符

          解析:

          涉及到異或、二進制轉換、

          1. a^=(1<<4)-1=> a=a ^ ((1<<4) -1);
          2. 帶入參數 a=10 ^((1<<4) -1);
          3. ((1<<4) -1) 1<<<4 轉換為二進制 1000010000 轉換為十進制=> 2?=> 16((1<<4) -1)=> 15
          4. 10 ^ 15 10轉化為二進制=> 101015轉化為二進制=> 111110^15=> 101101=>轉化為10進制 22+1=> 5
          5. 返回5

          Tips:

          二進制轉換為十進制:

          除二取余,然后倒序排列,高位補零 例:

          10轉化為2進制
          1.  10%2 = 0
          2.  5%2  = 1
          3.  2%2  = 0
          4.  1    = 1
          
          倒序排列:
          1010  
          

          7.假設val已經聲明,可定義為任何值。則下面js代碼有可能輸出的結果為:

          console.log('Value is ' + (val != '0') ? 'define' : 'undefine');
          

          A Value is define

          B Value is undefine

          C define

          D undefine

          E Value is define 或者 Value is undefine

          F define 或者 undefine

          G 其它選項都有可能

          點擊查看答案

          答案:C

          點擊查看涉及到的知識點

          1.運算符優先級

          解析: 考察運算符優先級,+優先級高于三目運算,上面代碼等價于

          ('Value is ' + (val != '0')) ? 'define' : 'undefine'
          

          8.運行以下程序,y和z的最終結果為:

          <script> 
              var m= 1, j = k = 0; 
              function add(n) { 
                  return n = n+1; 
            } 
              y = add(m); 
              function add(n) { 
                  return n = n + 3; 
              } 
          z = add(m); 
          </script> 
          

          A 2,4

          B 4,4

          C 2,2

          D 報異常

          點擊查看答案

          答案:B

          點擊查看涉及到的知識點

          1.函數提升

          2.值傳遞

          解析:

          1. 同名函數會相互覆蓋,由于函數存在函數提升,后定義的函數會覆蓋之前定義的函數,所以y,z調用的都是第二個add函數。
          2. 傳入函數的m因為是基本類型,在函數內修改不會影響外部的變量

          結尾:

          在錯題中尋找自己的知識薄弱點,鞏固并完善自己的知識體系,建議收藏,經??纯?,避免遺忘~

          :點擊上方"藍色字體"↑ 可以訂閱噢!

          1.對WEB標準以及W3C的理解與認識

          標簽閉合、標簽小寫、不亂嵌套、提高搜索機器人搜索幾率、使用外鏈css和js腳本、結構行為表現的分離、文件下載與頁面速度更快、內容能 被更多的用戶所訪問、內容能被更廣泛的設備所訪問、更少的代碼和組件,容易維護、改版方便,不需要變動頁面內容、提供打印版本而不需要復制內容、提高網站 易用性;

          2.xhtml和html有什么區別

          HTML是一種基本的WEB網頁設計語言,XHTML是一個基于XML的置標語言

          最主要的不同:

          XHTML 元素必須被正確地嵌套。

          XHTML 元素必須被關閉。

          標簽名必須用小寫字母。

          XHTML 文檔必須擁有根元素。

          3.Doctype? 嚴格模式與混雜模式-如何觸發這兩種模式,區分它們有何意義?

          用于聲明文檔使用那種規范(html/Xhtml)一般為 嚴格 過度 基于框架的html文檔

          加入XMl聲明可觸發,解析方式更改為IE5.5 擁有IE5.5的bug

          4.行內元素有哪些?塊級元素有哪些?CSS的盒模型?

          塊級元素:div p h1 h2 h3 h4 form ul

          行內元素: a b br i span input select

          Css盒模型:內容,border ,margin,padding

          5.CSS引入的方式有哪些? link和@import的區別是?

          內聯 內嵌 外鏈 導入

          區別 :同時加載

          前者無兼容性,后者CSS2.1以下瀏覽器不支持

          Link 支持使用javascript改變樣式,后者不可

          6.CSS選擇符有哪些?哪些屬性可以繼承?優先級算法如何計算?內聯和important哪個優先級高?

          標簽選擇符 類選擇符 id選擇符

          繼承不如指定 Id>class>標簽選擇

          后者優先級高

          7.前端頁面有哪三層構成,分別是什么?作用是什么?

          結構層 Html 表示層 CSS 行為層 js

          8.css的基本語句構成是?

          選擇器{屬性1:值1;屬性2:值2;……}

          9.你做的頁面在哪些流覽器測試過?這些瀏覽器的內核分別是什么?

          Ie(Ie內核) 火狐(Gecko) 谷歌(webkit) opear(Presto)

          10.寫出幾種IE6 BUG的解決方法

          1.雙邊距BUG float引起的 使用display

          2.3像素問題 使用float引起的 使用dislpay:inline -3px

          3.超鏈接hover 點擊后失效 使用正確的書寫順序 link visited hover active

          4.Ie z-index問題 給父級添加position:relative

          5.Png 透明 使用js代碼 改

          6.Min-height 最小高度 !Important 解決’

          7.select 在ie6下遮蓋 使用iframe嵌套

          8.為什么沒有辦法定義1px左右的寬度容器(IE6默認的行高造成的,使用over:hidden,zoom:0.08 line-height:1px)

          9.ie 6 不支持!important

          11.img標簽上title與alt屬性的區別是什么?

          Alt 當圖片不顯示是 用文字代表。

          Title 為該屬性提供信息

          12.描述css reset的作用和用途。

          Reset重置瀏覽器的css默認屬性 瀏覽器的品種不同,樣式不同,然后重置,讓他們統一

          13.解釋css sprites,如何使用。

          Css 精靈 把一堆小的圖片整合到一張大的圖片上,減輕服務器對圖片的請求數量

          14.瀏覽器標準模式和怪異模式之間的區別是什么?

          盒子模型 渲染模式的不同

          使用 window.top.document.compatMode 可顯示為什么模式

          15.你如何對網站的文件和資源進行優化?期待的解決方案包括:

          文件合并

          文件最小化/文件壓縮

          使用CDN托管

          緩存的使用

          16.什么是語義化的HTML?

          直觀的認識標簽 對于搜索引擎的抓取有好處

          17.清除浮動的幾種方式,各自的優缺點

          1.使用空標簽清除浮動 clear:both(理論上能清除任何標簽,,,增加無意義的標簽)

          2.使用overflow:auto(空標簽元素清除浮動而不得不增加無意代碼的弊端,,使用zoom:1用于兼容IE)

          3.使用afert偽元素清除浮動(用于非IE瀏覽器)

          18.css hack

          <!--[if IE 6]--><![end if]-->

          _marging \IE 6

          +margin \IE 7

          Marging:0 auto 所有Ie

          Margin >Margin \0 \\IE 8< \IE 8

          想認識志同道合的朋友一起學習web

          加入我們的學習QQ群 190166743

          豐富的學習資源,周一到周四免費直播公開課

          長按圖片,識別二維碼即可入群

          你可能感興趣的精彩內容

          長按關注:《UI設計自學平臺》


          主站蜘蛛池模板: 国产精品香蕉一区二区三区| 99久久无码一区人妻a黑| 亚洲丰满熟女一区二区v| 国产精品一区在线观看你懂的| 日本韩国黄色一区二区三区 | 亚洲AV无码一区二区三区鸳鸯影院 | 精品国产亚洲一区二区三区在线观看| 中文字幕一区二区三区视频在线| 日韩免费一区二区三区在线播放| 午夜福利一区二区三区在线观看| 精品国产一区二区三区AV性色| 成人精品一区二区三区校园激情| 亚洲电影一区二区| 一区二区三区久久精品| 精品一区二区三区影院在线午夜 | 无码毛片一区二区三区中文字幕| 国内自拍视频一区二区三区| 3D动漫精品一区二区三区| 日韩亚洲AV无码一区二区不卡| 久草新视频一区二区三区| 亚洲国产精品一区二区第一页| 国产精品亚洲不卡一区二区三区| 国产人妖视频一区二区破除| 日韩精品一区在线| 黑人一区二区三区中文字幕| 无码毛片一区二区三区中文字幕| 亚洲国产一区二区三区| 久久久久女教师免费一区| av在线亚洲欧洲日产一区二区| 国产精品区AV一区二区| 亚洲日韩精品一区二区三区无码| 国产精品va无码一区二区| 亚洲一区免费观看| 97精品一区二区视频在线观看| 亚洲一区二区三区国产精华液| 女人18毛片a级毛片一区二区| 日韩视频在线观看一区二区| 任你躁国产自任一区二区三区 | 国产在线观看一区二区三区| 一区二区三区精品高清视频免费在线播放 | 国产AV一区二区三区传媒|