XML-RPC 的全称是 XML Remote Procedure Call,即 XML 远程过程调用。它是一套允许运行在不同操作系统、不同环境的程序实现基于网络过程调用的规范和一系列的实现。
这种远程过程调用使用 http 作为传输协议,XML 作为传送信息的编码格式。一个 XML-RPC 消息就是一个请求体为 XML 的 http-post 请求,被调用的方法在服务器端执行并将执行结果以 XML 格式编码后返回。
一个 XML-RPC 协议包括两部分:
- RPC client,用来向 RPC 服务端调用方法,并接收方法的返回数据。
- RPC server,用于响应 RPC 客户端的请求,执行方法,并回送方法执行结果。
WordPress 源代码中已经包含了完整的 RPC 服务端代码,它支持对文章,媒体,留言,分类,选项等等各方面数据的管理。简单说,你只要了解 XML-RPC 协议,可以使用 XML-RPC 对你的 WordPress 博客的各个方面进行操作,也就是说可以使用 XML-RPC 做 WordPress 的客户端。WordPress最新版本中该服务是默认开启的。
引用第三方库:https://github.com/abrudtkuhl/WordPressSharp。VS 可以使用 Nuget 搜索“WordPressSharp”安装。
XML-RPC WordPress API 官方介绍:http://codex.wordpress.org/XML-RPC_WordPress_API (该网站屏蔽大陆IP)
新建并发布文章
using System.Windows; using System.IO; using WordPressSharp; using WordPressSharp.Models; namespace AppGUIHET { class ClassXMLRPC { private void xmlPost() { // ==== 新建文章 ==== var post = new WordPressSharp.Models.Post { Title = "文章标题", PostType = "post",//post表示文章,page表示页面 PublishDateTime = System.DateTime.Now,//发布时间 Content = "黑鸟博客建立于2018年 ...",//文章内容 Status = "publish",//private表示私密的,draft表示草稿,publish表示发布 //Name = "blackbird",//固定链接的部分 }; // ==== 和服务器建立连接 ==== using (var client = new WordPressClient(new WordPressSiteConfig { BaseUrl = "https://www.guihet.com/", //网站名称 Username = "admin", //后台用户名 Password = "000000", //后台密码 BlogId = 1 })) { var res = client.NewPost(post);//成功则返回文章ID MessageBox.Show(res.ToString()); } } } }
using语句,定义一个范围,在范围结束时处理对象。
场景:当在某个代码段中使用了类的实例,而希望无论因为什么原因,只要离开了这个代码段就自动调用这个类实例的 Dispose 释放资源。
上传图片
一般情况下文章至少会有一张以上图片,同样可以自动上传图片到网站服务器。
FileStream fs = new FileStream(@"F:\TEMP\picture.jpg", FileMode.Open); byte[] byteData = new byte[fs.Length]; fs.Read(byteData, 0, byteData.Length); fs.Close();//读取本地图片结束 Data imgFile = new Data(); imgFile.Bits = byteData; imgFile.Name = "文件名不包含后缀"; imgFile.Type = "image/jpeg";//File MIME type 或 HTTP Content-type var sr = client.UploadFile(imgFile);//上传 string strc = sr.Url;//服务器上图片地址,可加入文章内容中
也可以这么写
var url = "http://t.cn/A6ZPeiaj"; //网络图片地址 // var name = Path.GetFileName(url); Data data = null; using (System.Net.WebClient webcPic = new System.Net.WebClient()) { data = new Data() { Name = System.IO.Path.GetFileName(url), Bits = webcPic.DownloadData(url), Type = webcPic.ResponseHeaders["content-type"] }; } MessageBox.Show(client.UploadFile(data).Url);
风险
XML-RPC是使用xml文本的方式封装,以http方式传输命令和数据的协议。从本质上看,xmlRpc协议本身并不存在漏洞,但其所包装出来的API接口服务存在被滥用的可能。由于这类API大多以xmlRPC方式包装并提供,外界就普遍说是xmlRPC的漏洞并建议关闭XML-RPC。
在已经被暴露和炒作的xmlRPC相关漏洞中,wordpress的wp.getUsersBlogs可以被用来进行后台暴力破解,pingback.ping可以被用来进行DDoS(ping别人和SSRF内网),流传甚广。
Wordpress中定义xmlrpc所包装服务的地址是在./wp-includes/class-wp-xmlrpc-server.php。
禁用XML-RPC接口:
//禁用XML-RPC接口 add_filter('xmlrpc_enabled', '__return_false');
以上代码丢到主题的functions.php文件即可。
如果你还是用使用第三方客户端来管理Wordpress文章,那么可以只关闭XML-RPC的pingback 端口
//禁用XML-RPC的pingback接口 add_filter( 'xmlrpc_methods', 'remove_xmlrpc_pingback_ping' ); function remove_xmlrpc_pingback_ping( $methods ) { unset( $methods['pingback.ping'] ); return $methods; }
以上代码丢到主题的functions.php文件即可。