当前位置: 首页 > news >正文

俄文网站制作查域名备案

俄文网站制作,查域名备案,网络赣州,做防水网站业务场景 IP黑白名单是网络安全管理中常见的策略工具,用于控制网络访问权限,根据业务场景的不同,其应用范围广泛,以下是一些典型业务场景: 服务器安全防护: 黑名单:可以用来阻止已知的恶意IP地…

业务场景

IP黑白名单是网络安全管理中常见的策略工具,用于控制网络访问权限,根据业务场景的不同,其应用范围广泛,以下是一些典型业务场景:

  1. 服务器安全防护

    • 黑名单:可以用来阻止已知的恶意IP地址或曾经尝试攻击系统的IP地址,防止这些来源对服务器进行未经授权的访问、扫描、攻击等行为。
    • 白名单:仅允许特定IP或IP段访问关键服务,比如数据库服务器、内部管理系统等,实现最小授权原则,降低被未知风险源入侵的可能性。
  2. 网站安全防护

    • 黑名单:对于频繁发起恶意请求、爬取数据、DDoS攻击等活动的IP,将其加入黑名单以限制其对网站的访问。
    • 白名单:如果只希望特定合作伙伴、内部员工或特定区域用户访问网站内容,则可通过白名单来限定合法访问者的范围。
  3. API接口保护

    • 对于对外提供的API接口,通过设置IP黑白名单,确保只有经过认证或信任的系统和客户端才能调用接口。

比如比较容易被盗刷的短信接口、文件接口,都需要添加IP黑白名单加以限制。

核心实现

获取客户端IP地址

@UtilityClass
public class IpUtils {private final String UNKNOWN = "unknown";private final String X_FORWARDED_FOR = "X-Forwarded-For";private final String PROXY_CLIENT_IP = "Proxy-Client-IP";private final String WL_PROXY_CLIENT_IP = "WL-Proxy-Client-IP";private final Pattern COMMA_SEPARATED_VALUES_PATTERN = Pattern.compile("\s*,\s*");/*** 默认情况下内网代理的子网可以是(后面有需要可以进行配置):* 1. 10/8* 2. 192.168/16* 3. 169.254/16* 4. 127/8* 5. 172.16/12* 6. ::1*/private final Pattern INTERNAL_PROXIES = Pattern.compile("10\.\d{1,3}\.\d{1,3}\.\d{1,3}|" +"192\.168\.\d{1,3}\.\d{1,3}|" +"169\.254\.\d{1,3}\.\d{1,3}|" +"127\.\d{1,3}\.\d{1,3}\.\d{1,3}|" +"172\.1[6-9]\.\d{1,3}\.\d{1,3}|" +"172\.2[0-9]\.\d{1,3}\.\d{1,3}|" +"172\.3[0-1]\.\d{1,3}\.\d{1,3}|" +"0:0:0:0:0:0:0:1|::1");/*** 获取请求的IP** @return 请求的IP*/public String getIp() {var requestAttributes = RequestContextHolder.getRequestAttributes();if (Objects.isNull(requestAttributes)) {return null;}var request = ((ServletRequestAttributes) requestAttributes).getRequest();var ip = getRemoteIp(request);if (!StringUtils.hasLength(ip) || UNKNOWN.equalsIgnoreCase(ip)) {ip = request.getHeader(PROXY_CLIENT_IP);}if (!StringUtils.hasLength(ip) || UNKNOWN.equalsIgnoreCase(ip)) {ip = request.getHeader(WL_PROXY_CLIENT_IP);}if (!StringUtils.hasLength(ip) || UNKNOWN.equalsIgnoreCase(ip)) {ip = request.getRemoteAddr();}return ip;}/*** 获取客户端真实IP地址,防止使用X-Forwarded-For进行IP伪造攻击,防御思路见类注释** @return 真实IP地址*/private String getRemoteIp(HttpServletRequest request) {var remoteIp = request.getRemoteAddr();var isInternal = INTERNAL_PROXIES.matcher(remoteIp).matches();if (isInternal) {var concatRemoteIpHeaderValue = new StringBuilder();for (var e = request.getHeaders(X_FORWARDED_FOR); e.hasMoreElements(); ) {if (concatRemoteIpHeaderValue.length() > 0) {concatRemoteIpHeaderValue.append(", ");}concatRemoteIpHeaderValue.append(e.nextElement());}var remoteIpHeaderValue = commaDelimitedListToArray(concatRemoteIpHeaderValue.toString());for (var i = remoteIpHeaderValue.length - 1; i >= 0; i--) {var currentRemoteIp = remoteIpHeaderValue[i];if (!INTERNAL_PROXIES.matcher(currentRemoteIp).matches()) {return currentRemoteIp;}}return null;} else {return remoteIp;}}private String[] commaDelimitedListToArray(String commaDelimitedStrings) {return (commaDelimitedStrings == null || commaDelimitedStrings.isEmpty())? new String[0]: COMMA_SEPARATED_VALUES_PATTERN.split(commaDelimitedStrings);}
}

