Web业已成为移动互联网最普遍的技术形态,绝大多数移动App都包含基于移动Web的模块。由于Web技术的标准性和开放性,App内移动Web场景自身安全面临普遍威胁。移动互联网生态中灰色产业链可以利用典型如:DSN劫持、HTTP劫持、系统内核漏洞利用、恶意网址等恶意手段,较为轻易地实施窃取隐私、欺诈、远程控制等行为,并给合法应用和用户造成利益损害。
传统移动操作系统内核缺乏安全防护的能力,同时,传统的移动安全应用手段也难以为移动Web应用提供细粒度的保护;事实上,几乎所有的移动互联网应用Web场景都遭受过各类安全攻击。
TBS独立于传统的系统内核,基于云防护,本地热修复,腾讯安全云等能力,TBS能为移动应用Web场景提供高效低成本的E2E安全保障。
demo下载http://download.csdn.net/download/cxscxs123cxs/10167776
public class MainActivity extends Activity { /*** * 使用腾讯com.tencent.smtt.sdk.WebView * */ private WebView mWebView; private static final String mHomeUrl = "https://www.jd.com"; private static final String TAG = "SdkDemo"; private static final int MAX_LENGTH = 14; private boolean mNeedTestPage = false; private ProgressBar mPageLoadingProgressBar = null; private ValueCallback<Uri> uploadFile; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); getWindow().setFormat(PixelFormat.TRANSLUCENT); try { if (Integer.parseInt(android.os.Build.VERSION.SDK) >= 11) { getWindow() .setFlags( android.view.WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED, android.view.WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED); } } catch (Exception e) { } setContentView(R.layout.activity_main); mTestHandler.sendEmptyMessageDelayed(MSG_INIT_UI, 10); } private void initProgressBar() { mPageLoadingProgressBar = (ProgressBar) findViewById(R.id.progressBar1);// new mPageLoadingProgressBar.setMax(100); mPageLoadingProgressBar.setProgressDrawable(this.getResources().getDrawable(R.drawable.color_progressbar)); } private void init() { mWebView = (WebView) findViewById(R.id.webView1); initProgressBar(); mWebView.setWebViewClient(new WebViewClient() { @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { return false; } @Override public void onPageFinished(WebView view, String url) { super.onPageFinished(view, url); mTestHandler.sendEmptyMessageDelayed(MSG_OPEN_TEST_URL, 5000);// 5s? } }); mWebView.setWebChromeClient(new WebChromeClient() { @Override public boolean onJsConfirm(WebView arg0, String arg1, String arg2, JsResult arg3) { return super.onJsConfirm(arg0, arg1, arg2, arg3); } @Override public void onProgressChanged(WebView webView, int newProgress) { if(newProgress==100){ mPageLoadingProgressBar.setVisibility(View.GONE);//加载完网页进度条消失 } else{ mPageLoadingProgressBar.setVisibility(View.VISIBLE);//开始加载网页时显示进度条 mPageLoadingProgressBar.setProgress(newProgress);//设置进度值 } } View myVideoView; View myNormalView; IX5WebChromeClient.CustomViewCallback callback; /** * 全屏播放配置 */ @Override public void onShowCustomView(View view, IX5WebChromeClient.CustomViewCallback customViewCallback) { FrameLayout normalView = (FrameLayout) findViewById(R.id.web_filechooser); ViewGroup viewGroup = (ViewGroup) normalView.getParent(); viewGroup.removeView(normalView); viewGroup.addView(view); myVideoView = view; myNormalView = normalView; callback = customViewCallback; } @Override public void onHideCustomView() { if (callback != null) { callback.onCustomViewHidden(); callback = null; } if (myVideoView != null) { ViewGroup viewGroup = (ViewGroup) myVideoView.getParent(); viewGroup.removeView(myVideoView); viewGroup.addView(myNormalView); } } @Override public boolean onJsAlert(WebView arg0, String arg1, String arg2, JsResult arg3) { /** * 这里写入你自定义的window alert */ return super.onJsAlert(null, arg1, arg2, arg3); } }); mWebView.setDownloadListener(new DownloadListener() { @Override public void onDownloadStart(String arg0, String arg1, String arg2, String arg3, long arg4) { TbsLog.d(TAG, "url: " + arg0); new AlertDialog.Builder(MainActivity.this) .setTitle("allow to download?") .setPositiveButton("yes", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { Toast.makeText( MainActivity.this, "fake message: i'll download...", Toast.LENGTH_LONG).show(); } }) .setNegativeButton("no", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // TODO Auto-generated method stub Toast.makeText( MainActivity.this, "fake message: refuse download...", Toast.LENGTH_SHORT).show(); } }) .setOnCancelListener( new DialogInterface.OnCancelListener() { @Override public void onCancel(DialogInterface dialog) { // TODO Auto-generated method stub Toast.makeText( MainActivity.this, "fake message: refuse download...", Toast.LENGTH_SHORT).show(); } }).show(); } }); WebSettings webSetting = mWebView.getSettings(); webSetting.setAllowFileAccess(true); webSetting.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.NARROW_COLUMNS); webSetting.setSupportZoom(true); webSetting.setBuiltInZoomControls(true); webSetting.setUseWideViewPort(true); webSetting.setSupportMultipleWindows(false); // webSetting.setLoadWithOverviewMode(true); webSetting.setAppCacheEnabled(true); // webSetting.setDatabaseEnabled(true); webSetting.setDomStorageEnabled(true); webSetting.setJavaScriptEnabled(true); webSetting.setGeolocationEnabled(true); webSetting.setAppCacheMaxSize(Long.MAX_VALUE); webSetting.setAppCachePath(this.getDir("appcache", 0).getPath()); webSetting.setDatabasePath(this.getDir("databases", 0).getPath()); webSetting.setGeolocationDatabasePath(this.getDir("geolocation", 0) .getPath()); // webSetting.setPageCacheCapacity(IX5WebSettings.DEFAULT_CACHE_CAPACITY); webSetting.setPluginState(WebSettings.PluginState.ON_DEMAND); // webSetting.setRenderPriority(WebSettings.RenderPriority.HIGH); // webSetting.setPreFectch(true); long time = System.currentTimeMillis(); mWebView.loadUrl(mHomeUrl); TbsLog.d("time-cost", "cost time: " + (System.currentTimeMillis() - time)); CookieSyncManager.createInstance(this); CookieSyncManager.getInstance().sync(); } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK) { if (mWebView != null && mWebView.canGoBack()) { mWebView.goBack(); return true; } else return super.onKeyDown(keyCode, event); } return super.onKeyDown(keyCode, event); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { TbsLog.d(TAG, "onActivityResult, requestCode:" + requestCode + ",resultCode:" + resultCode); if (resultCode == RESULT_OK) { switch (requestCode) { case 0: if (null != uploadFile) { Uri result = data == null || resultCode != RESULT_OK ? null : data.getData(); uploadFile.onReceiveValue(result); uploadFile = null; } break; default: break; } } else if (resultCode == RESULT_CANCELED) { if (null != uploadFile) { uploadFile.onReceiveValue(null); uploadFile = null; } } } @Override protected void onNewIntent(Intent intent) { if (intent == null || mWebView == null || intent.getData() == null) return; mWebView.loadUrl(intent.getData().toString()); } @Override protected void onDestroy() { if (mTestHandler != null) mTestHandler.removeCallbacksAndMessages(null); if (mWebView != null) mWebView.destroy(); super.onDestroy(); } public static final int MSG_OPEN_TEST_URL = 0; public static final int MSG_INIT_UI = 1; private final int mUrlStartNum = 0; private int mCurrentUrl = mUrlStartNum; private Handler mTestHandler = new Handler() { @Override public void handleMessage(Message msg) { switch (msg.what) { case MSG_OPEN_TEST_URL: if (!mNeedTestPage) { return; } String testUrl = "file:///sdcard/outputHtml/html/" + Integer.toString(mCurrentUrl) + ".html"; if (mWebView != null) { mWebView.loadUrl(testUrl); } mCurrentUrl++; break; case MSG_INIT_UI: init(); break; } super.handleMessage(msg); } }; }运行效果: