如何通过JSON / JS在Jenkins中为CSRF添加面包屑



我想通过 Jenkins 中的 API 作业创建,但我无法连接 Jenkins 中 CSRF 保护的协同使用。我得到了一个面包屑,但idk如何将其附加到JSON或JavaScript中的url/request以获取通过POST方法传递的数据。有什么想法吗?我只想用JS来做,而不用JAVA。谢谢

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

#1

获取一个有效的实际 CSRF 面包屑,为此您应该使用">/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面包屑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 片段不太可能完美,但希望能给你正确的方向。

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

  • jenkins-api/lib/jenkins/connection.rb (参见 "crumb method);
  • jenkins-api/lib/jenkins/job.rb (参见"activate_job"方法);

Remenber 你得到的卷曲与会话相关联......这意味着你必须在要求面包屑时得到饼干......然后在运行作业时设置 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"

最新更新