获取到客户端IP后,我们只要比对客户端IP是否在配置的白名单/黑名单中即可。
为了简化使用,可以采用注解的方式进行拦截。

新增注解@IpCheck

/*** IP白名单校验*/
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD})
@Documented
@Inherited
public @interface IpCheck {/*** 白名单IP列表,支持${...}*/@AliasFor("whiteList")String value() default "";/*** 白名单IP列表,支持${...}*/@AliasFor("value")String whiteList() default "";/*** 黑名单IP列表,支持${...}*/String blackList() default "";}

新增IpCheckHandlerInterceptorImpl

我们实现HandlerInterceptor,在接口上进行拦截,如果不满足配置的黑白名单,则抛出异常。

/*** @author <a href="mailto:gcwm99@gmail.com">gcdd1993</a>* Created by gcdd1993 on 2023/9/20*/
@Component
public class IpCheckHandlerInterceptorImpl implements HandlerInterceptor, EmbeddedValueResolverAware {private StringValueResolver stringValueResolver;@Overridepublic boolean preHandle(@NonNull HttpServletRequest request,@NonNull HttpServletResponse response,@NonNull Object handler) {// 检查是否有IpWhitelistCheck注解,并且是否开启IP白名单检查if (!(handler instanceof HandlerMethod)) {return true;  // 如果没有注解或者注解中关闭了IP白名单检查,则继续处理请求}var handlerMethod = (HandlerMethod) handler;var method = handlerMethod.getMethod();var annotation = AnnotationUtils.getAnnotation(method, IpCheck.class);if (annotation == null) {return true;}var clientIp = IpUtils.getIp();// 检查客户端IP是否在白名单中var whiteList = Stream.of(Optional.ofNullable(stringValueResolver.resolveStringValue(annotation.whiteList())).map(it -> it.split(",")).orElse(new String[]{})).filter(StringUtils::hasText).map(String::trim).collect(Collectors.toUnmodifiableSet());if (!whiteList.isEmpty() && whiteList.contains(clientIp)) {return true; // IP在白名单中,继续处理请求}var blackList = Stream.of(Optional.ofNullable(stringValueResolver.resolveStringValue(annotation.blackList())).map(it -> it.split(",")).orElse(new String[]{})).filter(StringUtils::hasText).map(String::trim).collect(Collectors.toUnmodifiableSet());if (!blackList.isEmpty() && !blackList.contains(clientIp)) {return true; // IP不在黑名单中,继续处理请求}// IP不在白名单中,可以返回错误响应或者抛出异常// 例如,返回一个 HTTP 403 错误throw new RuntimeException("Access denied, remote ip " + clientIp + " is not allowed.");}@Overridepublic void setEmbeddedValueResolver(StringValueResolver resolver) {this.stringValueResolver = resolver;}
}

自动装配

核心逻辑写完了,该怎么使用呢?为了达到开箱即用的效果,我们可以接着新增自动装配的代码

新建IpCheckConfig

实现WebMvcConfigurer接口,添加接口拦截器

/*** @author <a href="mailto:gcwm99@gmail.com">gcdd1993</a>* Created by gcdd1993 on 2024/1/24*/
public class IpCheckConfig implements WebMvcConfigurer {@Resourceprivate IpCheckHandlerInterceptorImpl ipCheckHandlerInterceptor;@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(ipCheckHandlerInterceptor);}}

