从文档:http: //developer.android.com/reference/android/webkit/WebView.html#addJavascriptInterface%28java.lang.Object,%20java.lang.String%29
"使用addJavascriptInterface()允许JavaScript控制你的应用程序.这可能是一个非常有用的功能或危险的安全问题.当WebView中的HTML不可靠时(例如,部分或全部HTML由某人或某个人提供) ),然后攻击者可以注入执行你的代码的HTML,也可能是攻击者选择的任何代码. 不要使用addJavascriptInterface(),除非这个WebView中的所有HTML都是由你编写的. 绑定的Java对象在另一个中运行线程,而不是在它构造的线程中.
假设我有一个只显示自定义对话框的界面,或者开始下载到SD卡.这对任何网址使用都不安全吗?攻击页面如何使用该界面运行攻击者选择的任何代码?
更新: 根据文档:
此方法可用于允许JavaScript控制主机应用程序.这是一个强大的功能,但也会为针对API级JELLY_BEAN或更低级别的应用程序带来安全风险,因为JavaScript可以使用反射来访问注入对象的公共字段.在包含不受信任内容的WebView中使用此方法可能允许攻击者以非预期的方式操作主机应用程序,并使用主机应用程序的权限执行Java代码.在可能包含不受信任内容的WebView中使用此方法时要格外小心.
有没有一个如何发生这种情况的例子?这只是说DOWNLOADINTERFACE.dangerousfunction如果那个类的公共方法可以被调用?
我根据下面的漏洞利用示例进行了测试,站点可以通过Android 4.4,4.1和3.2中的接口访问系统.
但是,我没有在Android 2.2或2.3上看到这个错误,黑客只会导致强制关闭.除了不使用JSInterface之外,防止此黑客攻击的最佳方法是什么?我可以包含这样的虚假功能,以防止未经授权的功能调用吗?
public Object getClass() {
//throw error, return self, or something?
}
Run Code Online (Sandbox Code Playgroud)
或者使用ajax和拦截调用重写所有内容?这会导致更好/更差的表现吗?
更新:
我成功地删除了JS接口,并通过为所有窗口(接口)函数定义window.open(specialurl)命令来替换功能,并覆盖了shouldOverrideUrlLoading中的那些命令.奇怪的是,在某些情况下必须使用window.open(),或者webview中断显示(比如javascript正在停止?),在其他情况下应该使用location.replace或它只显示"interface:// specialdata" "无法找到消息.
(我设置了settings.setJavaScriptCanOpenWindowsAutomatically(true),因此window.open始终从JS开始工作.)
有人知道用这种行为重写应用程序的最佳方法吗?
我的应用程序使用WebView透明背景,其中元素的一些样式属性由JavaScript修改.
问题:WebView根据修改后的属性不刷新.何时WebView重绘(例如,由于用户方向改变),WebView正确更新.我在Android 3.2(在Samsung GT上)上重现了这个问题,但在Android 2.1和4.3上都可以正常工作.
重现问题的示例代码:
显然,当第一个图像被点击时,它应该消失,点击第二个图像应该移动它.如果将背景颜色WebView更改为不透明,或者如果我删除下面显示的图像,则WebView所有工作正常...
Web视图加载的HTML.:
<!DOCTYPE html>
<html>
<body >
<img style="position:absolute;left:0px" onclick="this.style.display='none';"
src="http://flv.justad.tv/gallery/assets/trickplay/justad/tp-pause.png" />
<img style="position:absolute;left:200px" onclick="this.style.top='200px';"
src="http://flv.justad.tv/gallery/assets/trickplay/justad/tp-ff.png" />
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
布局文件:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
>
<ImageView
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:scaleType="fitXY"
android:src="@drawable/display_background" />
<RelativeLayout android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/WebviewContainer">
</RelativeLayout>
</RelativeLayout>
Run Code Online (Sandbox Code Playgroud)
申请Activity:
public class TestImageMoveActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
RelativeLayout webviewContainer =
(RelativeLayout)findViewById(R.id.WebviewContainer); …Run Code Online (Sandbox Code Playgroud) 在Android 4.1.2上点击Phonegap 3.0应用程序中的元素时,我完全摆脱了可怕的亮点.
当点击一些元素时,我首先在tapped元素下获得一个橙色(在这种情况下)突出显示,但是然后快速连续的父元素(或另一个祖先元素,不确定哪个)也显示一个高亮显示!
我知道通过设置透明颜色可以"禁用"点击突出显示:
* {
-webkit-tap-highlight-color: rgba(0,0,0,0);
-webkit-tap-highlight-color: transparent; /* For some Androids */
}
Run Code Online (Sandbox Code Playgroud)
这实际上适用于我的应用程序中的大多数可点击元素,但在某些元素上,父/祖先元素仍然会突出显示!我创建了一个演示,演示了我正在测试的设备上的外观(三星Galaxy S3).是啊,没错.我正在使用jsfiddle作为动画工具:-)
我试图在另一个线程讨论的一切:禁用橙色轮廓亮点焦点.
由于点击突出显示实际上在上面用css规则点击的所有元素上消失了,我开始怀疑这个次要的较大高亮显示除了点击之外的其他内容.但我试图扩展css规则也适用于*:hover, *:active, *:focus没有成功.
我也试图在css之外和Android应用程序本身攻击问题.WebSettings中的第一个setLightTouchEnabled ()看起来很有希望,但A)它没有用,B)从API级别18它已经过时并且没有效果.
我真的很茫然.任何帮助都将非常感激.
WebView提供goBack()和goForward()实现典型的后退按钮行为,可以绑定到按钮,操作栏项或任何其他:
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch(item.getItemId()) {
case R.id.back:
if (webView.canGoBack()) {
webView.goBack();
}
break;
case R.id.fwd:
if (webView.canGoForward()) {
webView.goForward();
}
break;
case R.id.reload:
webView.reload();
break;
default:
return(super.onOptionsItemSelected(item));
}
return(true);
}
Run Code Online (Sandbox Code Playgroud)
WebView也有canGoBack()和canGoForward(),告诉你,如果这些是给在当前的导航历史可行的方案WebView,如上文所示周围的卫兵goBack()和goForward()电话.
从理论上讲,canGoBack()和canGoForward()可用于启用或禁用按键,操作栏项目,或什么的.这将为您提供典型的浏览器UI,其中后退和前进按钮仅在用户具有实际效果时可用.
什么是不明显的时候,我们应该呼吁canGoBack()和canGoForward()和启用/禁用这些按钮.应该是:
onPageStarted()在一个习俗WebViewClient?doUpdateVisitedHistory()在一个习俗WebViewClient?我正在尝试访问Android WebView中提供的HTML Geolocation API(使用SDK版本24).
主要问题是JavaScript中的调用navigator.geolocation.getCurrentPosition()永远不会返回(既没有错误,也没有位置数据),而在应用程序端,我检查权限并使用android.webkit.GeolocationPermissions.Callback类正确地将它们传递给WebView .
更新:这里只是澄清一下,"永不返回"我的意思是没有任何太多提供的回调navigator.geolocation.getCurrentPosition(success, error)被调用.
在我为测试它而构建的示例应用程序(只有一个托管WebView的小活动)我在清单中声明权限并在App start上正确请求它们.我看到提示,可以授予或拒绝位置信息的许可.
表现:
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
Run Code Online (Sandbox Code Playgroud)
主要形式的代码:
public boolean checkFineLocationPermission() {
if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)
!= PackageManager.PERMISSION_GRANTED) {
if (ActivityCompat.shouldShowRequestPermissionRationale(this,
Manifest.permission.ACCESS_FINE_LOCATION) && !mIsPermissionDialogShown) {
showPermissionDialog(R.string.dialog_permission_location);
} else {
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION},
PERMISSION_ACCESS_FINE_LOCATION);
}
return false;
} else {
return true;
}
}
Run Code Online (Sandbox Code Playgroud)
我可以在运行时使用期间检查权限Context.checkSelfPermission(),我看到相应的权限被授予我的应用程序.
然后我尝试在WebView控件中打开一个网页.我在设置中启用了所有必需的选项:
mWebSettings.setJavaScriptEnabled(true);
mWebSettings.setAppCacheEnabled(true);
mWebSettings.setDatabaseEnabled(true);
mWebSettings.setDomStorageEnabled(true);
mWebSettings.setGeolocationEnabled(true);
mWebSettings.setJavaScriptCanOpenWindowsAutomatically(true);
mWebSettings.setSupportZoom(true);
Run Code Online (Sandbox Code Playgroud)
我使用以下 …
实在找不到词语,我的项目就是一天天都无法编译。
\n这就是我所做的:
\n我下载并显示一个 PDF,然后将其作为保存的 PDF 打印到设备上,然后崩溃了。
\n这是崩溃的情况:
\nat java.lang.Class java.lang.Class.classForName(java.lang.String, boolean, java.lang.ClassLoader) (Class.java:-2)\n at java.lang.Class java.lang.Class.forName(java.lang.String, boolean, java.lang.ClassLoader) (Class.java:453)\n at java.lang.Class android.webkit.WebViewFactory.getWebViewProviderClass(java.lang.ClassLoader) (WebViewFactory.java:176)\n at java.lang.Class android.webkit.WebViewFactory.getProviderClass() (WebViewFactory.java:459)\n at android.webkit.WebViewFactoryProvider android.webkit.WebViewFactory.getProvider() (WebViewFactory.java:251)\n at android.webkit.WebViewFactoryProvider android.webkit.WebView.getFactory() (WebView.java:2681)\n at void android.webkit.WebView.ensureProviderCreated() (WebView.java:2676)\n at void android.webkit.WebView.setOverScrollMode(int) (WebView.java:2741)\n at void android.view.View.<init>(android.content.Context) (View.java:4815)\n at void android.view.View.<init>(android.content.Context, android.util.AttributeSet, int, int) (View.java:4956)\n at void android.view.ViewGroup.<init>(android.content.Context, android.util.AttributeSet, int, int) (ViewGroup.java:659)\n at void android.widget.AbsoluteLayout.<init>(android.content.Context, android.util.AttributeSet, int, int) (AbsoluteLayout.java:55)\n at void android.webkit.WebView.<init>(android.content.Context, android.util.AttributeSet, int, int, java.util.Map, boolean) …Run Code Online (Sandbox Code Playgroud) 以下错误来自Android(WebView),而不是直接来自我自己的代码:
04-28 12:36:15.174: ERROR/Web Console(7604):
Uncaught TypeError: Cannot call method 'getItem' of null at http://m.youtube.com/:844
Run Code Online (Sandbox Code Playgroud)
除了将该URL加载到WebView之外,我真的没有做任何特别的事情.大多数时候我没有得到这个错误,所以我假设这可能指向一些不可靠的网络条件?也许youtube.com太忙了?
这很难说.无论如何,我想至少知道可能导致这种情况的原因以及是否可以捕获该错误以便我能够更好地处理它.
同样,我自己的代码不知道是什么getItem.另一方面,出现此问题时,我的WebView上的YouTube页面就是空的.
见解?
编辑:我一直在寻找有关提议的文档WebSettings.setDomStorageEnabled(true).到目前为止我能找到的唯一提示是在这个SO线程中:正如我之前提到的,这个问题很少发生,并且自从我发布我的问题以来没有发生过.所以我必须先了解一下这个与"DOM存储"之间的联系,然后才能设计一种方法来测试/验证这是否能解决问题.
此外,我刚刚遇到另一个错误消息(良性结果,所以看起来):
05-02 00:44:45.823: ERROR/Web Console(1595):
dojo.back.init() must be called before the DOM has loaded.
If using xdomain loading or djConfig.debugAtAllCosts,
include dojo.back in a build layer.
at http://sj.example.com/ncscript/subsect/j_gs/version/20110428191502.js:164
Run Code Online (Sandbox Code Playgroud)
我现在可以看到与DOM的一些连接,所以看起来@Brian O'Dell的方向正确.我只需要了解WebSettings.setDomStorageEnabled(true)它的作用.
我在我的Android应用中使用了webView来加载YouTube iframe播放器和自动播放视频.它适用于三星Galaxy S2和S3,但在三星Galaxy S4上运行时,在尝试自动播放时总会产生灰色屏幕.
在Galaxy S4上,它没有自动播放工作正常,需要用户操作(点击)才能开始播放(如果在playerVars中添加"autoplay:1"则没有任何反应).

