我正在制作一个扩展,将用户提供的脚本注入当前网站。我已经完成了这部分(在wOxxOm的帮助下)。唯一的问题是在某些网站上它不起作用。它在控制台中抛出此错误:Refused to execute inline script because it violates the following Content Security Policy directive: "script-src 'self'。我一直在尝试使用 declarativeNetRequest 修复此问题,但它不起作用。
规则1.json
[
{
"id": 1,
"priority": 1,
"action": {
"type": "modifyHeaders",
"responseHeaders": [
{
"header": "content-security-policy",
"operation": "remove"
}
]
},
"condition": {
"urlFilter": "*://*/*",
"resourceTypes": ["main_frame"]
}
}
]
Run Code Online (Sandbox Code Playgroud)
清单.json
{
...
"permissions": ["scripting", "activeTab", "declarativeNetRequest"],
...
"declarative_net_request": {
"rule_resources": [
{
"id": "ruleset_1",
"enabled": true,
"path": "/rules/rule1.json"
}
]
}
}
Run Code Online (Sandbox Code Playgroud)
JavaScript
let button = document.getElementById("run"); …Run Code Online (Sandbox Code Playgroud) javascript google-chrome javascript-injection google-chrome-extension
我最近发现我的PM系统存在一个巨大的安全问题,它允许用户for通过地址栏中的循环尽可能多地发送消息.有人把它放到地址栏中:
javascript:for(x=0;x<10000;x++){ $('#compose form').submit(); }
Run Code Online (Sandbox Code Playgroud)
并且消息被发送了1000次给我,我的收件箱中充满了相同的消息,我的数据库非常充实,phpMyAdmin非常迟钝.
我的问题是,我该如何防止这种情况?这是一个重大问题.
此外,表单是使用AJAX提交的.
编辑:
我使用PHP,所以我该如何防止这种情况?就像我怎样才能将消息发送到每5分钟左右发送一次的消息,如果他们在5分钟内提交了多个消息,则会显示错误(或者根本不显示任何用户反馈,只是停止提交)?
我正在开发一个Google Chrome扩展程序,需要接管YouTube视频的所有控件(播放,暂停,下一个,上一个,更改音量,在X秒开始播放视频等).我尝试了以下方法:
我manifest.json包含以下内容:
"content_scripts": [
{
"matches": ["https://www.youtube.com/*"],
"js": ["scripts/jquery.js", "scripts/in_page.js"]
}
],
Run Code Online (Sandbox Code Playgroud)
我正在为每个YouTube链接加载脚本,不仅/watch*因为现在YouTube导航完全使用AJAX,因此页面没有完全刷新,如果我在搜索页面上然后点击视频,则扩展名不会我装了我的content_scripts.
我成功地触发了YouTube播放器上的简单点击事件,例如播放,暂停,上一个视频,下一个视频.
例如,这可以暂停视频:
$("#player-api .html5-video-controls .ytp-button-pause").trigger("click");
Run Code Online (Sandbox Code Playgroud)
但似乎我无法触发事件,例如单击进度条以从视频的特定时刻播放或重新启动视频.
我尝试了这段代码没有成功(使用jQuery $.Event):
var click = $.Event("click");
click.clientX = 0; // Beginning of the video
click.clientY = 0; // I also tried several other coordinates
$("#player-api .html5-video-controls .html5-progress-bar").trigger(click);
Run Code Online (Sandbox Code Playgroud)
(我也尝试点击每个孩子.html5-progress-bar,但没有任何效果.)
由于我似乎遇到了第一种方法的死胡同,然后我尝试了其他方法:直接在页面内部注入脚本.
我manifest.json包含以下内容:
"content_scripts": [
{
"matches": ["https://www.youtube.com/*"],
"js": ["scripts/jquery.js", "scripts/isolated.js"]
}
],
"web_accessible_resources": [
"scripts/injected.js"
], …Run Code Online (Sandbox Code Playgroud) javascript jquery javascript-injection google-chrome-extension jquery-events
我想从Android的网页中提取一些内容.我知道有解析HTML的库,但我想也许我可以作弊.
这就是我在做什么..
这是一些代码......
public void getLatestVersion(){
Log.e("Testing", "getLatestVersion called...");
WebView webview = new WebView(context.getApplicationContext());
webview.loadUrl("https://example.com");
webview.addJavascriptInterface(new jsInterface(), "Droid");
webview.loadUrl("javascript: window.onload=function(){ Droid.showToast('testing!'); }");
}
class jsInterface{
@JavascriptInterface
public void showToast(String message){
Log.e("Testing", message);
Toast.makeText(context, message, Toast.LENGTH_LONG).show();
}
}
Run Code Online (Sandbox Code Playgroud)
由于WebView在UI中不可见,因此很难分辨哪个部分正在破坏.我所知道的是调用了第一个调用的Log,但是JavascriptInterface中的Log和Toast从未显示过.
我正在努力做甚么可能吗?如果是这样,我做错了什么?如果没有,为什么不呢?
编辑
将视图保留在UI中进行测试,显然第二次调用loadUrl不起作用.无论我尝试注入什么Javascript,它都不起作用.
编辑2
忘记启用Javascript我感到愚蠢,但它仍然没有工作..我添加了以下行...
WebSettings webSettings = webview.getSettings();
webSettings.setJavaScriptEnabled(true);
webview.loadUrl("javascript: alert('farts0');");
webview.loadUrl("https://example.com");
setContentView(webview);
String js = "document.body.innerHTML = '<p>test<p>';";
if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
webview.evaluateJavascript(js, null);
}else{
webview.loadUrl("javascript: "+js);
}
Run Code Online (Sandbox Code Playgroud)
编辑3
感谢大家的建议,你一直很有帮助,但到目前为止它还没有工作,所以除非有人在下一个小时提供工作代码,否则Nainal将得到一半的赏金.如果是这样,我不确定我是否会被允许再给它一个赏金,因为问题仍然没有得到解决.
到目前为止,这是我的完整代码,考虑了此页面上的建议,并尝试了我不太了解的手册中的几个设置.
import android.graphics.Bitmap;
import android.os.Bundle; …Run Code Online (Sandbox Code Playgroud) 对于我正在处理的项目,我需要在任何网页文档处理开始之前注入javascript.这可以通过WebBrowser组件轻松实现,但我在使用CefSharp时遇到了困难.
这是问题的简化,网页需要"InjectedObject"才能运行.在文档的最顶部调用未注入的网页,或者在处理文档之前进行评估/执行将导致:
===== html示例输出失败=====
isObjectPresent?
假
=====
我需要在哪里显示网页:
===== html示例输出成功=====
isObjectPresent?
真正
=====
<html>
<head>
<script>
isObjectPresent = typeof InjectedObject == "object";
</script>
</head>
<body>
<p>isObjectPresent?</p>
<div id="result"></div>
<script>
document.getElementById("result").innerHTML = isObjectPresent;
</script>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
查看所有可用的建议将表明我应该使用LoadingStateChanged()或FrameLoadEnd()来注入脚本,即:
public void OnFrameLoadEnd(object sender, FrameLoadEndEventArgs args) {
if (args.Frame.IsMain) {
args.Frame.ExecuteJavascriptAsync("window.InjectedObject = {};");
}
}
Run Code Online (Sandbox Code Playgroud)
然而,我尝试过的所有迭代,甚至使用FrameLoadStart,都导致在文档开始处理后出现插入的javascript.是否有任何真正的javascript注入示例确保它在文档处理开始之前发生.(确保避免竞争条件/时间问题).
作为我想模仿的WebBrowser组件行为的一个例子是:
private void uiWebBrowser_Navigated(object sender, System.Windows.Navigation.NavigationEventArgs e)
{
var browser = (WebBrowser)sender;
var document = browser.Document as HTMLDocument;
var head = document.getElementsByTagName("head").Cast<HTMLHeadElement>().First();
if (head != null)
{
var …Run Code Online (Sandbox Code Playgroud) 我已经使用 WebView 组件加载了一个网页并添加了一个 JavascriptInterface。请检查下面的代码,
\n\nval webview = WebView(this)\nsetContentView(webview)\nwebview.settings.javaScriptEnabled = true\nwebview.loadUrl(HOME_PAGE_URL)\nwebview.addJavascriptInterface(JavascriptInterface(),\xe2\x80\x9djavascript_bridge\xe2\x80\x9d)\nRun Code Online (Sandbox Code Playgroud)\n\n当我使用 Javascript 调用调用时window.javascript_bridge.showToast(\xe2\x80\x9cInformation Saved\xe2\x80\x9d);
private inner class JavascriptInterface\n{\n @android.webkit.JavascriptInterface\n fun showToast(text: String?)\n {\n Log.d("WEBVIEW", text);\n }\n}\nRun Code Online (Sandbox Code Playgroud)\n\n我可以毫无问题地从 Javascript 调用该方法到 Kotlin。
\n\n但现在我想将一个对象从 Javascript 传递到 Kotlin,如下所示,
\n\nvar info = {\n message: \xe2\x80\x9cInformation Saved\xe2\x80\x9d,\n ID: 123456\n}\nRun Code Online (Sandbox Code Playgroud)\n\n当我使用 Javascript 调用调用时window.javascript_bridge.showToast(info);
我尝试将数据类型更改为 Any,但从 Javascript 传递的值为 null
\n\nprivate inner class JavascriptInterface\n{\n @android.webkit.JavascriptInterface\n fun showToast(text: Any?)\n {\n Log.d("WEBVIEW", text.toString());\n }\n}\nRun Code Online (Sandbox Code Playgroud)\n javascript android javascript-injection android-webview kotlin
许多大玩家推荐略有不同的技巧.主要是关于新的安置<script>.
(function() {
var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
})();
Run Code Online (Sandbox Code Playgroud)
(function() {
var e = document.createElement('script'); e.async = true;
e.src = document.location.protocol +
'//connect.facebook.net/en_US/all.js';
document.getElementById('fb-root').appendChild(e);
}());:
Run Code Online (Sandbox Code Playgroud)
(function() {
var dsq = document.createElement('script'); dsq.type = 'text/javascript'; dsq.async = true;
dsq.src = 'http://' + disqus_shortname + '.disqus.com/embed.js';
(document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(dsq);
})();
Run Code Online (Sandbox Code Playgroud)
(发布其他人,我会添加它们) …
我试图注入一个本地CSS文件来覆盖网页的样式.该网页显示UIWebView在iOS 中的容器中.但是我无法让我的代码工作.请参阅下面的委托方法的片段.这段代码运行(我可以看到NSLog消息),但我没有在页面上看到它的执行结果.
我知道它不能是我写的CSS,因为在这种情况下,我把页面自己的CSS文件,只是改变了一些颜色.(为了测试这种方法)
-(void)webViewDidFinishLoad:(UIWebView *)webView
{
NSString *path = [[NSBundle mainBundle] bundlePath];
NSString *cssPath = [path stringByAppendingPathComponent:@"reader.css"];
NSString *js = [NSString stringWithFormat:@"var headID = document.getElementsByTagName('head')[0];var cssNode = document.createElement('link');cssNode.type = 'text/css';cssNode.rel = 'stylesheet';cssNode.href = '%@';cssNode.media = 'screen';headID.appendChild(cssNode);", cssPath];
[webView stringByEvaluatingJavaScriptFromString:js];
NSLog(@"webViewDidFinishLoad Executed");
}
Run Code Online (Sandbox Code Playgroud) 我几乎可以使用 JavaScript API 来控制 YouTube 播放器做任何事情。
player = document.getElementById('movie_player');
Run Code Online (Sandbox Code Playgroud)
但我找不到任何功能可以让我在 5 秒后跳过广告视频(如果有的话)。
我怎样才能实现这个目标?
有没有一些 Android 库可以阻止任何广告?如何阻止使用 javascript 注入?
当我编码时
webView1.getSettings().setJavaScriptEnabled(true);
Run Code Online (Sandbox Code Playgroud)
显示广告,但页面的其他选项不能用作菜单或过滤器。那么如何屏蔽广告但不禁用javascript呢?
javascript ×8
android ×3
webview ×2
adblock ×1
address-bar ×1
c# ×1
cefsharp ×1
html ×1
ios ×1
java ×1
jquery ×1
kotlin ×1
objective-c ×1
php ×1
uiwebview ×1
youtube-api ×1