新建@EnableIpCheck

参考@EnableScheduling的实现,自己实现一个@EnableIpCheck,该注解可以控制功能是否启用

/*** @author <a href="mailto:gcwm99@gmail.com">gcdd1993</a>* Created by gcdd1993 on 2024/1/24*/
@Retention(value = RetentionPolicy.RUNTIME)
@Target(value = ElementType.TYPE)
@Documented
@ComponentScan("xxx.ip") // 这里是IpCheckConfig的包名
@Import(IpCheckConfig.class)
public @interface EnableIpCheck {
}

业务测试

简单地用代码来试验下效果

新建SampleApplication

@SpringBootApplication
@EnableIpCheck
public class SampleApplication {public static void main(String[] args) {SpringApplication.run(SampleApplication.class, args);}}

新建测试接口

@RestController
@RequestMapping("/sample/ip-checker")
public class IpCheckSample {@GetMapping("/white")@IpCheck(value = "0:0:0:0:0:0:0:1")String whiteList() {return "127.0.0.1";}@GetMapping("/black")@IpCheck(blackList = "0:0:0:0:0:0:0:1")String blackList() {return "127.0.0.1";}/*** 同时配置白名单和黑名单,要求IP既在白名单,并且不在黑名单,否则抛出异常*/@GetMapping("/all")@IpCheck(value = "0:0:0:0:0:0:0:1", blackList = "0:0:0:0:0:0:0:1")String all() {return "127.0.0.1";}/*** 同时配置白名单和黑名单,要求IP既在白名单,并且不在黑名单,否则抛出异常* 支持解析Spring 配置文件*/@GetMapping("/config")@IpCheck(value = "${digit.ip.check.white-list}", blackList = "${digit.ip.check.black-list}")String config() {return "127.0.0.1";}/*** 同时配置白名单和黑名单,要求IP既在白名单,并且不在黑名单,否则抛出异常* 支持解析Spring 配置文件*/@GetMapping("/black-config")@IpCheck(blackList = "${digit.ip.check.black-list}")String blackConfig() {return "127.0.0.1";}}

由于本机请求IP地址是0:0:0:0:0:0:0:1,所以这里使用0:0:0:0:0:0:0:1而不是127.0.0.1

访问/sample/ip-checker/white

接口返回127.0.0.1

访问/sample/ip-checker/black

java.lang.RuntimeException: Access denied, remote ip 0:0:0:0:0:0:0:1 is not allowed.

访问/sample/ip-checker/all

接口返回127.0.0.1

  • 既配置白名单,也配置黑名单,需要既不在白名单,同时在黑名单里,才会拦截。

修改配置

digit:ip:check:white-list: 127.0.0.1, 192.168.1.1, 192.168.1.2black-list: 127.0.0.1, 192.168.1.1, 192.168.1.2,0:0:0:0:0:0:0:1

访问/sample/ip-checker/black-config

java.lang.RuntimeException: Access denied, remote ip 0:0:0:0:0:0:0:1 is not allowed.

最后,可以结合配置中心,以便配置后立即生效。

业务场景

IP黑白名单是网络安全管理中常见的策略工具,用于控制网络访问权限,根据业务场景的不同,其应用范围广泛,以下是一些典型业务场景:

  1. 服务器安全防护

    • 黑名单:可以用来阻止已知的恶意IP地址或曾经尝试攻击系统的IP地址,防止这些来源对服务器进行未经授权的访问、扫描、攻击等行为。
    • 白名单:仅允许特定IP或IP段访问关键服务,比如数据库服务器、内部管理系统等,实现最小授权原则,降低被未知风险源入侵的可能性。
  2. 网站安全防护

    • 黑名单:对于频繁发起恶意请求、爬取数据、DDoS攻击等活动的IP,将其加入黑名单以限制其对网站的访问。
    • 白名单:如果只希望特定合作伙伴、内部员工或特定区域用户访问网站内容,则可通过白名单来限定合法访问者的范围。
  3. API接口保护

    • 对于对外提供的API接口,通过设置IP黑白名单,确保只有经过认证或信任的系统和客户端才能调用接口。