我试图在onPlayerReady()中调用player.playVideo(),它导致了这个灰色屏幕:

LogCat还显示一个奇怪的错误消息:
E/IMGSRV(17004): :0: GetPTLAFormat: Invalid format
Run Code Online (Sandbox Code Playgroud)
无法自动播放时.我不知道这个消息是什么; 我用Google搜索并没有发现任何东西.
这是WebView的Android代码:
WebView wv = (WebView) findViewById(R.id.webview);
WebSettings websettings = wv.getSettings();
websettings.setJavaScriptEnabled(true);
websettings.setDomStorageEnabled(true);
websettings.setDatabaseEnabled(true);
wv.loadUrl(strUrl);
wv.setWebViewClient(new WebViewClient());
wv.setWebChromeClient(new WebChromeClient());
wv.setPadding(0, 0, 0, 0);
wv.getSettings().setLoadWithOverviewMode(true);
wv.getSettings().setUseWideViewPort(true);
wv.setVerticalScrollBarEnabled(false);
wv.setHorizontalScrollBarEnabled(false);
Run Code Online (Sandbox Code Playgroud)
这是一个已知问题,还是有任何自动播放视频的解决方案?谢谢!
在Google Chrome和Play商店中.应用程序可以在滚动时隐藏操作栏,并允许用户方便地浏览.请帮我这样做.
我使用onTouchListener进行webview它不起作用.
mWebView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
getSupportActionBar().show();
break;
case MotionEvent.ACTION_UP:
getSupportActionBar().hide();
break;
default: break;
}
return false;
}
});
Run Code Online (Sandbox Code Playgroud)
提前致谢
我正在尝试用WebView编写一个简单的应用程序,但是当我创建一个WebView时,我收到一个错误:
java.lang.NoClassDefFoundError: Failed resolution of: Landroid/webkit/TracingController;
Run Code Online (Sandbox Code Playgroud)
我搜索并发现TracingController是从api level 28实现的,但我只有27.
我该如何解决这个问题?
android ×10
android-webview ×10
webview ×3
javascript ×2
cordova ×1
css ×1
interface ×1
java ×1
youtube-api ×1