XML-RPC 的全称是 XML Remote Procedure Call,即 XML 远程过程调用。它是一套允许运行在不同操作系统、不同环境的程序实现基于网络过程调用0 I ! 9 ` G n L的规范和一系列的实现。
这种远程过程调用使用 http 作为传输协议,XML 作为传送信息的编码格式。一个 XMLD R O ; . t-RPC 消息就是一个请求体为 XML 的 http-post 请求,被调用的方法在服务W D ` f @ d器端执行并将执行结果以 XML 格式编码后返回。
一个 XML-RPC 协议包括两部分:
- RPC client,用来向 RPC 服务端调用方法,并接收方法的返回数据。
- RF ? T P = PC server,用于响应 RPC 客户端的请求,执行方法,并回送方法执行G 3 M C 0 P结果。
WordPress 源代码中已经包含了完整的 RPC 服务端代码,它支持对文章, Z & O M R媒体,留言,分类,选项等等各方面数据的管理。简单说,你只要了解 XML-RPC 协议,可以使用 XML-RPC 对你的 WordPress 博客的各` H V p e J个方面进行操作,也就是说可以使用 XML-RPC 做e * O ` M G WordPress 的客户端。WordPress最新版本中该服务是默认开启的。
引用第三方库:https://gl 2 * X s 9 u ; }ithub.com/abrudtkuhl/O r . F : { @ Z GWordPressS~ u Q 2 ~harp。VS 可以使用 N) k H .uget 搜索“WordPreR C - y v 8ssSharp”安装。
XML-RPC WordPress API 官方介绍:http://codex.wordpres1 J 7 ) c ; O `s.org/XML-RPC_WordPrn * b T E x ^ess_API (该网站屏蔽大陆IP)
新建并发布文章
using System.Windows; using Sy + 1 p ! ^ Rystem.IO; using WordPressSharp; using WordPressSharp.Models; na4 K g u 6 . b T {mespace AppGUIHET { class ClassXM@ R B O [LRPC { private void xmlPost() { // ==== 新建文章 ==== var post = new WordPressSharp.Modn | ` z G a ? D Rels.Post { Title = "文章标题", PostType = "post",//post表示文章,page表示页面 PublishDateTime = System.S ! /DateTime.Now,//发布时间 Content = "黑鸟博客建立于2018年 ...",//文章内容 Status = "publish",//private表示私密的,draft表示草稿,publish表示发布 //Name = "black1 8 ! p $ I - 0bird",//固定链接的部分 }; /{ d e 1/ ==== 和服务器建立连接 ==== using (var client = new WordPressClient(new WordPressSiteConfig {~ } B BaseUrl = "https://www.guihet.com/", /6 7 f U d r G 1 n/网站名称 UsernameY $ v u = "admin", //后台用户名 Password = "000000", //后台密码 BlogId = 1 })) { var res = c4 L 5 b F :lient.NewPost(post);//成功则返回文章ID MessageBI ; -ox.Show(res.ToString()); } } } }
usiD $ v eng语句,定义一个范围,在范围结束时处理对象。
场景:当在某个代码段中使用了类的实例,而希望无论因为什么原因,只要离开了这个代码段就自动调用这个类实例A { f z M的 Dispose 释放资源。
上传图片
一般情况下文章至少会有一张以上图片,同样可以自动上传图f a !片到网站服务器。
FileStream fs = new FileStream(@"F:\TEMP\pictx t q % S J T .ure.jpg", FileMode.Open); byte[] byteData = new@ p X | W m byte[fs.Length]; fs.Read(byteData, 0, byteData.Le, M Z u ; / W %ngth); fs.Close();//读取本地图片结束 Data imgFile = new Data(); imgFile.Bitr { h C t &s = byteData; imgFile.Name = "文件名不包含后缀"; imgFile.Type = "image/jpeg";//File MIME type 或 HTTP Content-type var sr = client.UploadFilU A D k @ C ye(imgFile);//上传 string strc = sr.Url;//服务器上图片地址,可加入文章& D h L K = N 9内容中
也可以这么写
var url =q N U A I "http://t.cn/A6Zo [ ~ * z fPeiaj"; //网, I / a a b K L A络图片地址 // var] F _ 1 O E name = Path.GetFileName(url); Data data = null; using (System.Net.WebClient webcPic = new SysteB ( u 5 { : N Dm.Net.WebClient()) { data = new Data() { Namy G % Ae = System.IO.Path.GetFileName(url), Bits = webcPic.Down6 ~ U v zloadData(url), Type = webcPic.ResponseHeaders["content-type"] }; } MessageBox.n ! @ * 6 L U X hShow(client.UploadFi! $ G & G / le(data).Url);
风险
XML-RPC是使用xml文_ + h l本的方式封装T , 4,以http方式传输命令和数据的协议。从本质上看,xmlRpc协议本身并不存在漏洞,但其所包装出来的j 6 8 6 A h VAPI接口服务存6 v h f x在被滥用的可能。由于这类API大多以xm? m F { {lRPCm d ^ o ) E V方式包装并提供,外界就普遍说是J I K { 1 T X 7xmlRPC的漏洞并建议关闭XML-RPC。
在已经被暴露和炒作的xmlRPs ~ d {C相关漏洞中,wordpress的wp.getUsersBlogs可以被用来进行后台暴力破解,pingback.ping可以被用来进行DDoS(ping别人和SSRF内网),流传甚广。= ]
Wordx , w , Y -press中定义xmlrpc所包装服务的8 d D t + O ^ Q地址是在./wp-includes/class-wp-xmlrpc-server.php。
禁用XML-RPC接口:
//禁用XML-RPH 8 Y C接口 add_filter('xmlrpc_enabled', '__return_faD R V rlse');
以上代f M 4 X ` 8 i码丢到1 J l主题的functionsa N 9 # ; V D.php文件即可。
如果你还= - a #是用使用第三方客户端来管理Wordpress文章,那么可以只关闭XML[ ^ D : F-RPC的pingback 端口
//禁用XML-RPC的pingbac( 2 O B qk接口 add_filtq U - Y u Ker( 'xmlrpc_methods', 're) & = hmove_xmlrpc_pingback_ping' ); function remove_xmlrpc_pingback_ping( $methods ) { unset( $methods['pingY W i ,back.ping'] ); return $methods; }
以上代码丢到主题的functions.. ) 7 Z T G Xph# u y = m & g #p文件即可。