比如比较容易被盗刷的短信接口、文件接口,都需要添加IP黑白名单加以限制。

核心实现

获取客户端IP地址

@UtilityClass
public class IpUtils {private final String UNKNOWN = "unknown";private final String X_FORWARDED_FOR = "X-Forwarded-For";private final String PROXY_CLIENT_IP = "Proxy-Client-IP";private final String WL_PROXY_CLIENT_IP = "WL-Proxy-Client-IP";private final Pattern COMMA_SEPARATED_VALUES_PATTERN = Pattern.compile("\s*,\s*");/*** 默认情况下内网代理的子网可以是(后面有需要可以进行配置):* 1. 10/8* 2. 192.168/16* 3. 169.254/16* 4. 127/8* 5. 172.16/12* 6. ::1*/private final Pattern INTERNAL_PROXIES = Pattern.compile("10\.\d{1,3}\.\d{1,3}\.\d{1,3}|" +"192\.168\.\d{1,3}\.\d{1,3}|" +"169\.254\.\d{1,3}\.\d{1,3}|" +"127\.\d{1,3}\.\d{1,3}\.\d{1,3}|" +"172\.1[6-9]\.\d{1,3}\.\d{1,3}|" +"172\.2[0-9]\.\d{1,3}\.\d{1,3}|" +"172\.3[0-1]\.\d{1,3}\.\d{1,3}|" +"0:0:0:0:0:0:0:1|::1");/*** 获取请求的IP** @return 请求的IP*/public String getIp() {var requestAttributes = RequestContextHolder.getRequestAttributes();if (Objects.isNull(requestAttributes)) {return null;}var request = ((ServletRequestAttributes) requestAttributes).getRequest();var ip = getRemoteIp(request);if (!StringUtils.hasLength(ip) || UNKNOWN.equalsIgnoreCase(ip)) {ip = request.getHeader(PROXY_CLIENT_IP);}if (!StringUtils.hasLength(ip) || UNKNOWN.equalsIgnoreCase(ip)) {ip = request.getHeader(WL_PROXY_CLIENT_IP);}if (!StringUtils.hasLength(ip) || UNKNOWN.equalsIgnoreCase(ip)) {ip = request.getRemoteAddr();}return ip;}/*** 获取客户端真实IP地址,防止使用X-Forwarded-For进行IP伪造攻击,防御思路见类注释** @return 真实IP地址*/private String getRemoteIp(HttpServletRequest request) {var remoteIp = request.getRemoteAddr();var isInternal = INTERNAL_PROXIES.matcher(remoteIp).matches();if (isInternal) {var concatRemoteIpHeaderValue = new StringBuilder();for (var e = request.getHeaders(X_FORWARDED_FOR); e.hasMoreElements(); ) {if (concatRemoteIpHeaderValue.length() > 0) {concatRemoteIpHeaderValue.append(", ");}concatRemoteIpHeaderValue.append(e.nextElement());}var remoteIpHeaderValue = commaDelimitedListToArray(concatRemoteIpHeaderValue.toString());for (var i = remoteIpHeaderValue.length - 1; i >= 0; i--) {var currentRemoteIp = remoteIpHeaderValue[i];if (!INTERNAL_PROXIES.matcher(currentRemoteIp).matches()) {return currentRemoteIp;}}return null;} else {return remoteIp;}}private String[] commaDelimitedListToArray(String commaDelimitedStrings) {return (commaDelimitedStrings == null || commaDelimitedStrings.isEmpty())? new String[0]: COMMA_SEPARATED_VALUES_PATTERN.split(commaDelimitedStrings);}
}

