整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

vue2本地开发环境正常,生产环境下this.$ro

vue2本地开发环境正常,生产环境下this.$router.push()不跳转

果在Vue.js 2中在本地开发环境下正常运行,但在生产环境下使用?this.$router.push({ name: 'login' })??不起作用,可能有几个原因需要检查和解决:

  1. 路由配置问题: 确保你的路由配置正确,特别是确保在生产环境中,路由的配置和本地开发环境一致。检查是否正确设置了name为'login'的路由。
// 示例路由配置
const routes=[
  {
    path: '/login',
    name: 'login',
    component: LoginComponent,
  },
  // 其他路由配置...
];
  1. 路由模式问题: Vue Router 默认使用哈希模式(mode: 'hash'),但在生产环境中,你可能想要使用历史模式(mode: 'history')。确保在生产环境下也设置了相同的路由模式。
// 路由配置中设置 mode
const router=new VueRouter({
  mode: 'history',
  routes,
});
  1. 路由实例问题: 确保在你调用this.$router.push({ name: 'login' })之前,this.$router是一个有效的路由实例。你可以在控制台中输出this.$router,确保它不是undefinednull
  2. 路由守卫问题: 如果有使用路由守卫(如beforeEach),确保它们没有阻止或重定向到其他地方,导致this.$router.push({ name: 'login' })无法正常执行。
  3. Webpack 配置问题: 如果你使用了Webpack等构建工具,确保在生产环境中的构建配置中没有引起问题的地方,例如资源路径的配置等。
  4. 浏览器缓存问题: 有时浏览器可能会缓存旧的 JavaScript 文件。尝试清除浏览器缓存或使用不同的浏览器进行测试。

在检查和解决以上可能的问题之后,你应该能够在生产环境中成功执行??this.$router.push({ name: 'login' })??。如果问题仍然存在,请检查浏览器的开发者工具(控制台、网络面板等),查看是否有任何错误消息。

篇,你可以学到Ember页面的创建,并且在不同的页面之间跳转。新建两个页面,一个是创建about页面,一个是创建contact页面。


看完本篇你将学到如下知识点:

  • 定义路由
  • 使用路由模板
  • 自定义路由URL
  • 使用<LinkTo>组件在不同模板之间跳转
  • 组件之间传递参数、属性


定义路由

在前一篇,我们定义了一个index.hbs首页,接着继续在templates下面创建新的页面。

首先通过Ember CLI创建一个路由,

ember g route about

本机创建日志:

ubuntuvim at ubuntuvim-mbp.local in [~/code/super-rentals]  on git:master ?  9b5a1ac "Initial Commit from Ember CLI v3.18.0"

23:22:20 ? ember g route about

installing route

  create app/routes/about.js

  create app/templates/about.hbs

updating router

  add route about

installing route-test

  create tests/unit/routes/about-test.js

题外话:

ubuntuvim at ubuntuvim-mbp.local in [~/code/super-rentals] on git:master ? 9b5a1ac "Initial Commit from Ember CLI v3.18.0"

23:22:20 ?

这一段是我本机命令行自动前缀,如果你的命令行安装过zsh这个工具,就会很熟悉,zsh是一个非常强大而且漂亮的命令行工具。

打开router.js,可以看到自动创建了一个路由this.route('about');


使用路由模板

修改about路由模板文件app/templates/about.hbs,在文件内添加一下HTML内容。

{{!-- app/templates/about.hbs --}}

<div class="jumbo">
  <div class="right tomster"></div>
  <h2>About Super Rentals</h2>
  <p>
    The Super Rentals website is a delightful project created to explore Ember.
    By building a property rental site, we can simultaneously imagine traveling
    AND building Ember applications.
  </p>
</div>

浏览器访问验证:http://localhost:4200/about。可以看到about页面的内容


使用同样的方式创建contact路由。

ubuntuvim at ubuntuvim-mbp.local in [~/code/super-rentals]  on git:master ?  9b5a1ac "Initial Commit from Ember CLI v3.18.0"

23:22:37 ? ember g route contact

installing route

  create app/routes/contact.js

  create app/templates/contact.hbs

updating router

  add route contact

installing route-test

  create tests/unit/routes/contact-test.js

在contact.hbs添加一些HTML内容。

