Jenkins基础:API:创建Job的CSRF问题对应

使用Jenkins API创建Job是出现了No valid crumb was included in the request的错误提示,memo一下原因和对应方法。

现象

liumiaocn:jenkins liumiao$ curl -X POST -u root:liumiaocn -H "Content-Type:application/xml" -d "@demo/freestyle/config.xml" http://localhost:32002/createItem?name=free_style_job
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>
<title>Error 403 No valid crumb was included in the request</title>
</head>
<body><h2>HTTP ERROR 403</h2>
<p>Problem accessing /createItem. Reason:
<pre>    No valid crumb was included in the request</pre></p><hr><a href="http://eclipse.org/jetty">Powered by Jetty:// 9.4.z-SNAPSHOT</a><hr/>

</body>
</html>
liumiaocn:jenkins liumiao$

原因

Jenkins2.x在安装的时候CSRF防护设定缺省状态下是打开的,Jenkins是通过在Header中添加crumb信息来确认是否是跨域伪造请求的攻击的,在此CSRF防护设定起效的作用下,Jenkins会检查头部有无crumb信息,上述提示的“无有效的crumb”正是因为此设定的缘故

对应方法

对应方法非常简单,要么取消设定,要么在请求中添加crumb信息。

方法1: 取消CSRF保护设定

取消如下的CSRF Protection复选框
Jenkins基础:API:创建Job的CSRF问题对应_第1张图片
此种方式对应起来简单粗暴,快速有效。适用于Jenkins不直接对外暴露的情况,毕竟CSRF的攻击风险是客观存在的,设定之后Jenkins会给出相应的警告。
在这里插入图片描述

方法2:

通过在Header中添加crumb信息即可解决此问题。

  • 步骤1: 获取crumb信息

执行命令示例:curl -u root:liumiaocn ‘http://localhost:32002/crumbIssuer/api/xml?xpath=concat(//crumbRequestField,":",//crumb)’

  • 执行日志示例
    从如下执行日志示例中可以看到,通过此方式返回了Jenkins-Crumb:5955de6dcdcdb990b7341ead1045eb64的crumb信息。
liumiaocn:jenkins liumiao$ curl -u root:liumiaocn 'http://localhost:32002/crumbIssuer/api/xml?xpath=concat(//crumbRequestField,":",//crumb)'
Jenkins-Crumb:5955de6dcdcdb990b7341ead1045eb64liumiaocn:jenkins liumiao$ 
  • 步骤2: 将获取的crumb信息添加到Header中

执行命令示例:curl -X POST -u root:liumiaocn -H “Content-Type:application/xml” -H “Jenkins-Crumb:5955de6dcdcdb990b7341ead1045eb64” -d “@demo/freestyle/config.xml” http://localhost:32002/createItem?name=free_style_job

结果确认
Jenkins基础:API:创建Job的CSRF问题对应_第2张图片

参考内容

https://wiki.jenkins.io/display/JENKINS/CSRF+Protection
https://wiki.jenkins.io/display/JENKINS/Remote+access+API#RemoteaccessAPI-CSRFProtection

你可能感兴趣的:(工具)