PHP – 清风亦平凡 https://www.mlplus.net 关注IT世界,记录平凡生活 Sat, 06 Aug 2022 17:55:21 +0000 zh-CN hourly 1 https://wordpress.org/?v=6.4.3 WordPress自动对没有alt属性的img添加alt属性 https://www.mlplus.net/2022/08/07/wordpress-auot-add-img-alt/ https://www.mlplus.net/2022/08/07/wordpress-auot-add-img-alt/#respond Sun, 07 Aug 2022 01:00:00 +0000 https://www.mlplus.net/?p=3918 背景

使用了微软必应搜索的站长工具,看到必应搜索工具中SEO报告提示错误蛮多。主要有两个错误提示,其中一个是关于页面描述内容长短问题,另外一个就是img标签没有alt属性的问题。页面固定img标签的alt属性比较容易改,而文章内容的img标签的alt属性就没有那么方便了。

SEO错误提示

博客使用的是wordpress,其实处理起来也没有那么麻烦。一种方法就是使用现成的插件,例如:SEO Friendly Images,另一种就是在使用模板目录下,找到functions.php函数文件添加自定义函数处理。

这里提供自定义函数,内容如下:


//Wordpress判断并自动添加图片ALT属性
function image_alt($imgalt) {
	global $post;
	$title = $post->post_title;
	$imgUrl = "/<img\s*?.+?[^>]>/si";
	$isMatch=preg_match_all($imgUrl,$imgalt,$matches,PREG_SET_ORDER);
	if($isMatch) {
		if(!empty($matches) ) {
			for ($i=0; $i < count($matches); $i++) {
				$tag = $url = $matches[$i][0];
				$tag=preg_replace('/alt="\s*"/','',$tag);
				$judge = '/alt=/';
				$isMatched=preg_match($judge,$tag,$match,PREG_OFFSET_CAPTURE);
				if($isMatched) {
				   continue;
				}
				$tag=preg_replace('/<img/','<img alt="'.$title.'-第'.$i.'张图片"',$tag);
				$imgalt =str_replace($url,$tag,$imgalt);
			}
		}
	}
	return $imgalt;
}
add_filter('the_content', 'image_alt');



转载请注明:清风亦平凡 » WordPress自动对没有alt属性的img添加alt属性

]]>
https://www.mlplus.net/2022/08/07/wordpress-auot-add-img-alt/feed/ 0
禁用WordPress程序REST API功能 https://www.mlplus.net/2019/09/02/wordpressdisablejsonapi/ https://www.mlplus.net/2019/09/02/wordpressdisablejsonapi/#respond Mon, 02 Sep 2019 05:35:14 +0000 https://www.mlplus.net/?p=1828 本博客点使用PHP的一套出名的应用,那就是WordPress。站点建立完成后就有针对登录的暴力破解,很多都应该都是随机的用户名尝试,那个时候也就没有做任何处理。过一段时间发现,真正的用户名已被发现,经过了解发现是WordPress站点一个功能,可以暴露用户名。如下请求:

/?author=1

/author/admin

这个问题解决使用方法也很简单,因为一开始就使用了 redirections ,索性就直接用301重定向。到这里这个问题是解决了。很奇怪登录失败列表还是存在真实用户名,最后发现是WordPress应用的API问题。这太扯淡了,没有权限验证用户API就能获得登录用户名。

/wp-json/wp/v2/users

禁用WordPress程序REST API功能-第0张图片

WordPress 4.4 默认集成了备受关注的 JSON REST API,这个对于开发者来说,无疑是非常有用的,通过 JSON REST API 可以在外部程序中很方便地调用 WordPress 网站的数据,比如可以用来制作app程序等。

但是,对于大多数用户来说,这个功能是几乎用不到的了,JSON REST API 采用 GET 请求方式来获取数据,这个为 DDOS 攻击提供了一个新的攻击途径,就像 XML-RPC 接口一样 。

解决方案

使用非插件方式解决

将下面代码添加到主题functions.php文件中,去除head里面输出的链接信息。


if ( version_compare( get_bloginfo( 'version' ), '4.7', '>=' ) ) {
    function lxtx_disable_rest_api( $access ) {
        return new WP_Error( 'rest_api_cannot_acess', '无访问权限', array( 'status' => rest_authorization_required_code() ) );
    }
    add_filter( 'rest_authentication_errors', 'lxtx_disable_rest_api' );
} else {
    // Filters for WP-API version 1.x
    add_filter( 'json_enabled', '__return_false' );
    add_filter( 'json_jsonp_enabled', '__return_false' );
    // Filters for WP-API version 2.x
    add_filter( 'rest_enabled', '__return_false' );
    add_filter( 'rest_jsonp_enabled', '__return_false' );
}
// 移除头部 wp-json 标签和 HTTP header 中的 link
remove_action('template_redirect', 'rest_output_link_header', 11 );
remove_action('wp_head', 'rest_output_link_wp_head', 10 );
remove_action('xmlrpc_rsd_apis', 'rest_output_rsd');

还可以通过rest_api_init这个钩子来禁用 REST API 的方法


add_filter( 'rest_api_init', 'lxtx_rest_only_for_authorized_users', 99 );
function lxtx_rest_only_for_authorized_users($wp_rest_server){
    if ( !is_user_logged_in() ) {
        wp_die('非法操作!');
    }
}

