最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

小程序安全指南之如何禁止外部直接跳轉(zhuǎn)到小程序某頁面

 更新時間:2022年09月03日 09:32:41   作者:HullQin  
由于小程序跳轉(zhuǎn)的對象比較多,各自的規(guī)則又不一樣,因此小程序跳轉(zhuǎn)外部鏈接是用戶咨詢較多的問題之一,下面這篇文章主要給大家介紹了關于小程序安全指南之如何禁止外部直接跳轉(zhuǎn)到小程序某頁面的相關資料,需要的朋友可以參考下

背景

小程序也需要注意安全性。例如某些頁面是業(yè)務流程中的「第二步」、「第三步」,而非「第一步」。如果外部小程序、外部二維碼、鏈接直接跳轉(zhuǎn)到了我們小程序的「第二步」、「第三步」,可能有超出預期的事情發(fā)生。

針對外部跳轉(zhuǎn)到小程序「第二步」、「第三步」頁面的,我們應該攔截掉,要么直接報錯:頁面來源非法,要么直接跳回首頁。

關鍵問題在于,這種邏輯該怎么實現(xiàn)最優(yōu)雅呢?

一種不是很好的解決方案

如果你的業(yè)務流程采用了狀態(tài)機模型,并在后端存儲了狀態(tài),那么可以在每一個頁面onLoad時,發(fā)送一個API請求,判斷當前狀態(tài)和當前頁面是否匹配,如果匹配,則正常訪問,如果不匹配,則跳回到狀態(tài)對應的頁面。

這依賴于后端實現(xiàn),不太合適。

更好的解決方案

我們考慮純前端的實現(xiàn)。

問題關鍵在于:我們要禁止外部直接跳轉(zhuǎn)到我們小程序的部分頁面。我們需要要區(qū)分:內(nèi)部跳轉(zhuǎn)、外部跳轉(zhuǎn)。

這部分頁面,只允許通過內(nèi)部跳轉(zhuǎn)API(wx.redirectTo、wx.navigateTo)來跳轉(zhuǎn),其它方式都不應跳轉(zhuǎn)到。

只要我們在調(diào)用wx.redirectTo、wx.navigateTo時,都加上一個特殊參數(shù)。然后在頁面的onLoad里面判斷,是否包含了該特殊參數(shù),包含該特殊參數(shù),表明是內(nèi)部跳轉(zhuǎn),不包含該特殊參數(shù),表明是外部跳轉(zhuǎn)。

這個特殊參數(shù)不可以被猜到,如果被猜到了,那么外部跳轉(zhuǎn)時帶上特殊參數(shù),該方案就失效了。

所以,這個特殊參數(shù)必須不是固定的,要是隨機的。

我們可以參考WEB中針對CSRF的解決方案,如果使用隨機的特殊參數(shù),讓外部無法猜到這個特殊參數(shù),那么問題就解決了。

特殊參數(shù)什么時候生成呢?可以在App onLaunch時生成,也可以在「第一步」頁面onLoad時生成。不過不論怎樣,這個特殊參數(shù)都需要作為全局變量保存在內(nèi)存中,方便隨時引用和判斷。

具體怎么做?建議你先閱讀下文章:《如何全局重寫小程序 Page函數(shù) wx對象?》,學會這種方法,我們再來看下方的代碼。

全局改寫Page的onLoad生命周期,增加校驗

const WHITE_LIST = ['pages/index'];

function onLoadProxy(onLoad) {
  return function (query) {
    const app = getApp();
    // 以下是token攔截邏輯:
    if (WHITE_LIST.includes(this.route)) {
      // 在允許外部跳轉(zhuǎn)來的白名單頁面,生成隨機數(shù)validEntranceToken
      app.validEntranceToken = `${new Date().getTime()}${Math.random().toString(36)}`;
    } else if (query.validEntranceToken !== app.validEntranceToken) {
      // 其它頁面,校驗參數(shù)token是否與全局變量中token一致,若不一致,跳轉(zhuǎn)到報錯頁面
      wx.redirectTo({ url: `/pages/fail` });
      return;
    }
    // 未被攔截,表明是正常來源。以下是正常流程:
    if (onLoad) {
      return onLoad.call(this, query);
    }
  };
}

const PageProxy = (Page) => function (options) {
  const newOptions = {
    ...options,
    onLoad: onLoadProxy(options.onLoad),
  };
  Page(newOptions);
};

Page = PageProxy(Page);

全局改寫wx.navigateTo方法,附帶參數(shù)

function addValidEntranceToken(url) {
  const app = getApp();
  const symbol = url.includes('?') ? '&' : '?';
  return `${url}${symbol}validEntranceToken=${app.validEntranceToken}`;
}

export function redirectToProxy(redirectTo) {
  return function (object) {
    return redirectTo({
      ...object,
      url: addValidEntranceToken(object.url),
    });
  };
}

function wxProxy(wx) {
  const newWx = { ...wx };
  newWx.navigateTo = redirectToProxy(wx.navigateTo);
  newWx.redirectTo = redirectToProxy(wx.redirectTo);
  return newWx;
}