{{!-- app/templates/contact.hbs --}}
<div class="jumbo">
  <div class="right tomster"></div>
  <h2>Contact Us</h2>
  <p>
    Super Rentals Representatives would love to help you<br>
    choose a destination or answer any questions you may have.
  </p>
  <address>
    Super Rentals HQ
    <p>
      1212 Test Address Avenue<br>
      Testington, OR 97233
    </p>
    <a href="tel:503.555.1212">+1 (503) 555-1212</a><br>
    <a href="mailto:superrentalsrep@emberjs.com">superrentalsrep@emberjs.com</a>
  </address>
</div>

浏览器访问验证:http://localhost:4200/contact。可以看到contact页面的内容


contact1.png


自定义路由URL

前面已经定义了两个页面,一个是about一个是contact。默认情况下访问的路径都是和路由同名的,另外Ember提供了非常灵活的扩展,你可以自定义的路由的访问路径,比如下面的代码,把contact路由的访问路径改为getting-in-touch,手动修改router.js文件。

Router.map(function() {
  this.route('about');
  this.route('contact', { path: '/getting-in-touch' });
});

注意看第三行,使用path属性指定这个路由的访问路径为getting-in-touch

现在你在访问http://localhost:4200/contact就会发现报错了,提示找不到这个路由了。


contact2.png

再访问http://localhost:4200/getting-in-touch。可以看到页面的内容就是之前contact的内容。


contact3.png


使用<LinkTo>组件在不同模板之间跳转

<LinkTo>是Ember提供好的组件,用于在不同模板之间跳转,其作用类似于HTML标签中的<a>标签。

为何不直接用<a>标签而是要自定义一个跳转的组件呢??因为使用普通的<a>标签,当你点击链接的时候会发送浏览器的刷新,但是Ember是单页应用不需要刷新整个页面,只要是实现页面的跳转即可(所谓的跳转其实就是实现不同的路由之间的切换,并且不会刷新页面)。

继续改造前面的创建的index,about和contact。分别在这两个模板页面中添加一个跳转的链接。


{{!-- index.hbs是 "/" 这个路径默认的页面。 --}}

<div class="jumbo">
  <div class="right tomster"></div>
  <h2>Welcome to Super Rentals!</h2>
  <p>We hope you find exactly what you're looking for in a place to stay.</p>
  
  {{!-- 使用LinkTo组件添加一个跳转按钮,并且指定调整到的路由是about,也就是说当用户点击这按钮的时候会跳转到about这个子页面上 --}}
  <LinkTo @route="about" class="button">About Us</LinkTo>
  

  
  <a href="/about" class="button">About Us With A Tag</a>
</div>


index5.png

点击“About Us”这个按钮,然后看浏览器的地址栏,可以看到自动转到about这个路由下,并且页面不会刷新。为了验证前面所说的效果,我在About Us后面添加了一个<a>标签按钮,当你点击这个链接的时候会看到浏览器自动刷新了,并且也跳转到about页面上。


index6.png


继续改造about和contact,分别添加跳转按钮。

{{!-- app/templates/about.hbs --}}
<div class="jumbo">
  <div class="right tomster"></div>
  <h2>About Super Rentals</h2>
  <p>
    The Super Rentals website is a delightful project created to explore Ember.
    By building a property rental site, we can simultaneously imagine traveling
    AND building Ember applications.
  </p>
  
  <LinkTo @route="contact" class="button">Contact Us</LinkTo>
  {{!-- 增加一个跳转回到首页的链接 --}}
  <LinkTo @route="index" class="button">Index</LinkTo>
</div>
{{!-- app/templates/contact.hbs --}}
<div class="jumbo">
  <div class="right tomster"></div>
  <h2>Contact Us</h2>
  <p>
    Super Rentals Representatives would love to help you<br>
    choose a destination or answer any questions you may have.
  </p>
  <address>
    Super Rentals HQ
    <p>
      1212 Test Address Avenue<br>
      Testington, OR 97233
    </p>
    <a href="tel:503.555.1212">+1 (503) 555-1212</a><br>
    <a href="mailto:superrentalsrep@emberjs.com">superrentalsrep@emberjs.com</a>
  </address>
  
  <LinkTo @route="about" class="button">About</LinkTo>
  {{!-- 增加一个跳转回到首页的链接 --}}
  <LinkTo @route="index" class="button">Index</LinkTo>
</div>