插件方式解决

在插件安装那里搜索 disable-json-api ,安装启动即可 。

插件不需要修改任何代码即可使用,方便快捷,但在一定程度上可能影响站点性能。需要自己取舍!!



转载请注明:清风亦平凡 » 禁用WordPress程序REST API功能

]]>
https://www.mlplus.net/2019/09/02/wordpressdisablejsonapi/feed/ 0
WordPress禁用xmlrpc.php接口 https://www.mlplus.net/2019/08/31/wordpressdenyxmlrpc/ https://www.mlplus.net/2019/08/31/wordpressdenyxmlrpc/#respond Sat, 31 Aug 2019 00:00:46 +0000 https://www.mlplus.net/?p=1811 最近遇到了大规模的针对wordpress后台暴力破解,验证码好像也没有什么用。经过了解发现是WordPressXMLRPC的接口问题。

XML-RPCWordPress 用于第三方客户端(如 WordPress iPhone 和安卓客户端,Windows Live Writer 等)的 API 接口,还可以用于 pingbacks trackbacks 端口,作为站点之间的通讯桥梁。

攻击方式

这种利用xmlrpc.php的攻击可以绕过限制。攻击的方式直接POST以下数据到xmlrpc.php


<?xml version="1.0" encoding="iso-8859-1"?>
<methodCall>
  <methodName>wp.getUsersBlogs</methodName>
  <params>
   <param><value>帐户名</value></param>
   <param><value>密码</value></param>
  </params>
</methodCall>

关于getUsersBlogs接口的更多信息可以参考官方的指南。 账户/密码错误返回为403.

关闭XML-RPC (pingback) 的功能

只需要在当前主题functions文件中添加以下代码即可关闭XML-RPC功能即可。


add_filter('xmlrpc_enabled', '__return_false');

禁用之后再进行调用将返回如下信息:

WordPress禁用xmlrpc.php接口-第0张图片

如果仅仅想关闭XML-RPCpingback端口,而不影响第三方离线发表功能,在当前主题functions文件中添加以下代码:


/**
 * WordPress 关闭 XML-RPC 的 pingback 端口
 */
add_filter( 'xmlrpc_methods', 'remove_xmlrpc_pingback_ping' );
function remove_xmlrpc_pingback_ping( $methods ) {
	unset( $methods['pingback.ping'] );
	return $methods;
}

Apache服务器

使用 .htaccess屏蔽xmlrpc.php


# protect xmlrpc
<Files xmlrpc.php>
Order Deny,Allow
Deny from all
</Files>

如果需要考虑authz_core_module模块的使用,可以使用以下规则。


<Files xmlrpc.php>
<IfModule mod_authz_core.c>
Require all denied
</IfModule>
<IfModule !mod_authz_core.c>
Order deny,allow
Deny from all
</IfModule>
</Files>

Nginx服务器


location ~* /xmlrpc.php { 
     deny all; 
}

其他解决方法

  • 安装Login Security Solution
  • 删除xmlrpc.php文件



转载请注明:清风亦平凡 » WordPress禁用xmlrpc.php接口

]]>
https://www.mlplus.net/2019/08/31/wordpressdenyxmlrpc/feed/ 0
PHP实现友情链接检测 https://www.mlplus.net/2018/07/23/phpchecklink/ https://www.mlplus.net/2018/07/23/phpchecklink/#respond Mon, 23 Jul 2018 09:50:38 +0000 http://www.skyfinder.cc/?p=170 朋友最近有一个需求,希望别人可以通过自己网站主动申请友情链接,但是申请被提交前必须进行检测,申请方的网站中必须先添加自己网站的链接。除此之外还需要使用PHP来进行实现,所以就有了这篇文字记录。

主要的PHP代码实现如下:


<?php
$max_allow_links = 100; // 最大许可检查的链接数目
function my_file_get_contents($url, $timeout = 30) {
    if (function_exists('curl_init')) {
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
        $file_contents = curl_exec($ch);
        curl_close($ch);
    } else if (ini_get('allow_url_fopen') == 1 || strtolower(ini_get('allow_url_fopen')) == 'on') {
        $file_contents = @file_get_contents($url);
    } else {
        $file_contents = '';
    }
    return $file_contents;
}
function isExistsContentUrl($url, &$retMsg, $mydomain = "") {
    if (!isset($url) || empty($url)) {
        $retMsg = "填写的URL为空";
        return false;
    }
    if (!isset($mydomain) || empty($mydomain)) {
        $mydomain = $_SERVER['SERVER_NAME'];
    }
    $resultContent = my_file_get_contents($url);
    if (trim($resultContent) == '') {
        $retMsg = "未获得URL相关数据,请重试!";
        return false;
    }
    if (strripos($resultContent, $mydomain)) {
        $retMsg = "检测已经通过!";
        return true;
    } else {
        $retMsg = "请确认您已经添加本站的连接";
        return false;
    }
}
//调用试例
$result = "";
$ret = isExistsContentUrl("https://www.mlplus.net", $result, "wordpress.org");
if ($ret) {
    echo '通过检测:' . $result;
} else {
    echo "检测未通过:" . $result;
}
?>

 

转载请注明:清风亦平凡 » PHP实现友情链接检测

]]>
https://www.mlplus.net/2018/07/23/phpchecklink/feed/ 0