wx = wxProxy(wx);

解釋

我們通過修改所有Page的onLoad方法,當用戶訪問「白名單」頁面時,不會做任何攔截,而是直接生成一個隨機的validEntranceToken。當用戶訪問「白名單」以外的頁面時,則會判斷參數(shù)中是否包含正確的validEntranceToken,若不包含,則會跳轉(zhuǎn)到報錯頁。若包含,則繼續(xù)執(zhí)行該頁面的其它邏輯。

此外,我們還修改了原生的wx.navigateTowx.redirectTo,當我們做內(nèi)部跳轉(zhuǎn)時,會自動帶上剛才提到的參數(shù)validEntranceToken。

做好這些事情后,開發(fā)時,無需關心細節(jié)(意思是這套邏輯針對業(yè)務代碼是0侵入的),只需要關注「白名單」頁面有哪些即可??芍^是最優(yōu)雅的方案了。

總結(jié)

到此這篇關于小程序安全指南之如何禁止外部直接跳轉(zhuǎn)到小程序某頁面的文章就介紹到這了,更多相關小程序禁止外部直接跳轉(zhuǎn)某頁面內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • UniApp使用manifest.json應用配置的超詳細教學

    UniApp使用manifest.json應用配置的超詳細教學

    這篇文章主要給大家介紹了關于uni-app應用配置manifest.json最全最詳細配置,manifest.json文件是應用的配置文件,用于指定應用的名稱、圖標、權限等,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2024-01-01
  • JavaScript引用類型和基本類型詳解

    JavaScript引用類型和基本類型詳解

    這篇文章主要介紹了JavaScript引用類型和基本類型詳解的相關資料,需要的朋友可以參考下
    2016-01-01
  • JS、jQuery中select的用法詳解

    JS、jQuery中select的用法詳解

    這篇文章主要介紹了JS、jQuery中select的用法詳解的相關資料,需要的朋友可以參考下
    2016-04-04
  • JavaScript的詞法結(jié)構(gòu)精華篇

    JavaScript的詞法結(jié)構(gòu)精華篇

    今天小編就為大家分享一篇關于JavaScript的詞法結(jié)構(gòu)精華篇,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2018-10-10
  • JavaScript30 一個月純 JS 挑戰(zhàn)中文指南(英文全集)

    JavaScript30 一個月純 JS 挑戰(zhàn)中文指南(英文全集)

    JavaScirpt30 是 Wes Bos 推出的一個 30 天挑戰(zhàn)。項目免費提供了 30 個視頻教程、30 個挑戰(zhàn)的起始文檔和 30 個挑戰(zhàn)解決方案源代碼。目的是幫助人們用純 JavaScript 來寫東西,不借助框架和庫,也不使用編譯器和引用
    2017-07-07
  • JavaScript實現(xiàn)256色轉(zhuǎn)灰度圖

    JavaScript實現(xiàn)256色轉(zhuǎn)灰度圖

    本文主要介紹了JavaScript實現(xiàn)256色轉(zhuǎn)灰度圖的示例代碼,具有很好的參考價值,下面跟著小編一起來看下吧
    2017-02-02
  • 微信小程序?qū)崿F(xiàn)頁面下拉刷新和上拉加載功能詳解

    微信小程序?qū)崿F(xiàn)頁面下拉刷新和上拉加載功能詳解

    這篇文章主要介紹了微信小程序?qū)崿F(xiàn)頁面下拉刷新和上拉加載功能,結(jié)合實例形式分析了微信小程序頁面下拉刷新和上拉加載相關事件監(jiān)聽與功能實現(xiàn)操作技巧,需要的朋友可以參考下
    2018-12-12
  • 基于js中的原型、繼承的一些想法

    基于js中的原型、繼承的一些想法

    下面小編就為大家?guī)硪黄趈s中的原型、繼承的一些想法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-08-08
  • JavaScript中if嵌套assert的方法詳解

    JavaScript中if嵌套assert的方法詳解

    在JavaScript中,通常我們不會直接使用`assert`這個詞,因為JavaScript標準庫中并沒有直接提供`assert`函數(shù),下面是一個詳細的示例,展示如何在JavaScript中模擬`assert`函數(shù),并在`if`語句中嵌套使用它來檢查條件,需要的朋友可以參考下
    2024-09-09
  • webpack多入口多出口的實現(xiàn)方法

    webpack多入口多出口的實現(xiàn)方法

    這篇文章主要介紹了webpack多入口多出口的實現(xiàn)方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-08-08

最新評論

孝义市| 墨江| 蓝山县| 海丰县| 宁城县| 五华县| 吉首市| 大姚县| 涞源县| 扬中市| 湖北省| 梁平县| 正宁县| 介休市| 原平市| 上虞市| 灌云县| 万年县| 永顺县| 庆安县| 潜山县| 日照市| 双流县| 陆良县| 平乐县| 桃江县| 开封市| 荥阳市| 铜川市| 宾阳县| 黄梅县| 长汀县| 大田县| 齐齐哈尔市| 莱芜市| 迭部县| 太康县| 赣榆县| 襄樊市| 深水埗区| 盐池县|