假设您不希望其他网站在以下位置"构建"您的网站<iframe>:
<iframe src="http://example.org"></iframe>
Run Code Online (Sandbox Code Playgroud)
因此,您将反框架,帧破坏JavaScript插入到您的所有页面中:
/* break us out of any containing iframes */
if (top != self) { top.location.replace(self.location.href); }
Run Code Online (Sandbox Code Playgroud)
优秀!现在你自动"破解"或突破任何包含iframe.除了一个小问题.
事实证明,您的帧破坏代码可能被破坏,如下所示:
<script type="text/javascript">
var prevent_bust = 0
window.onbeforeunload = function() { prevent_bust++ }
setInterval(function() {
if (prevent_bust > 0) {
prevent_bust -= 2
window.top.location = 'http://example.org/page-which-responds-with-204'
}
}, 1)
</script>
Run Code Online (Sandbox Code Playgroud)
此代码执行以下操作:
window.onbeforeunload事件处理程序离开当前页面时,都会递增计数器setInterval()如果它看到计数器递增,则将当前位置更改为攻击者控制的服务器我的问题是 - 这更像是一个JavaScript拼图,而不是一个实际的问题 - 你怎么能打败破坏框架的破坏者呢?
我有一些想法,但在我的测试中没有任何效果:
onbeforeunload事件onbeforeunload = null …嘿,我正在开发一个具有登录对话框的Web应用程序,其工作方式如下:
<form>- 用户/通过AJAX提交这是问题所在:浏览器从不提供通常的"保存此密码?是/从不/不立即"提示它为其他网站提供的.
我尝试使用"autocomplete ='on'" 包装<div>in <form>标签,但这没有任何区别.
是否可以让浏览器提供存储密码而无需重新修改我的登录流程?
谢谢Eric
ps添加到我的问题,我肯定使用存储密码的浏览器,我从来没有点击"永远不会这个网站"...这是一个技术问题,浏览器没有检测到它是一个登录表单,而不是操作员错误:-)
我想要一个html表单提交给自己.我该如何使用该action属性?
<form action=""><form action="#"><form action="some/address"><form>哪个更好?
我刚刚发现(困难的方法),当你有一个HTML表单时action="",Webkit浏览器会以不同的方式对待Firefox和Internet Explorer.
在FF和IE中,这两个表单标签是等效的:
<form method="post" action="">
<form method="post">
Run Code Online (Sandbox Code Playgroud)
他们都会将表格提交回同一页面.然而,Safari和Chrome会将第一个表单发送到默认页面(index.php或其他) - 第二个表单与FF/IE的工作方式相同.
我很快就破解了我的代码,以便在通常打印空操作的任何地方,它根本不添加动作属性.
这看起来非常混乱,而不是做事的最佳方式.有谁能建议更好的方法?另外,任何人都可以告诉我为什么Webkit会做这样的事情?
在Django/Pinax中,我遇到了登录表单,其开头如下:
<form class="login" method="POST" action="">
Run Code Online (Sandbox Code Playgroud)
它运作得非常好.所以我假设某些Java脚本或Django框架中的某些东西将值放入action属性中.
所以,我的问题:
更新:我发现这根本不是Django的事情,而是大多数浏览器所做的事情.
我有一个表单,我在我的CMS中使用,我想添加额外打开以保存表单上的按键:"Ctrl + S"
这适用于除提交按钮之外的所有输入都没有被发送,这个简单的例子显示了我的意思:
<?php
if(isset($_POST['save'])){
die('save= ' . $_POST['save']);
}
?>
<!doctype html>
<html>
<head>
<meta charset="utf-8" />
<title></title>
<style type="text/css">
html { height: 100%; }
body {
color: #262626;
background: #f4f4f4;
font: normal 12px/18px Verdana, sans-serif;
height: 100%;
}
#container {
width: 760px;
margin: 0 auto;
padding: 10px 60px;
border: solid 1px #cbcbcb;
background: #fafafa;
-moz-box-shadow: 0px 0px 10px #cbcbcb;
-webkit-box-shadow: 0px 0px 10px #cbcbcb;
min-height: 100%;
height: auto !important;
height: 100%;
}
</style>
<script type="text/javascript" src="http://code.jquery.com/jquery-latest.min.js"></script>
<script …Run Code Online (Sandbox Code Playgroud) 我有一个网站,我输入用户名/密码,然后单击登录按钮.登录按钮生成XMLHttpRequest对象,并将其触发.
在Chrome,Firefox,Opera,Safari,Android设备,iOS设备上运行正常.只要我在HTTP地址而不使用HTTPS,IE9就可以工作.
在HTTPS上,IE9的行为如下:
第一个登录请求永远不会返回任何内容.F12屏幕确实在网络选项卡中显示我的登录请求,所有看起来都正确.脚本选项卡永远不会抛出错误.没有任何反应.
这是疯狂的部分: - 如果我再次点击登录,它实际上是有效的. - 如果我点击浏览器上的刷新,然后登录,那也将有效!
我提出如下要求:
var x = new XMLHttpRequest();
x.open("POST", "/Relative/URL/Path", true);
x.setRequestHeader("Content-Type", "text/plain");
x.onreadystatechange = function () {
if ((x.readyState == 4) && (x.status == 200)) {
// handle callback
}
}
x.send(my request);
Run Code Online (Sandbox Code Playgroud)
当失败时,调试器将从x.send()行转到onreadystatechange代码.readyState将为1.这将是我可以调试的最后一个,因为没有其他事情发生.
任何想法都将非常感激.
[编辑]:我让一个请求去看看会发生什么.onreadystatechange事件再次使用readyState = 4和status = 12152触发.IE9的F12屏幕中的网络视图显示结果为Aborted,时间为1589.07s.Google搜索显示这意味着服务器上的连接已关闭.
[编辑2]:基于下面的评论,我将此代码重新编写为仅使用jQuery的ajax()方法.我认为这可能有可能消除我的错误代码.没有这样的运气.出现相同的行为.
$.ajax({
"url": sUrl,
"success": function (data, textStatus, x) {
workerCallback(data, id, "");
},
"error": function (x, testStatus, errorThrown) {
workerCallback("nc", id, errorThrown);
},
"contentType": "text/plain",
"data": JSON.stringify(req),
"dataType": "json",
"timeout": 1600000, …Run Code Online (Sandbox Code Playgroud) 我从我的站点上的CSRF Django中间件(来自SVN中继的版本)中遇到了很多故障.我得到的唯一错误是:CSRF失败:原因= CSRF令牌丢失或不正确.
我怎么能诊断这些CSRF错误来自哪里?我自己不能导致CSRF错误,但是我设置网站只要触发CSRF错误视图就给我发电子邮件,所以我知道它经常发生.
这是我的表格:
<form id="login_form">
<table border="0">
<tr>
<td>username: </td>
<td colspan="10">
<input id="username" name="username" type="text" />
</td>
</tr>
<tr>
<td>password: </td>
<td>
<input id="passwd" name="passwd" type="password" />
</td>
</tr>
<tr style="text-align:center">
<td>
<input id="login_submit" type="submit" title="submit" />
</td>
<td>
<input type="reset" title="reset" />
</td>
</tr>
</table>
</form>
Run Code Online (Sandbox Code Playgroud)
我的jquery代码:
$(function(){
jQuery("#login_submit").click(function() {
jQuery.ajax({
url:'./login/',
type:'post',
data:$("#login_form").serialize(),
dataType:'html',
async: false,
success:function(backData) {
alert(data);
},
error:function(err){
alert('error = ' + err);
}
});
});
});
Run Code Online (Sandbox Code Playgroud)
我感到困惑的是,当我访问url:时http://192.168.0.3/CarKeeperServer/user/login.jsp,单击提交按钮(该页面不会指向新页面,因为jquery代码片段中没有重定向代码),并且url将更改为http://192.168.0.3/CarKeeperServer/user/login.jsp?username=df&passwd=sd,exposes我的用户名和密码就像在GET方法中一样.谁能解释为什么会发生这种情况以及解决方案是什么?非常感谢!
我已经看到了两种设置表单动作属性的方法.
#1.空动作属性:
action=""
Run Code Online (Sandbox Code Playgroud)
#2.Action属性#:
action="#"
Run Code Online (Sandbox Code Playgroud)
两者有什么不同?