【问题标题】:How to add crumb for CSRF in Jenkins via JSON / JS如何通过 JSON / JS 在 Jenkins 中为 CSRF 添加 crumb
【发布时间】:2017-09-05 09:33:22
【问题描述】:

我想通过 Jenkins 中的 API 作业创建,但我无法在 Jenkins 中连接 CSRF 保护。我有一个碎屑,但我不知道如何将它附加到 JSON 或 JavaScript 中的 url/request 以通过 POST 方法传递数据。有任何想法吗?我只想用 JS 做,而不用 JAVA。谢谢

【问题讨论】:

    标签: javascript json jenkins csrf-protection


    【解决方案1】:

    请记住,您获得的 curl 与会话相关联。这意味着您必须在请求 crumb 时获取 cookie ..然后在运行作业时设置 cookie

    crumb=`curl -s -X GET "http://jenkins/crumbIssuer/api/json" --user usr:passwd --cookie-jar /tmp/crumcookie | tr ',' '\n' |grep '"crumb"' | sed 's/"//g' | awk -F ':' '{print $2}'`
    echo "We got a crumb >> $crumb"
    curl -X POST "http://jenkins/job/remoteTest/build" --user usr:passwd --cookie /tmp/crumcookie -H "Jenkins-Crumb:$crumb"
    echo "Job has been launched"
    

    【讨论】:

      【解决方案2】:

      应该很容易。为了通过 Jenkins 中的 CSRF,您需要做的事情很少。

      #1

      获取一个有效的实际 CSRF crumb,为此您应该使用“/crumbIssuer”端点。 AFAIK,这是一个受保护的端点,因此您应该使用 API 令牌或请求中的凭据对其进行经过身份验证的调用。在这里我将如何在 JavaScript 中做到这一点:

      // **** - is a placeholder for an auth token, replace it with yours
      $.get({
          url: "https://my.jenkins.io/crumbIssuer/api/json",
          contentType: "application/json",
          headers: {
              "User-Agent": "my_js_script",
              "Authorization": "****"
          }
      }).done(function(data) {
          // this is how you fetch valid & actual CSRF crumb
          console.log(data.crumbRequestField + " = " + data.crumb);
      });
      

      #2

      现在,既然您已经掌握了有效且实际的 CSRF 碎屑,请务必将其与任何修改 Jenkins 状态的请求一起发送。可以说,您的有效 CSRF crumb JSON 看起来像这样:

      { "crumbRequestField": "Jenkins-Crumb", "crumb": "noop" }
      

      因此您的 Ajax 调用看起来有点像这样(注意额外的“Jenkins-Crumb”HTTP 标头):

      // **** - is a placeholder for an auth token, replace it with yours
      // simply activates a job in Jenkins, requirement for cloned jobs (aka. "Create-A-Copy-From")
      $.post({
          url: "https://my.jenkins.io/job/my_job/description",
          contentType: "application/x-www-form-urlencoded; charset=UTF-8",
          headers: {
              "User-Agent": "my_js_script",
              "Authorization": "****",
              "Jenkins-Crumb": "noop" // makes CSRF filter in Jenkins happy
          },
          data: "description="
      });
      

      这些 JavaScript sn-ps 不太可能完美,但希望能给你正确的方向。

      我正在开发一个项目,它是 Jenkins API 库,但使用的是 Ruby。如果您需要阅读一些实际执行您正在寻找的源代码,以下是一些可能感兴趣的文件:

      【讨论】:

      • 如何生成授权令牌?
      • 我知道Request header field Jenkins-Crumb is not allowed by Access-Control-Allow-Headers in preflight response. 有什么想法吗?
      • 我发现了问题,是中间的代理不允许标头
      • 如何设置授权?尝试了一段时间。
      • 感谢@pabloduo,经过大量的试验和错误,我自己做到了。您还需要设置 cookie 标头。但是我会查看这篇文章来学习。
      猜你喜欢
      • 1970-01-01
      • 2020-02-02
      • 2020-10-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-10
      相关资源
      最近更新 更多