我想在我的程序中更改许多<a href>
操作以提高安全性,我希望添加隐藏令牌以防止CSRF
攻击。
将<a href>
操作更改为POST
请求的最简单方法是什么?
<a href>
)代码块相比parentNode.submit();
)<a>
,而不是<button>
或<submit>
非POST行动:
<a href="/user/delete/4">DELETE</a>
目标解决方案:
<form method="post" target="/user/delete/4">
<a href="SUBMIT THIS FORM">DELETE</a>
</form>
将<input type="submit">
样式设置为&amp;图层与<a>
元素完全相同?
答案 0 :(得分:1)
解决方案应该是跨浏览器,并且适用于所有专业 浏览器,即moz,IE,Chrome,Opera等。
嗯,假设您希望它也适用于像ie6这样的浏览器
拥有一个纯粹的JavaScript,没有外部的,这将是一件好事 依赖
是的,可能是最好的解决方案
避免单独的,相当大的(比较)代码块
会很好
使用锚标记是可以的
它应该是非常安全的DOM,所以在一些元素中包含一个可点击的元素 装饰者不应该破坏代码(可破坏的例子: parentNode.submit())
不是parentNode,但您需要提交其他内容,您无法通过POST发送数据
现代方式允许使用新的FormData(),与ajax混合使用。但如果你想要兼容性,你需要使用某种旧的学校脚本。
可点击标签应该是一个锚,即不是或
确定
它应该与文件上传/多部分表单一起使用
表格是啊...
<强> SO:强>
考虑了第一个请求...兼容性没有太多解决方案,你也不应该使用类似addEventListener()的东西,因为它与旧的浏览器不兼容。
唯一的方法是创建一个可以处理多个操作的自定义函数。
这个函数是基于你的例子,删除的东西....通过在html中添加一个带有名称的表单你已经有一些安全问题,所以我决定不向页面添加表单但是创建一个动态地发送它,然后将它附加到dom。
function deleteSomething(e){
if(token === whatever){
var D=document,
a=D.createElement('input'),
x=D.createElement('form');
x.method='post'
a.type='text';
a.name='id';
a.value=e.title;
x.appendChild(a);
D.body.appendChild(x);
x.submit();
}
}
用法:
<a href="#" onClick="deleteSomething(this)" title="14">delete</a>
<a href="#" onClick="deleteSomething(this)" title="15">delete</a>
<a href="#" onClick="deleteSomething(this)" title="16">delete</a>
这里是一个删除链接...因为在ie6上使用的属性不多我使用标题作为占位符,因为id href是一个空锚,onclick执行该函数。
在函数内部,您可以添加自定义检查以查看令牌是否正确。
您还可以在页面中添加一个表单,然后将其命名为名称,然后将标题更改为表单名称...但如果您需要安全性......嗯......
对于multipart
,基本上传表单或注册表单我会创建一个像上面这样的自定义函数,但不是发送所有内容,只是将表单添加到dom ..所以你可以填写它然后发送它。
如果您希望它可以在最旧的浏览器上运行,请不要使用外部库,安全表单,点击链接,这是我能想到的。
我个人使用ajax和formdata。适用于所有现代浏览器.. ie10也。我也不想在锚点内添加内联函数。
如果您对代码有任何疑问或如何扩展代码,请询问......
通过动态添加链接,您可以进一步改进代码及其安全性。
如果黑客想要获得clinetside令牌,请使用js btw,这相对容易。您需要检查服务器端。
安全&amp;&amp; ie6是不可能的。
我永远不会使用这个,这只是防止了简单的攻击......如果有人真的想破解你的网站就很容易。
通过邮件获得安全数据的唯一方法是您需要检查每个用户,同时添加cachpa或其调用方式不安全....
我会:在服务器端检查引用者,用户,也许是一个令牌。使用ajax&amp; FORMDATA。这适用于所有现代浏览器。如果您的桌面电脑上有ie6并且不想/不能安装现代浏览器,请使用您/您的朋友电话。
你无法隐藏用户的javascript ...前段时间我写了一个关于隐藏js代码的答案... https://stackoverflow.com/a/17468822/2450730 使用newset chrome,如果你知道在哪里可以找到秘密的js代码。 并且wexample使用base64检查refere具有自定义标头等。
答案 1 :(得分:0)
试试这个
<a href="#" onclick="javascript:confirmSubmit()">delete</a>
<script>
function confirmSubmit()
{
var agree=confirm("Are you sure you wish to delete this file?");
if (agree)
document.forms["form_name"].submit();
else
return false ;
}
</script>
答案 2 :(得分:0)
你需要使用javascript :::
<form id="form" action="" method="post">
<a href="javascript:;" onclick="document.getElementById('form').submit();"><%=n%></a>
<input type="hidden" name="mess" value=<%=n%>/>
答案 3 :(得分:0)
如果您希望跨浏览器兼容性,最好使用jQuery 1.X
你可以在这里找到它:http://jquery.com/download/
$('.mySubmitA').on('click', function(){
$(this).parents('form').submit();
return false;
});
答案 4 :(得分:0)
HTML
<a href="/ActualLink" class="js-post-link"> My link </a>
JS
$('.js-post-link').on('click', function(){
jQuery('body').append('<form action="'+ jQuery(this).attr('href') + '" method="post" id="1234567789" /></form>');
jQuery('#1234567789').submit();
return false;
});
答案 5 :(得分:0)
我认为您不必将GET请求更改为POST请求以防止CSRF攻击。防止CSRF攻击的一种方法是在GET请求中携带一些随机字符串。该随机字符串在服务器端生成并验证。
当您的服务器生成链接时,而不是仅生成
<a href="/delete?user=123">delete</a>
你需要生成
<a href="/delete?user=123&csrf=A7djreY">delete</a>
其中&#34; csrf&#34;的值参数是随机字符串。