curl 创建域“example.com”失败Powerdns API

vh0rcniy  于 2022-11-13  发布在  其他
关注(0)|答案(2)|浏览(338)

我总是得到相同的错误(创建域'example.com'失败)(或任何域)时,试图创建新的DNS区域与Powerdns API调用。
我的要求:

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,'http://127.0.0.1:953/api/v1/servers/localhost/zones');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, "{\"name\":\"example.com.\", \"kind\":\"Native\", \"masters\": [], \"nameservers\":[\"ns1.example.com.\", \"ns2.example.com.\"]}");
$headers = array();
$headers[] = 'X-Api-Key: MY-KEY';
$headers[] = 'Accept: application/json';
$headers[] = 'Content-Type: application/json';
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
$result = curl_exec($ch);
if (curl_errno($ch)) {
    echo 'Error:' . curl_error($ch);
}
curl_close($ch);

类似的API调用,以获得一个DNS区域列表正在工作。GET请求工作正常,但不POST。有人能帮助吗?
我的pdns.conf文件是:

api=yes
api-key=MY-KEY

也许我必须改变一些设置我的powerdns,idk真的。我将非常感谢任何帮助!

POST请求后的服务器响应为422错误(无法处理的实体)
HTTP/1.1 422无法处理的实体访问控制允许来源: 连接方式:关闭内容长度:52内容安全策略:默认-src '自身';"不安全内联“内容类型:应用程序/json服务器:PowerDNS/4.4.1 X内容类型选项:nosniff X帧-选项:拒绝X允许跨域策略:无X-Xss-保护:1;模式=块*

This is my pdns.conf file
cat /etc/pdns/pdns.conf
bind-ignore-broken-records=yes
setuid=named
setgid=named
launch=bind
log-dns-queries=yes
loglevel=5
bind-config=/etc/named.conf
bind-dnssec-db=/var/cpanel/pdns/dnssec.db
local-address-nonexist-fail=no
distributor-threads=1
disable-axfr=yes
webserver=yes
api=yes
webserver-address=127.0.0.1
webserver-allow-from=0.0.0.0/0
webserver-password=SERVER-KEY
#gmysql-dnssec=no
webserver-port=953
api-key=MY-KEY
upgrade-unknown-types=1
vwkv1x7d

vwkv1x7d1#

您的代码看起来正确。
你的回答有个大问题。

内容长度:第五十二届会议

它应该是Content-Length: 111
我用两个应用程序测试了你的代码
一个用于发送curl请求
一个用于接收请求并使用请求详细信息进行响应。
在测试的早期,当我删除Content-Type: application/json时,我会看到内容长度刚刚超过50字节。
下面是我的应用程序。它有111个字节。
如果将curl url更改为http://eatled.com/receiveheader.php
你应该得到这个:

Response
Content-Length: 111
Content-Type: application/json
Accept: application/json
Accept-Encoding: deflate, gzip, br
Host: eatled.com
X-Api-Key: MY-KEY

BODY

{"name":"example.com.", "kind":"Native", "masters": [], "nameservers":["ns1.example.com.", "ns2.example.com."]}

array (
  'name' => 'example.com.',
  'kind' => 'Native',
  'masters' => 
  array (
  ),
  'nameservers' => 
  array (
    0 => 'ns1.example.com.',
    1 => 'ns2.example.com.',
  ),
)

LINK TO MY CURL SANDBOX
源代码:
sandbox.php

<?php
header('Content-Type: text/plain; charset=UTF-8');
$jsn = "{\"name\":\"example.com.\", \"kind\":\"Native\", \"masters\": [], \"nameservers\":[\"ns1.example.com.\", \"ns2.example.com.\"]}";
$data = json_decode($post,1);
$post = $jsn;
$request = array();
$request[] = "Content-Type: application/json";
$request[] = "Accept: application/json";
$request[] = "X-Api-Key: MY-KEY";
$ch = curl_init();
curl_setopt($ch, CURLOPT_HTTPHEADER, $request);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);    
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);   
curl_setopt($ch, CURLOPT_URL, 'http://eatled.com/receiveheader.php'); 
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_TIMEOUT,10);
curl_setopt($ch, CURLOPT_FAILONERROR,true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_ENCODING,"");
curl_setopt($ch, CURLOPT_VERBOSE, true);
curl_setopt($ch, CURLOPT_POSTFIELDS,$post);
$data = curl_exec($ch);
$info = rawurldecode(var_export(curl_getinfo($ch),true));
echo "\nResponse\n$data";
echo "\ncurl_getinfo =\n$info";
?>

receiveheaders.php

<?php
header('Content-Type: text/plain; charset=UTF-8');

foreach (getallheaders() as $name => $value) {
    echo "$name: $value\n";
}
echo "\nBODY\n";
$jsn = file_get_contents('php://input');
echo "\n$jsn\n\n\n";
$data = json_decode($jsn,1);
var_export($data);
echo "\n\$_POST\n";
var_export($_POST);
echo "\n\$_FILES\n";
var_export($_FILES);
echo "\n\$_SERVER\n";
var_export($_SERVER);
?>

更新结束

添加这两个标头。

$headers[] = 'Accept: application/json';
$headers[] = 'Content-Type: application/json';

您现在得到的错误是因为请求内容类型是

'CONTENT_TYPE' => 'application/x-www-form-urlencoded',

如果use只使用了content-type头而不接受,则会出现不同的错误。

0x6upsns

0x6upsns2#

你能尝试在运行pDNS网络服务器的机器上使用curl命令调用API吗?

curl -v \
 -H 'Content-Type: application/json' \
 -H 'X-Api-Key: MY-KEY' \
 -H 'Accept: application/json' \
 -X POST -d '{"name":"example.com.", "kind":"Native", "masters": [], "nameservers":["ns1.example.com.", "ns2.example.com."]}' \
 http://127.0.0.1:953/api/v1/servers/localhost/zones

因为我不知道你的设置,所以我猜它有一些与网络有关。如果curl请求工作,你应该检查webserver-allow-from配置,你可以尝试设置它接受从所有(0.0.0.0,::)。

相关问题