使用<a href="">?</a>提交POST表单的最简单的跨浏览器方式是什么?

时间:2014-06-11 11:34:24

标签: javascript jquery html css html5

我想在我的程序中更改许多<a href>操作以提高安全性,我希望添加隐藏令牌以防止CSRF攻击。

<a href>操作更改为POST请求的最简单方法是什么?

  • 解决方案应该是跨浏览器,并且适用于所有主流浏览器,即moz,IE,Chrome,Opera等。
  • 拥有纯JavaScript,没有外部依赖
  • 会很高兴
  • 最好避免单独的,相当大的(与<a href>)代码块相比
  • 它应该是非常安全的DOM,所以在一些装饰器中包装一个可点击的元素不应该破坏代码(易碎的例子: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>元素完全相同?

6 个答案:

答案 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;的值参数是随机字符串。