获取到客户端IP后,我们只要比对客户端IP是否在配置的白名单/黑名单中即可。
为了简化使用,可以采用注解的方式进行拦截。

新增注解@IpCheck

/*** IP白名单校验*/
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD})
@Documented
@Inherited
public @interface IpCheck {/*** 白名单IP列表,支持${...}*/@AliasFor("whiteList")String value() default "";/*** 白名单IP列表,支持${...}*/@AliasFor("value")String whiteList() default "";/*** 黑名单IP列表,支持${...}*/String blackList() default "";}

新增IpCheckHandlerInterceptorImpl

我们实现HandlerInterceptor,在接口上进行拦截,如果不满足配置的黑白名单,则抛出异常。

/*** @author <a href="mailto:gcwm99@gmail.com">gcdd1993</a>* Created by gcdd1993 on 2023/9/20*/
@Component
public class IpCheckHandlerInterceptorImpl implements HandlerInterceptor, EmbeddedValueResolverAware {private StringValueResolver stringValueResolver;@Overridepublic boolean preHandle(@NonNull HttpServletRequest request,@NonNull HttpServletResponse response,@NonNull Object handler) {// 检查是否有IpWhitelistCheck注解,并且是否开启IP白名单检查if (!(handler instanceof HandlerMethod)) {return true;  // 如果没有注解或者注解中关闭了IP白名单检查,则继续处理请求}var handlerMethod = (HandlerMethod) handler;var method = handlerMethod.getMethod();var annotation = AnnotationUtils.getAnnotation(method, IpCheck.class);if (annotation == null) {return true;}var clientIp = IpUtils.getIp();// 检查客户端IP是否在白名单中var whiteList = Stream.of(Optional.ofNullable(stringValueResolver.resolveStringValue(annotation.whiteList())).map(it -> it.split(",")).orElse(new String[]{})).filter(StringUtils::hasText).map(String::trim).collect(Collectors.toUnmodifiableSet());if (!whiteList.isEmpty() && whiteList.contains(clientIp)) {return true; // IP在白名单中,继续处理请求}var blackList = Stream.of(Optional.ofNullable(stringValueResolver.resolveStringValue(annotation.blackList())).map(it -> it.split(",")).orElse(new String[]{})).filter(StringUtils::hasText).map(String::trim).collect(Collectors.toUnmodifiableSet());if (!blackList.isEmpty() && !blackList.contains(clientIp)) {return true; // IP不在黑名单中,继续处理请求}// IP不在白名单中,可以返回错误响应或者抛出异常// 例如,返回一个 HTTP 403 错误throw new RuntimeException("Access denied, remote ip " + clientIp + " is not allowed.");}@Overridepublic void setEmbeddedValueResolver(StringValueResolver resolver) {this.stringValueResolver = resolver;}
}

自动装配

核心逻辑写完了,该怎么使用呢?为了达到开箱即用的效果,我们可以接着新增自动装配的代码

新建IpCheckConfig

实现WebMvcConfigurer接口,添加接口拦截器

/*** @author <a href="mailto:gcwm99@gmail.com">gcdd1993</a>* Created by gcdd1993 on 2024/1/24*/
public class IpCheckConfig implements WebMvcConfigurer {@Resourceprivate IpCheckHandlerInterceptorImpl ipCheckHandlerInterceptor;@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(ipCheckHandlerInterceptor);}}

新建@EnableIpCheck

参考@EnableScheduling的实现,自己实现一个@EnableIpCheck,该注解可以控制功能是否启用

/*** @author <a href="mailto:gcwm99@gmail.com">gcdd1993</a>* Created by gcdd1993 on 2024/1/24*/
@Retention(value = RetentionPolicy.RUNTIME)
@Target(value = ElementType.TYPE)
@Documented
@ComponentScan("xxx.ip") // 这里是IpCheckConfig的包名
@Import(IpCheckConfig.class)
public @interface EnableIpCheck {
}

