-
2020-12-31 05:23:27
这段时间一直研究怎么才能在 webbrowser中设置referer来路来伪造来路进行刷流量,可是最后研究了半个月最终以失败告终,因为现在的统计代码,比较实际的就是cnzz.com和google adsense自带的统计,他们的统计都是通过js文件进行统计的,这样就形成了伪造来路的不成功,具体为什么不成功就让下面的一篇文章说明吧!
众所周知,服务器端的referer来路是可以伪造的,无论是ASP、PHP还是其他脚本都是可以伪造referer的,一些下载软件更是把referer伪造的惟妙惟肖,利用webbrowser控件可以方便的伪造来路。那么,作为保护网站的守门人,它如何防止这些伪造的referer呢?
这里,利用的是 Javascript 这一利器。
上面提到的伪造referer的方法都是通过服务器端的脚本来实现的,但它们并不能欺骗客户端。而JS是在客户端执行的,它并不会理会服务器端的headers信息,所以,利用js的 document.referer 方法可以准确地判断网页的真实来路。
几乎所有的第三方统计不约而同地采用了 document.referer 来判断来路,为什么?正是基于 js 下的 referer来路 是不可伪造的。即使在服务器端成功地伪造了referer的网页脚本,在第三方统计里也是无法被统计到的,原因正是由于这些三方统计采用了 document.referer 来判别真实的来路。
所以,为了对抗虚假的 referer 伪造信息,统计代码需要利用 js 的 document.referer 来判别,就可以将伪造的信息拒之门外
据目前所知,到目前为止,js下是无法伪造 referer 的。
那么有人问了,如果客户端把JAVASCRIPT脚步甚至cookies关闭了,你还怎么判断这个referer?其实答案也很简单,就是 js 和 asp/php 脚本之间通过 操作cookies 这个中间桥梁来实现,js里把这个referer写入cookies,asp/php读取这个cookies,如果读取不到这个cookies,则判断非本站来路。
更多相关内容 -
完美兼容各大浏览器获取HTTP_REFERER方法总结
2020-09-04 10:01:16发现一个关于浏览器兼容的问题,当用JS 执行代码 [removed].href=”http://www.jb51.net” 来进行跳转的时候,Firefox 可以获取到到HTTP_REFERER页面,但是在IE中这一项为空 -
ASP,PHP与.NET伪造HTTP-REFERER方法及防止伪造REFERER的方法
2020-10-30 15:51:01ASP,PHP与.NET伪造HTTP-REFERER方法及防止伪造REFERER的方法 -
python3 图片referer防盗链的实现方法
2020-09-20 17:18:25本篇文章主要介绍了python3 图片referer防盗链的实现方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧 -
H5微信支付webview设置referer无效问题总结
2018-02-10 22:37:17在接入H5微信支付时,如果是APP里调起H5支付,需要在webview中手动设置referer,如下 Map extraHeaders = new HashMap(); extraHeaders.put("Referer", "商户申请H5时提交的授权域名");//...最近在接入H5微信支付时遇到了一个比较坑的问题,所以写篇总结
问题描述
在接入H5微信支付时,如果是APP里调起H5支付,需要在webview中手动设置referer,如下
Map extraHeaders = new HashMap(); extraHeaders.put("Referer", "商户申请H5时提交的授权域名");//例如 http://www.baidu.com webView.loadUrl(targetUrl, extraHeaders);//targetUrl为微信下单地址
因为微信要验证请求来源,所以如果这个地方没有去设置的话,会跳转如下页面中
但是测试过程中发现一个兼容性问题:在4.4.4、4.4.3的设备上,下单时一直会跳转到上面的页面中。后来通过抓包发现设置的Referer没有生效。。。
解决方案
google了一大圈最终发现了一个靠谱的解决方案,就是利用loadDataWithBaseURL方法代替loadUrl方法,通过js去请求微信下单Url,loadDataWithBaseURL方法的具体描述如下
public void loadDataWithBaseURL(String baseUrl, String data, String mimeType, String encoding, String historyUrl)
data可以是Html代码片。baseUr为页面的基础Url,用来组织html中的相对路径。我们data这个参数中传入js代码片去请求微信下单Url,而baseUr设置为授权域名,这样请求微信下单Url时,referer自动会被设置为baseUrl(正常请求的referer默认就是请求的来源地址)
最终的代码如下
if (("4.4.3".equals(android.os.Build.VERSION.RELEASE)) || ("4.4.4".equals(android.os.Build.VERSION.RELEASE))) { //兼容这两个版本设置referer无效的问题 view.loadDataWithBaseURL("商户申请H5时提交的授权域名", "<script>window.location.href=\"" + targetUrl + "\";</script>", "text/html", "utf-8", null); } else { Map<String, String> extraHeaders = new HashMap<>(); extraHeaders.put("Referer", "商户申请H5时提交的授权域名"); view.loadUrl(targetUrl, extraHeaders); }
希望本文能帮助到遇到相同问题的程序员们
微信H5支付常见问题汇总
https://pay.weixin.qq.com/wiki/doc/api/H5.php?chapter=15_4
最后感谢提供本方案的大佬,他写的文章地址如下
https://www.jianshu.com/p/8e138577ec8e -
Android H5微信支付 webview设置referer 请求头无效问题解释和详细处理方案
2018-03-11 16:38:23Android H5微信支付(或H5视频链接)webview设置referer 请求头无效问题解释和详细处理方案(附源码) 本文说明 这次也是项目中所碰到的问题总结,这次是项目需要对接新的一套第三方微信H5支付。其实开始是很简单...Android H5微信支付(或H5视频链接)webview设置referer 请求头无效问题解释和详细处理方案(附源码)
本文说明
这次也是项目中所碰到的问题总结,这次是项目需要对接新的一套第三方微信H5支付。其实开始是很简单的只需要一个集合了所以必要参数后提交后台返回的支付链接再加上订单号就没有问题,不过由于特殊的ios 内购要求(对内购非常严)和对接情况都将按ios的来。对接流程
通常对接流程
前端提交必要参数到后台———-后台生成支付加密链接返回给前端———-前端可以拼接订单id调用微信H5(或者可以直接请求,有的需要提交在webview请求头) ———– 支付完成(回调成功失败)
按ios流程对接
前端提交必要参数到后台———-后台生成支付加密链接返回给前端———-前端需要使用webview请求 过程中需要在链接中添加请求头Referer ———– 支付完成(回调成功失败)
问题产生
问题背景
我们在配合第三方支付的技术时,对方表示必要参数是可以前端或者后台任意一个可以拼接的参数生成支付链接,但是提交到微信H5 则是后台表示无法执行的,由前端来做,那么问题就产生了。
IOS 在使用webView是有原生的方法的可以非常方便的将请求头添加到支付链接上,所以很快就解决了,而且没有任何兼容的问题。
Android 就不一样了,由于个人对webView没有过深入了解,所以当时还真不知道webView有添加请求头的方法,后来发现确实有这个方法。public void loadUrl(String url, Map<String, String> additionalHttpHeaders) { }
但是在使用过程中发现问题: 请求头没有添加上。
案发现场
案发现场还原一
上代码
import android.app.Activity; import android.content.Context; import android.graphics.Bitmap; import android.net.http.SslError; import android.os.Bundle; import android.support.annotation.Nullable; import android.support.v7.app.AppCompatActivity; import android.util.Log; import android.view.KeyEvent; import android.view.View; import android.view.ViewGroup; import android.webkit.SslErrorHandler; import android.webkit.WebResourceRequest; import android.webkit.WebResourceResponse; import android.webkit.WebSettings; import android.webkit.WebView; import android.webkit.WebViewClient; import com.achers.ascmake.R; import java.util.HashMap; import java.util.Map; /** * Create on 2018/3/8 14:42 * <p> * author lhm * <p> * Description: * <p> * Version: 1.2.3 */ public class WebChonzhiAcvitity extends AppCompatActivity { private Context context = this; private String url; private String initUrl;//不拼接UserID的URL private String title; private WebView mWebView; private boolean isFirstLoad = false; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.webchongzhi); //初始化 initView(); mWebView.setLayerType(View.LAYER_TYPE_HARDWARE, null); mWebView.setWebViewClient(new WebViewClient() { @Override public void onLoadResource(WebView view, String url) { super.onLoadResource(view, url); } @Override public void onReceivedHttpError(WebView view, WebResourceRequest request, WebResourceResponse errorResponse) { super.onReceivedHttpError(view, request, errorResponse); } @Override public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) { handler.proceed(); // 接受所有网站的证书 super.onReceivedSslError(view, handler, error); } @Override public boolean shouldOverrideUrlLoading(WebView view, String url1) { Map headers = new HashMap(); if (url1.contains("wx.tenpay.com")) { //wx.tenpay.com 收银台点击微信时,shouldOverrideUrlLoading会调用两次,这里是第二次 headers.put("Referer", "https://xxx.xxxx.cn");//第三方支付平台请求头 一般是对方固定 } else { //payh5.bbnpay if(!isFirstLoad){ //跳转到收银台 headers.put("Referer", "https://xxx.xxxx.cn");//商户申请H5时提交的授权域名 isFirstLoad = true; }else{ //收银台点击微信时,shouldOverrideUrlLoading会调用两次,这里是第一次 headers.put("Referer", "https://xxx.xxxx.cn");//第三方支付平台请求头 一般是对方固定 } } view.loadUrl(url1, headers); return true; } }); String Referer="https://xxx.xxxx.cn"; //需要添加到支付链接的请求头 String targetUrl="; //后台返回的支付链接 if (("4.4.3".equals(android.os.Build.VERSION.RELEASE)) || ("4.4.4".equals(android.os.Build.VERSION.RELEASE))) { //兼容这两个版本设置referer无效的问题 mWebView.loadDataWithBaseURL("https://xxx.xxxx.cn", "<script>window.location.href=\"" + targetUrl + "\";</script>", "text/html", "utf-8", null); } else { Map<String, String> extraHeaders = new HashMap<>(); extraHeaders.put("Referer", "https://xxx.xxxx.cn"); mWebView.loadUrl(targetUrl, extraHeaders); // } } @Override protected void onResume() { super.onResume(); mWebView.onResume(); } private void initView() { // TODO Auto-generated method stub // customViewContainer = (FrameLayout) mWebView = (WebView) findViewById(R.id.web); WebSettings webSettings = mWebView.getSettings(); mWebView.setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY); webSettings.setJavaScriptEnabled(true); webSettings.setDomStorageEnabled(true); webSettings.setAppCacheMaxSize(1024 * 1024 * 8); String appCachePath = context.getApplicationContext().getCacheDir() .getAbsolutePath(); webSettings.setAppCachePath(appCachePath); webSettings.setAllowFileAccess(true); webSettings.setAppCacheEnabled(true); } @Override protected void onPause() { super.onPause(); mWebView.onPause(); } @Override protected void onDestroy() { try { if (mWebView != null) { if (null != mWebView.getParent()) { ((ViewGroup) mWebView.getParent()).removeView(mWebView); } mWebView.removeAllViews(); mWebView.destroy(); } } catch (Exception e) { e.printStackTrace(); } super.onDestroy(); } }
结果
手机系统5.1
通过抓包发现 请求头并没有加上。
但是发现请求头在第一次的时候是加上了,但是被第二次重复加载的时候给默认覆盖了。关键就是在这段代码
@Override public boolean shouldOverrideUrlLoading(WebView view, String url1) { Map headers = new HashMap(); if (url1.contains("wx.tenpay.com")) { //wx.tenpay.com 收银台点击微信时,shouldOverrideUrlLoading会调用两次,这里是第二次 headers.put("Referer", "https://xxx.xxxx.cn");//第三方支付平台商请求头 一般是对方固定 } else { //payh5.bbnpay if(!isFirstLoad){ //跳转到收银台 headers.put("Referer", "https://xxx.xxxx.cn");//商户申请H5时提交的授权域名 isFirstLoad = true; }else{ //收银台点击微信时,shouldOverrideUrlLoading会调用两次,这里是第一次 headers.put("Referer", "https://xxx.xxxx.cn");//第三方支付平台商请求头 一般是对方固定 } } view.loadUrl(url1, headers); return true; }
这段代码也已经写得很清楚了,在与微信H5 交互的时候他这个shouldOverrideUrlLoading会调 用两次 所以第一次加上的请求头被第二次没加的请求头给默认覆盖了。
解决方法
初始化的时候就添加一次请求头,在调用shouldOverrideUrlLoading 再添加一次请求头
案发现场还原二
@Route(path = Path.PFWebView) public class PFWebViewActivity extends BaseBarActivity { @BindView(R.id.webView) WebView mWebView; @BindView(R.id.progressBar) ProgressBar pg; @Autowired Param param; private HashMap<String, String> stringStringHashMap; @Override public void initLayout() { setContentView(R.layout.activity_web_view); } @Override protected void initTitleBar() { } @Override protected void initData() { param.url="后台返回的支付链接"; stringStringHashMap = new HashMap<>(); stringStringHashMap.put("Referer", "https://shop.cp988.cn"); mWebView.loadUrl(param.url, stringStringHashMap); WebSettings webSettings = mWebView.getSettings(); webSettings.setJavaScriptEnabled(true);//支持javascript webSettings.setJavaScriptCanOpenWindowsAutomatically(true);//设置允许js弹出alert对话框 webSettings.setCacheMode(WebSettings.LOAD_NO_CACHE); //设置 缓存模式 webSettings.setUseWideViewPort(true);//扩大比例的缩放 webSettings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.SINGLE_COLUMN);//自适应屏幕 webSettings.setLoadWithOverviewMode(true); mWebView.requestFocus();//触摸焦点起作用 mWebView.setScrollBarStyle(WebView.SCROLLBARS_OUTSIDE_OVERLAY);//取消滚动条 //设置了Alert才会弹出,重新onJsAlert()方法return true可以自定义处理信息 mWebView.setWebChromeClient(new WebClient()); mWebView.setWebViewClient(new TheWebViewClient()); } class WebClient extends WebChromeClient { @Override public boolean onJsAlert(WebView view, String url, String message, JsResult result) { return true; } @Override public void onProgressChanged(WebView view, int i) { super.onProgressChanged(view, i); pg.setVisibility(i == 100 ? View.GONE : View.VISIBLE); pg.setProgress(i); } } boolean isFirstLoad = false; /** * 和H5的交互 */ class TheWebViewClient extends android.webkit.WebViewClient { @Override public boolean shouldOverrideUrlLoading(WebView view, String url1) { Map<String, String> headers = new HashMap<>(); if (url1.contains("wx.tenpay.com")) { //wx.tenpay.com 收银台点击微信时,shouldOverrideUrlLoading会调用两次,这里是第二次 headers.put("Referer", "https://xxx.xxxx.cn");//第三方支付平台商请求头 一般是对方固定 } else { //payh5.bbnpay if(!isFirstLoad){ //跳转到收银台 headers.put("Referer", "https://xxx.xxxx.cn");//商户申请H5时提交的授权域名 isFirstLoad = true; }else{ //收银台点击微信时,shouldOverrideUrlLoading会调用两次,这里是第一次 headers.put("Referer", "https://xxx.xxxx.cn");//第三方支付平台商请求头 一般是对方固定 } } UtilsLog.logger("shouldOverrideUrlLoading>>" + url1); view.loadUrl(url1, headers); return true; } @Override public void onPageStarted(WebView view, String url, Bitmap favicon) { showLoadingTransparent(); super.onPageStarted(view, url, favicon); UtilsLog.logger(url); } @Override public void onPageFinished(WebView view, String url) { disableLoadingTransparent(); super.onPageFinished(view, url); UtilsLog.logger(url); } @Override public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) { handler.proceed(); super.onReceivedSslError(view, handler, error); } @Override public WebResourceResponse shouldInterceptRequest(WebView view, String url) { // view.loadUrl(url, stringStringHashMap); UtilsLog.logger(url); return super.shouldInterceptRequest(view, url); } } /** * 网页回退 */ @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK && mWebView.canGoBack()) { mWebView.goBack();// 返回前一个页面 return true; } return super.onKeyDown(keyCode, event); } @Override protected void onDestroy() { checkSign(); if (mWebView != null) { mWebView.setVisibility(View.GONE); mWebView.removeAllViews(); mWebView.destroy(); releaseAllWebViewCallback(); } super.onDestroy(); } private void checkSign() { if (param.title.equals("签到")) { RxBus.getInstance().post(new EventModel(EventId.checkh5SignState)); } } /** * 防止内存泄露 */ public void releaseAllWebViewCallback() { try { Field sConfigCallback = Class.forName("android.webkit.BrowserFrame").getDeclaredField("sConfigCallback"); if (sConfigCallback != null) { sConfigCallback.setAccessible(true); sConfigCallback.set(null, null); } } catch (NoSuchFieldException e) { UtilsLog.log("ActivityWebView.class::" + e.toString()); } catch (ClassNotFoundException e) { UtilsLog.log("ActivityWebView.class::" + e.toString()); } catch (IllegalAccessException e) { UtilsLog.log("ActivityWebView.class::" + e.toString()); } } }
结果
webview加载网页出现(“找不到网页net:err_unknown_url_scheme”)
这样表示你已经成功一半了,因为这样的结果表示链接已经加上了请求头 只是没有调用到微信而已解决方法
通过根据scheme 协议作出响应跳转
/** * 根据scheme 协议作出响应跳转是跳系统浏览器还是应用内页面还是用webView 打开 */ public void doSchemeJump(String linkUrl, Map<String, String> headers) { try { UtilsLog.logger("doSchemeJump>>" + linkUrl); if (!TextUtils.isEmpty(linkUrl)) { Uri uri = Uri.parse(linkUrl); String scheme = uri.getScheme(); if (scheme.equals("http") || scheme.equals("https")) { UtilsLog.logger("doSchemeJump>>>loadUrl>>" + linkUrl); loadUrl(linkUrl, uri, headers); } else { // 调用系统浏览器 UtilsLog.logger("doSchemeJump>>>loadUrl>>" + linkUrl); openBrowser(linkUrl); } } } catch (Exception e) { e.printStackTrace(); } } private void loadUrl(String linkUrl, Uri uri, Map<String, String> headers) { Bundle bundle = parseExtras(uri); if (bundle != null) { if (bundle.containsKey("scheme")) { String scheme = bundle.getString("scheme"); if (scheme != null && scheme.startsWith("alipays")) { String schemeUrl = URLDecoder.decode(scheme); try { UtilsLog.logger("loadUrl>>open>>" + linkUrl); open(schemeUrl); } catch (Exception e) { e.printStackTrace(); openBrowser(linkUrl); finish(); } return; } } } UtilsLog.logger("loadUrl>>webview加载url>>" + linkUrl); mWebView.loadUrl(linkUrl, headers); } public static Bundle parseExtras(Uri uri) { Bundle extras = null; Set<String> queryParameterNames = uri.getQueryParameterNames(); for (String key : queryParameterNames) { String value = uri.getQueryParameter(key); if (extras == null) { extras = new Bundle(); } extras.putString(key, value); } return extras; } private void openBrowser(String url) { try { Uri uri = Uri.parse(url); Intent intent = new Intent(Intent.ACTION_VIEW, uri); startActivity(intent); } catch (Exception e) { e.printStackTrace(); } } private void open(String url) throws URISyntaxException { Intent intent = Intent.parseUri(url, Intent.URI_INTENT_SCHEME); intent.addCategory("android.intent.category.BROWSABLE"); intent.setComponent(null); startActivity(intent); }
案发现场三
结合案发一和案发二的修改代码执行,发现锤子手机Pro2 (Android 7.1)没有任何问题的调用到微信支付页面,但是其他手机都可以,在支付请求成功之后,请求头成功添加,但是在调用的时候直接崩溃,当时以为是机型问题,毕竟有手机是可以的,经过测试 三星(Android 7.1) oppo(Android 5.1) vivo(Android 6.0) 华为(Android 4.4) 小米(Android 7.1) 都不可以,这就不是什么机型问题了,而是代码问题。
经过断点debug 发现问题出这行代码
@Override public WebResourceResponse shouldInterceptRequest(WebView view, String url) { view.loadUrl(url, stringStringHashMap); UtilsLog.logger(url); return super.shouldInterceptRequest(view, url); }
解决方法
简单粗暴,直接去掉就好。
但是我们还是要知道 这句代码到底影响了什么
WebResourceResponse shouldInterceptRequest 在每一次请求资源时,都会通过这个函数来回调 那么这个方法可以干什么可以拦截,对链接进行二次处理,这也是为什么当初会加这段代码的因为就是担心请求头没有加上。这个方法在调用微信的时候结合起来的次数总共达到3次,那么崩溃原因就在于与微信H5交互时的3次连续重复调用 导致资源冲突问题。
最终完整方案
@Route(path = Path.PFWebView) public class PFWebViewActivity extends BaseBarActivity { @BindView(R.id.webView) WebView mWebView; @BindView(R.id.progressBar) ProgressBar pg; @Autowired Param param; private HashMap<String, String> stringStringHashMap; @Override public void initLayout() { setContentView(R.layout.activity_web_view); } @Override protected void initTitleBar() { } @Override protected void initData() { titleBar.setVisibility(View.GONE); stringStringHashMap = new HashMap<>(); stringStringHashMap.put("Referer", "https://xxx.xxxx.cn"); mWebView.loadUrl(param.url, stringStringHashMap); WebSettings webSettings = mWebView.getSettings(); webSettings.setJavaScriptEnabled(true);//支持javascript webSettings.setJavaScriptCanOpenWindowsAutomatically(true);//设置允许js弹出alert对话框 webSettings.setCacheMode(WebSettings.LOAD_NO_CACHE); //设置 缓存模式 webSettings.setUseWideViewPort(true);//扩大比例的缩放 webSettings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.SINGLE_COLUMN);//自适应屏幕 webSettings.setLoadWithOverviewMode(true); mWebView.requestFocus();//触摸焦点起作用 mWebView.setScrollBarStyle(WebView.SCROLLBARS_OUTSIDE_OVERLAY);//取消滚动条 //设置了Alert才会弹出,重新onJsAlert()方法return true可以自定义处理信息 mWebView.setWebChromeClient(new WebClient()); mWebView.setWebViewClient(new TheWebViewClient()); } class WebClient extends WebChromeClient { @Override public boolean onJsAlert(WebView view, String url, String message, JsResult result) { return true; } @Override public void onProgressChanged(WebView view, int i) { super.onProgressChanged(view, i); pg.setVisibility(i == 100 ? View.GONE : View.VISIBLE); pg.setProgress(i); } } boolean isFirstLoad = false; /** * 和H5的交互 */ class TheWebViewClient extends android.webkit.WebViewClient { @Override public boolean shouldOverrideUrlLoading(WebView view, String url1) { Map<String, String> headers = new HashMap<>(); if (url1.contains("wx.tenpay.com")) { //wx.tenpay.com 收银台点击微信时,shouldOverrideUrlLoading会调用两次,这里是第二次 headers.put("Referer", "https://xxx.xxxx.cn");//第三方支付平台请求头 一般是对方固定 } else { //payh5.bbnpay if(!isFirstLoad){ //跳转到收银台 headers.put("Referer", "https://xxx.xxxx.cn");//商户申请H5时提交的授权域名 isFirstLoad = true; }else{ //收银台点击微信时,shouldOverrideUrlLoading会调用两次,这里是第一次 headers.put("Referer", "https://xxx.xxxx.cn");//第三方支付平台请求头 一般是对方固定 } } UtilsLog.logger("shouldOverrideUrlLoading>>" + url1); doSchemeJump(url1, headers); //view.loadUrl(url1, headers); return true; } @Override public void onPageStarted(WebView view, String url, Bitmap favicon) { showLoadingTransparent(); super.onPageStarted(view, url, favicon); UtilsLog.logger(url); } @Override public void onPageFinished(WebView view, String url) { disableLoadingTransparent(); super.onPageFinished(view, url); UtilsLog.logger(url); } @Override public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) { handler.proceed(); super.onReceivedSslError(view, handler, error); } } /** * 根据scheme 协议作出响应跳转是跳系统浏览器还是应用内页面还是用webView 打开 */ public void doSchemeJump(String linkUrl, Map<String, String> headers) { try { UtilsLog.logger("doSchemeJump>>" + linkUrl); if (!TextUtils.isEmpty(linkUrl)) { Uri uri = Uri.parse(linkUrl); String scheme = uri.getScheme(); if (scheme.equals("http") || scheme.equals("https")) { UtilsLog.logger("doSchemeJump>>>loadUrl>>" + linkUrl); loadUrl(linkUrl, uri, headers); } else { // 调用系统浏览器 UtilsLog.logger("doSchemeJump>>>loadUrl>>" + linkUrl); openBrowser(linkUrl); } } } catch (Exception e) { e.printStackTrace(); } } private void loadUrl(String linkUrl, Uri uri, Map<String, String> headers) { Bundle bundle = parseExtras(uri); if (bundle != null) { if (bundle.containsKey("scheme")) { String scheme = bundle.getString("scheme"); if (scheme != null && scheme.startsWith("alipays")) { String schemeUrl = URLDecoder.decode(scheme); try { UtilsLog.logger("loadUrl>>open>>" + linkUrl); open(schemeUrl); } catch (Exception e) { e.printStackTrace(); openBrowser(linkUrl); finish(); } return; } } } UtilsLog.logger("loadUrl>>webview加载url>>" + linkUrl); mWebView.loadUrl(linkUrl, headers); } public static Bundle parseExtras(Uri uri) { Bundle extras = null; Set<String> queryParameterNames = uri.getQueryParameterNames(); for (String key : queryParameterNames) { String value = uri.getQueryParameter(key); if (extras == null) { extras = new Bundle(); } extras.putString(key, value); } return extras; } private void openBrowser(String url) { try { Uri uri = Uri.parse(url); Intent intent = new Intent(Intent.ACTION_VIEW, uri); startActivity(intent); } catch (Exception e) { e.printStackTrace(); } } private void open(String url) throws URISyntaxException { Intent intent = Intent.parseUri(url, Intent.URI_INTENT_SCHEME); intent.addCategory("android.intent.category.BROWSABLE"); intent.setComponent(null); startActivity(intent); } /** * 网页回退 */ @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK && mWebView.canGoBack()) { mWebView.goBack();// 返回前一个页面 return true; } return super.onKeyDown(keyCode, event); } @Override protected void onDestroy() { checkSign(); if (mWebView != null) { mWebView.setVisibility(View.GONE); mWebView.removeAllViews(); mWebView.destroy(); releaseAllWebViewCallback(); } super.onDestroy(); } private void checkSign() { if (param.title.equals("签到")) { RxBus.getInstance().post(new EventModel(EventId.checkh5SignState)); } } /** * 防止内存泄露 */ public void releaseAllWebViewCallback() { try { Field sConfigCallback = Class.forName("android.webkit.BrowserFrame").getDeclaredField("sConfigCallback"); if (sConfigCallback != null) { sConfigCallback.setAccessible(true); sConfigCallback.set(null, null); } } catch (NoSuchFieldException e) { UtilsLog.log("ActivityWebView.class::" + e.toString()); } catch (ClassNotFoundException e) { UtilsLog.log("ActivityWebView.class::" + e.toString()); } catch (IllegalAccessException e) { UtilsLog.log("ActivityWebView.class::" + e.toString()); } } @Override protected void onPause() { super.onPause(); finish(); } }
可能出现的版本问题
在4.4.4、4.4.3的设备上,设置的Referer没有生效
if (("4.4.3".equals(android.os.Build.VERSION.RELEASE)) || ("4.4.4".equals(android.os.Build.VERSION.RELEASE))) { //兼容这两个版本设置referer无效的问题 view.loadDataWithBaseURL("商户申请H5时提交的授权域名", "<script>window.location.href=\"" + targetUrl + "\";</script>", "text/html", "utf-8", null); } else { Map<String, String> extraHeaders = new HashMap<>(); extraHeaders.put("Referer", "商户申请H5时提交的授权域名"); view.loadUrl(targetUrl, extraHeaders); }
友情提示
本文源码 使用了阿里ARouter 和继承了基类base 按需求删除替换就好。
-
Referer Control-crx插件
2021-04-01 20:31:3205-16访问类型的设置由导出函数输出V3.1 2012-05-16由于我在某些版本中创建了名为http://*google.com/*的无效URL模式,因此它将更改为正常模式。http://*.google.com/*正确答案。 :// *和冒号“。”在谷歌之间... -
HTTP_REFERER有效和无效的情况
2016-02-24 11:36:27HTTP_REFERER有效和无效的情况 页面跳转服务器获取http头时,有时有 HTTP_REFERER,而有时又没有,下面整理了一些 http_referer 的使用注意情况: 【准备】 http://www.libaqiang.com下test.php文件 echo $_...HTTP_REFERER有效和无效的情况
-
PHP $_SERVER['HTTP_REFERER'] 无效
2019-05-12 17:37:30学到PHP的超级全局变量时,遇到了PHP $_SERVER['HTTP_REFERER'],不料在phpstorm中运行的到如下结果: <?php $x=5; $y=10; function addtion(){ $GLOBALS["z"]=$GLOBALS["x"]+$GLOBALS["y"];/** $GLOBALS 是... -
惨js对referer来路伪造来路无效 | 学步园
2020-12-22 14:12:50这段时间一直研究怎么才能在 webbrowser中设置referer来路来伪造来路进行刷流量,可是最后研究了半个月最终以失败告终,因为现在的统计代码,比较实际的就是cnzz.com和google adsense自带的统计,他们的统计都是通过... -
http中Referer和Referrer Policy
2021-08-04 08:56:18一、 referer是什么referer:引用页。HTTP请求头信息中,referer用于提供访问来源的信息,客户端发送请求的时候,自主决定是否加上该字段。服务器一般使用referer识别访问来源,可能以此进行统计分析、日志记录以及... -
解决XMLHttpRequest(Ajax)不能设置自定义的Referer办法
2021-08-06 05:44:18curl_setopt($ch, CURLOPT_HTTPHEADER, array( 'X-Requested-With' => 'XMLHttpRequest', // 设置为Ajax方式 'Referer' => 'http://pandavip.www.net.cn/cgi-bin/Check.cgi?queryType=0&domain1='.$dn.'&image.x=0&... -
referer与防盗链
2021-06-26 02:34:35referer是什么referer 中文意思是:参照页面,引用页。下图直观感受,(づ ̄ 3 ̄)づimage直接在浏览器中输入url地址来直接访问图片/js/css等资源时是没有referer的,如果有referer说明是引用过来的,要么是从HTML页面,... -
Nginx Referer校验模块 防盗链和CSRF ngx_http_referer_module
2020-10-16 19:33:14ngx_http_referer_module用于通过检测"Referer"请求头来防御CSRF漏洞,过滤掉具有无效"Referer"头的请求。 需要注意的是,使用适当的"Referer"标头值来伪造请求非常容易,因此,此模块并不能彻底组织此类... -
看好你的门-客户端传数据-用java修改referer
2021-02-12 22:55:561、简单说明Referer、origin用来表明,浏览器向WEB服务器表明自己来自哪里。但是就它本身而言,并非完全安全。写一个例子,可以任意修改http信息头中的referer、origin2、准备:用httpClient4.0来具体实现3、Java... -
CSRF绕过后端Referer校验
2021-08-13 05:28:48CSRF绕过后端Referer校验分正常情况和不正常的情况,我们这里主要讨论开发在写校验referer程序时,不正常的情况下怎么进行绕过。正常情况正常的情况指服务器端校验Referer的代码没毛病,那么意味着前端是无法绕过的... -
百度地图api调用出现“APP Referer校验失败“错误
2021-10-28 10:45:51如题所示,在使用百度地图API的时候,出现App Referer校验失败。 这个是因为百度地图安全设置导致,解决办法就是进入百度地图开放平台,控制台下,切换到,应用管理,我的应用:选择应用,进入设置页面: 在... -
使用get请求 在后台获取不到referer
2021-03-17 10:06:16做的是一个图片的防盗链功能 ...Android里面都能正常获取到referer 用 <code>alert(document.referrer); </code></pre> 还能在页面获取referer 这是啥情况,,,,,</p> -
HTTP请求头referer
2020-09-09 16:55:18文章目录 前言 Chrome浏览器和Firefox浏览器对比 HTTP_REFERER的用途 PHP $_SERVER['HTTP_REFERER'] 无效 结论 References 本人微信公众号:前端修炼之路,欢迎关注。 前言 前几日用form表单提交一个留言,发现一个... -
c# HttpWebRequest 的 Referer 被置空的问题
2019-03-22 16:42:38近日,在使用使用HttpWebRequest的抓取一个...经调试,发现当执行Web_Request.GetResponse()后,HttpWebRequest内的referer被设置为null了。 referer的作用是用于标明访问此页面时,来源页面的地址是什么。而refere... -
VUE3 Referer为”no-referrer“问题
2021-10-25 10:46:50VUE3 Referer为”no-referrer“问题问题描述解决 问题描述 为了设置七牛云的防盗链Referer,需要设置vue项目的referer,但是使用axios设置header等等都是不起作用的。 解决 在public的模板文件(index.html)中<... -
vue解决控制http的referer有无
2021-02-25 22:31:16场景:我需要清除ajax请求中的refer,通过headers{ referer: '' }设置无效,因为w3c不允许这样做。 网上很多的案例都是关于axios伪造referer来控制,但是我设置的不生效 解决: 方法1:修改http协议中referer的... -
小程序真机测试时,HTTP_REFERER为空
2021-08-18 15:05:34最近开发小程序发现:真机测试时,HTTP_REFERER为空,前几年开发小程序没遇到这个问题 预估是:小程序开发者工具和手机测试时,不校验安全域名配置无法同步。 即在开发者工具中虽然设置了不校验,但是真机测试时仍然... -
百度地图API的时候,出现App Referer校验失败
2022-01-12 14:29:59、在设置页面,将Referer白名单选项,设置为*,表示容许所有的referer, 这个是KEY的白名单设置问题。因为白名单设置限制了来源信息。只要在下面红色部分设置IP,或者域名,或者*就可以了 但是设置完,仍然报错, ... -
验证HTTP Referer字段
2019-10-22 18:09:47String referer=request.getHeader("Referer"); // 判断 Referer 是否以 bank.example 开头 if((referer!=null) &&(referer.trim().startsWith(“bank.example”))){ chain.doFilter(request, ... -
http referer导致无法跳转第三方的网页
2018-03-22 17:34:46问题描述:因业务需要,需要从自己公司网页收集数据到后台,...对比数据流,发现失败的包中多了referer字段,这个字段携带你自己的路径,比如a访问b,referer会把a的地址送给b,这是http协议做的事情。问题解决方... -
Symfony2登录use_referer无效
2015-01-16 15:53:32use_referer: true username_parameter: _email logout: path: logout target: / </code></pre> <p>I've checked the profiler for HTTP_REFERRER and i've got the correct referer. However upon login, it ... -
PHP $_SERVER['HTTP_REFERER'] 获取前一页面的 URL 地址
2020-12-22 22:38:01PHP $_SERVER['HTTP_REFERER']使用 $_SERVER['HTTP_REFERER'] 将很容易得到链接到当前页面的前一页面的地址。一个例子如下:index.php(实际地址为:http://www.5idev.com/php/index.php):链接test.php(实际地址为:... -
JS无法修改referer
2016-03-18 23:10:04因为要跨域访问,容易丢失referer,所以需要在header里面设置referer,然并卵 能修改referer的方法主要是根据浏览器的漏洞,比如IE chrome的安全性很高,不过可以使用webrequest组件来修改,但这个是用于插件开发...