在about和contact两个页面添加了两个跳转按钮,一个是about和contact页面的相互跳转,一个是跳转回首页的按钮。


about3.png


contact4.png


通过前面的这三个页面,相信你很容易就可以掌握<LinkTo>组件的使用。其中@route属性指定的是你定义的路由名字,这个路由的名字要和router.js里面的定义的完全一致,否则会找不到。另外需要注意的是@route属性的值一定是路由的名字而不是URL的名字,比如contact路由,这个路由的路由名是contact而不是访问的getting-in-touch。

另外在<LinkTo>组件上可以使用普通的HTML属性,比如上面使用的class属性,这个class属性就是普通HTML属性,用于指定CSS样式的。在Ember应用中,通过@符号区别是普通的HTML属性还是Ember提供的属性,比如上面使用的@route就是Ember提供的属性。

在底层,<LinkTo>组件会为我们生成一个常规的<a>标签,并带有针对特定路由的href。通过Ember生成的这个<a>标签对于用户来说非常友好,无需页面刷新就可以实现跳转。 简单讲,当单击这些特殊链接之一时,Ember将拦截该单击,呈现新页面的内容,并更新URL(所有这些操作均在本地执行,而无需等待服务器),从而避免刷新整个页面。

家对URL任意跳转都肯定了解,也知道他的危害,这里我就不细说了,过~

大家遇到的肯定都是很多基于这样的跳转格式

http://www.xxx.xxx/xxx?xxx=http://www.xxx.xxx/xxxxx

基本的思路大家就是直接替换后面的URL来检测是否存在任意URL跳转,如果不存在,就直接返回到它自己的域名,如果存在,就跳转到你指定的URL,

这里我讲述我所知道的所有小点。

0x01 利用问号绕过限制

利用问号,这是一个特性,利用问号可以成功绕过URL限制

比如:http://www.aaa.com/acb?Url=http://login.aaa.com 这是一个跳转链接,跳转到它的二级域名下,那么这个问号放哪里可以绕过呢?其实就是放到它自身的域名前面也就是你添加的想要跳转的域名的后面,如:http://www.aaa.com/acb?Url=http://test.com?login.aaa.com 那么,它其实是会跳转到这个test.com域名下,这个域名是我想要跳转的任意域名,而后面的它自身域名一定要带上,不带上就无法辅助用问号?这个特性来跳转到指定域名了,而跳转后,问号和问号后面的内容会变为这样:http://www.test.com/?login.aaa.com

0x02 利用反斜杠和正斜杠绕过限制

这个是我自己研究出来的,不知道是否网上有人说过。

比如:http://www.aaa.com/acb?Url=http://login.aaa.com/ 同样是在它本身域名前加上正斜杠,然后正斜杠前面跟上你想跳转的域名地址。

如:http://www.aaa.com/acb?Url=http://test.com/login.aaa.com

反斜杠有三种思路

两个反斜杠绕过方法

比如:http://www.aaa.com/acb?Url=http://login.aaa.com/ 同样是在它本身域名前加上两个反斜杠,然后两个反斜杠前面跟上你想跳转的域名地址。

如:http://www.aaa.com/acb?Url=http://test.com\login.aaa.com

一个反斜杠绕过方法

如:http://www.aaa.com/acb?Url=http://test.comlogin.aaa.com

另一种思路,一个反斜杠一个点

利用.这样的格式,也就是一个反斜杠加一个点来跳过限制,

如:http://www.aaa.com/acb?Url=http://test.com.login.aaa.com

0x03 利用@绕过URL限制

如果你用这方法在火狐里进行跳转,会有弹窗提示,在其它游览器则没有。

如:<a href=”http://www.aaa.com/acb?Url=http://login.aaa.com@test.com“”>http://www.aaa.com/acb?Url=http://login.aaa.com@test.com 后面的test.com就是要跳转到的域名,前面的域名都是用来辅助以绕过限制的。

0x04 利用白名单缺陷绕过限制

有的域名白名单限制是不全的,比如如果想利用一个跳转,而这个跳转是通用,在这个公司网站很多子域名等都可以跳转,那么你买个域名也不算贵对吧。

为什么这么说呢,这个问题就是白名单限制不当,比如,当跳转的域名包含这个网站下的所有域名,比如:http://www.aaa.com/acb?Url=http://login.aaa.com