业务测试

简单地用代码来试验下效果

新建SampleApplication

@SpringBootApplication
@EnableIpCheck
public class SampleApplication {public static void main(String[] args) {SpringApplication.run(SampleApplication.class, args);}}

新建测试接口

@RestController
@RequestMapping("/sample/ip-checker")
public class IpCheckSample {@GetMapping("/white")@IpCheck(value = "0:0:0:0:0:0:0:1")String whiteList() {return "127.0.0.1";}@GetMapping("/black")@IpCheck(blackList = "0:0:0:0:0:0:0:1")String blackList() {return "127.0.0.1";}/*** 同时配置白名单和黑名单,要求IP既在白名单,并且不在黑名单,否则抛出异常*/@GetMapping("/all")@IpCheck(value = "0:0:0:0:0:0:0:1", blackList = "0:0:0:0:0:0:0:1")String all() {return "127.0.0.1";}/*** 同时配置白名单和黑名单,要求IP既在白名单,并且不在黑名单,否则抛出异常* 支持解析Spring 配置文件*/@GetMapping("/config")@IpCheck(value = "${digit.ip.check.white-list}", blackList = "${digit.ip.check.black-list}")String config() {return "127.0.0.1";}/*** 同时配置白名单和黑名单,要求IP既在白名单,并且不在黑名单,否则抛出异常* 支持解析Spring 配置文件*/@GetMapping("/black-config")@IpCheck(blackList = "${digit.ip.check.black-list}")String blackConfig() {return "127.0.0.1";}}

由于本机请求IP地址是0:0:0:0:0:0:0:1,所以这里使用0:0:0:0:0:0:0:1而不是127.0.0.1

访问/sample/ip-checker/white

接口返回127.0.0.1

访问/sample/ip-checker/black

java.lang.RuntimeException: Access denied, remote ip 0:0:0:0:0:0:0:1 is not allowed.

访问/sample/ip-checker/all

接口返回127.0.0.1

  • 既配置白名单,也配置黑名单,需要既不在白名单,同时在黑名单里,才会拦截。

修改配置

digit:ip:check:white-list: 127.0.0.1, 192.168.1.1, 192.168.1.2black-list: 127.0.0.1, 192.168.1.1, 192.168.1.2,0:0:0:0:0:0:0:1

访问/sample/ip-checker/black-config

java.lang.RuntimeException: Access denied, remote ip 0:0:0:0:0:0:0:1 is not allowed.

最后,可以结合配置中心,以便配置后立即生效。


