如何通过 JSON / JS 在 Jenkins 中为 CSRF 添加面包屑
How to add crumb for CSRF in Jenkins via JSON / JS
我想通过 API 在 Jenkins 中创建作业,但我无法在 Jenkins 中连接 CSRF 保护。我得到了一个面包屑,但不知道如何将它附加到 JSON 或 JavaScript 中的 url/request 以通过 POST 方法获取数据传递。有任何想法吗?我只想用 JS 实现它,而不使用 JAVA。谢谢
应该很简单。为了在 Jenkins 中通过 CSRF,您需要做的事情很少。
#1
获取有效的实际 CSRF crumb,为此您应该使用“/crumbIssuer”端点。据我所知,这是一个受保护的端点,因此您应该使用 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 header):
// **** - 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(见“面包屑法”);
- jenkins-api/lib/jenkins/job.rb(见"activate_job"方法);
请记住,您获得的 curl 与会话相关联。这意味着您必须在请求面包屑时获取 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 }'`
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"
我想通过 API 在 Jenkins 中创建作业,但我无法在 Jenkins 中连接 CSRF 保护。我得到了一个面包屑,但不知道如何将它附加到 JSON 或 JavaScript 中的 url/request 以通过 POST 方法获取数据传递。有任何想法吗?我只想用 JS 实现它,而不使用 JAVA。谢谢
应该很简单。为了在 Jenkins 中通过 CSRF,您需要做的事情很少。
#1
获取有效的实际 CSRF crumb,为此您应该使用“/crumbIssuer”端点。据我所知,这是一个受保护的端点,因此您应该使用 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 header):
// **** - 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(见“面包屑法”);
- jenkins-api/lib/jenkins/job.rb(见"activate_job"方法);
请记住,您获得的 curl 与会话相关联。这意味着您必须在请求面包屑时获取 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 }'`
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"