这个login.aaa.com也可以改成aaa.com同样可以跳转对吧,因为白名单里只要有包含这个域名就直接成功跳转。

那么当我在这个域名前面加上如testaaa.com,白名单里会检查是否包含aaa.com这个域名,如果包含,就直接跳转,而并没有检查这个域名的整个信息,然后可以利用这个问题,直接注册一个testaaa.com这个域名就可以利用这个跳转。

0x05 多重验证&跳转绕过限制

现在很多网站都有多重验证,比如你登陆账户后会出现另一个验证页面,输入手机验证码进行验证,此时这上面的URL很可能存在任意跳转的问题。

多重跳转的问题导致可绕过URL限制

比如http://www.aaa.com/acb?Url=http: … ttp://login.aaa.com

当然,还有多重的,这个结构的多重跳转你修改最后面的URL就可以达到任意URL跳转,中间的URL就没必要动了。

0x06 点击触发达到绕过URL跳转限制

比如很多登陆页面的地方,其URL是一个跳转的URL

如:http://www.aaa.com/acb?Url=http://test.com

你直接修改了后面为任意URL,但是还是停留在原地,似乎没什么问题,但是,当你输入账号和密码后点击登陆按钮后,就会触发跳转。

当然,这个账户和密码不一定要对的,随便都可以,但得视系统而定吧。

这个我遇到了很多,比如你修改了域名,然后点击登陆,登陆成功后便可触发跳转,这也是一个比较隐蔽的绕过URL限制的跳转。

0x07 利用xip.io绕过

这个我还没有在测试中应用过,其请求是http://www.127.0.0.1.xip.io 这个绕过是在SSRF场景中的绕过,比如SSRF你要读取内网地址,一般都做了限制,可以尝试用这方法进行绕过限制,从而访问到内网。

另外一点,URL跳转涉及的安全问题大家常见的就是钓鱼,那么利用这个思路也可达成一个钓鱼问题,如,http://www.qq.com.220.181.57.217.xip.io

当你访问qq这个域名时,其实这个链接已经被解析到后面这个ip地址上了,那么实际访问的就是后面这个IP地址。

0x08 利用超链接绕过可信站点限制

比如一个URL,它是可以直接跳转的,但是一般测试跳转时大家习惯用www.baidu.com或qq.com这样的可信站点进行测试,但是有些网站是可以跳转这些网站的。

只要是可信站点且常用,基本都可以跳转,那么这就属于正常的业务逻辑了,难度就这样错失一个URL跳转漏洞了?

其实不然,只要你的URL被百度收录过,那么直接搜索你的域名,site:xxx.xxx

因为你在百度里点击你的域名,它会先是一个302跳转,而这个302跳转就是百度下的302跳转,那么这样就可以绕过可信站点的限制,从而达到跳转到指定URL。

当然,百度这个302有点长,你给它进行加密就行。

0x09 POST参数中的URL跳转

当然,这个影响就很小了,比如当你填什么表格或者需要填写什么的,当你上传图片,点击下一步的时候,通常下一步就是预览你填写的信息,最后才是提交。

当你上传了图片后点击下一步抓包,如果过滤不严,你会看到图片的完整地址包含在POST参数里,你就可以直接修改这个地址为任意URL,然后到达下一步。

这时是确定信息也就是预览自己填写的信息的正确还是不正确,由于你刚刚修改了图片地址,这里是没有显示出来的,图像会是一个小XX。

当点击图片右键选择查看图像时,就会触发URL跳转问题,其实这个也可以利用来进行钓鱼,钓后台审核员的信息。

为什么呢,比如审核看到图片无法加载,一般都会点击查看图片,然后跳转,如果安全意识不知就会造成安全影响。

当然,如果POST参数里就只是URL跳转参数,那么你可以给它转成GET方式,然后进行跳转就可以了,只要网站支持这样的GET方式就行。

在Burp Suite里可以一键转换提交方式,右键选择Change request method就可以!

0x10 利用#号绕过

如:http://www.aaa.com/acb?Url=http://test.com#login.aaa.com

小结,想找到任意URL跳转问题,就不要光看表面,一个修改一个回车,不存在就不继续深入了,这将永远无法成长。

我总结了我对于URL跳转绕过限制的一些小点,希望能够帮助到大家!

原文地址:http://blog.xbbai.site/post-150.html