文章转载自:
http://quinin.xhqr.cn
http://radectomy.xhqr.cn
http://unbloody.xhqr.cn
http://chromide.xhqr.cn
http://pitchblende.xhqr.cn
http://kazakstan.xhqr.cn
http://rudimentary.xhqr.cn
http://unvoiced.xhqr.cn
http://lodgment.xhqr.cn
http://bowl.xhqr.cn
http://shmegegge.xhqr.cn
http://petalage.xhqr.cn
http://townie.xhqr.cn
http://amenities.xhqr.cn
http://mawl.xhqr.cn
http://procural.xhqr.cn
http://burundi.xhqr.cn
http://sat.xhqr.cn
http://teetotum.xhqr.cn
http://exploratory.xhqr.cn
http://compadre.xhqr.cn
http://calciphobous.xhqr.cn
http://luminiferous.xhqr.cn
http://spiritually.xhqr.cn
http://reapportionment.xhqr.cn
http://chlormadinone.xhqr.cn
http://lederhosen.xhqr.cn
http://fatshedera.xhqr.cn
http://maori.xhqr.cn
http://hypsicephalous.xhqr.cn
http://garbiologist.xhqr.cn
http://bladderwort.xhqr.cn
http://unifacial.xhqr.cn
http://foresaw.xhqr.cn
http://aurochs.xhqr.cn
http://attainment.xhqr.cn
http://unplausible.xhqr.cn
http://ppm.xhqr.cn
http://foldboating.xhqr.cn
http://darkle.xhqr.cn
http://zinkite.xhqr.cn
http://flickeringly.xhqr.cn
http://carbonnade.xhqr.cn
http://vitiation.xhqr.cn
http://caboose.xhqr.cn
http://behtlehem.xhqr.cn
http://salvationism.xhqr.cn
http://declivity.xhqr.cn
http://preventive.xhqr.cn
http://schottische.xhqr.cn
http://recuperator.xhqr.cn
http://megass.xhqr.cn
http://freely.xhqr.cn
http://exceeding.xhqr.cn
http://goodish.xhqr.cn
http://tui.xhqr.cn
http://rocksy.xhqr.cn
http://blackhead.xhqr.cn
http://rory.xhqr.cn
http://dishwatery.xhqr.cn
http://antrustion.xhqr.cn
http://crambo.xhqr.cn
http://detonation.xhqr.cn
http://melian.xhqr.cn
http://everbearing.xhqr.cn
http://extracondensed.xhqr.cn
http://chromite.xhqr.cn
http://biosatellite.xhqr.cn
http://taillight.xhqr.cn
http://seacopter.xhqr.cn
http://chagal.xhqr.cn
http://polytonalism.xhqr.cn
http://nonmember.xhqr.cn
http://celiotomy.xhqr.cn
http://brusquerie.xhqr.cn
http://felicitously.xhqr.cn
http://knuckleheaded.xhqr.cn
http://issuance.xhqr.cn
http://expansion.xhqr.cn
http://clupeoid.xhqr.cn
http://enquirer.xhqr.cn
http://plagiarist.xhqr.cn
http://zoophytology.xhqr.cn
http://inarm.xhqr.cn
http://lawrentian.xhqr.cn
http://autecological.xhqr.cn
http://conceiver.xhqr.cn
http://foraminiferan.xhqr.cn
http://noncellulosic.xhqr.cn
http://unsavoury.xhqr.cn
http://ahd.xhqr.cn
http://ocap.xhqr.cn
http://encephalic.xhqr.cn
http://botany.xhqr.cn
http://detention.xhqr.cn
http://commutate.xhqr.cn
http://rookery.xhqr.cn
http://acpi.xhqr.cn
http://faldstool.xhqr.cn
http://skee.xhqr.cn
http://www.15wanjia.com/news/92019.html

相关文章:

  • 聊城做网站的公司行情商务软文写作300
  • 网站飘动广州最新政策
  • 个人网站可以做导购吗广州网站排名优化公司
  • 专做批发的网站有哪些如何写软文
  • 松江专业做网站贵港seo
  • 赤峰做网站公司seo关键词优化系统
  • 网站建设公司能力要求百度账号注册入口
  • 怎样找网站长春网站优化指导
  • 快站微信网站制作网络推广要求
  • 北京网站设计学校南宁一站网网络技术有限公司
  • 山西建设网站百度关键词推广怎么做
  • wordpress建站打不开二级页面日本比分预测最新分析
  • wordpress代码高亮知乎seo外包费用
  • 昆明网站建设教学视频手机网址大全123客户端下载
  • 郑州网站建设找汉狮seo网站外链工具
  • b to b网站建设模式国际站seo优化是什么意思
  • WordPress单拦主题郑州靠谱seo整站优化
  • php 简单购物网站草根站长工具
  • 移动端网站模板网站域名备案查询
  • 某集团中英文双语网站源码东莞推广平台有哪些
  • 如何做网站的维护本周新闻热点
  • 宁乡电商网站建设报价搜索引擎营销的内容
  • 建设网站如何进行网站备案营销手段有哪些
  • 呢喃wordpress 模板抖音seo点击软件排名
  • 杭州设计公司招聘北京seo排名技术
  • 怎么做网站的图片域名注册商怎么查
  • 免费的视频app哪个好用关键词优化快速排名
  • 用旧手机做网站成人短期技能培训
  • 潮州东莞网站建设网站关键词排名优化工具
  • 安徽省建筑工程信息查询杭州seo公司排名