分类 技术 下的文章

WordPress 是迄今为止最流行的博客平台。

正由于它的流行,也因此带来了正面和负面的影响。事实上,几乎每个人都使用它,使它更容易被发现漏洞。WordPress 的开发人员做了很多工作,一旦新的缺陷被发现,就会发布修复和补丁,但这并不意味着你可以安装完就置之脑后。

在这篇文章中,我们将提供一些最常见的保护和强化 WordPress 网站的方法。

在登录后台时总是使用 SSL

不用说的是,如果你并不打算只是做一个随意的博客,你应该总是使用 SSL。不使用加密连接登录到你的网站会暴露你的用户名和密码。任何人嗅探流量都可能会发现你的密码。如果你使用 WiFi 上网或者连接到一个公共热点,那么你被黑的几率更高,这是特别真实的。你可以从这里获取受信任的免费 SSL 证书。

精心挑选附加的插件

由第三方开发人员所开发,每个插件的质量和安全性总是值得怀疑,并且它仅取决于其开发人员的经验。当安装任何额外的插件时,你应该仔细选择,并考虑其受欢迎程度以及插件的维护频率。应该避免维护不良的插件,因为它们更容易出现易于被利用的错误和漏洞。

此主题也是上一个关于 SSL 主题的补充,因为许多插件包含的脚本会发出不安全连接(HTTP)的请求。只要你的网站通过 HTTP 访问,一切似乎很好。但是,一旦你决定使用加密并强制使用 SSL 访问,则会立即导致网站的功能被破坏,因为当你使用 HTTPS 访问其他网站时,这些插件上的脚本将继续通过 HTTP 提供请求。

安装 Wordfence

Wordfence 是由 Feedjit Inc. 开发的,Wordfence 是目前最流行的 WordPress 安全插件,并且是每个严肃的 WordPress 网站必备的,特别是那些使用 WooCommerce 或其它的 WordPress 电子商务平台的网站。

Wordfence 不只是一个插件,因为它提供了一系列加强您的网站的安全功能。它具有 web 程序防火墙、恶意软件扫描、实时流量分析器和各种其它工具,它们可以提高你网站的安全性。防火墙将默认阻止恶意登录尝试,甚至可以配置为按照 IP 地址范围来阻止整个国家/地区的访问。我们真正喜欢 Wordfence 的原因是,即使你的网站因为某些原因被侵害,例如恶意脚本,Wordfence 可以在安装以后扫描和清理你的网站上被感染的文件。

该公司提供这个插件的免费和付费订阅计划,但即使是免费计划,你的网站仍将获得令人满意的水平。

用额外的密码锁住 /wp-admin 和 /wp-login.php

保护你的 WordPress 后端的另一个步骤是使用额外的密码保护任何除了你以外不打算让任何人使用的目录(即URL)。 /wp-admin 目录属于此关键目录列表。 如果你不允许普通用户登录 WordPress,你应该使用密码限制对 wp.login.php 文件的访问。无论是使用 Apache 还是 Nginx,你都可以访问这两篇文章,了解如何额外保护 WordPress 安装。

禁用/停止用户枚举

这是攻击者发现你网站上的有效用户名的一种相当简单的方法(即找出管理员用户名)。那么它是如何工作的?这很简单。在任何 WordPress 站点上的主要 URL 后面跟上 /?author=1 即可。 例如:wordpressexample.com/?author=1

要保护您的网站免受此影响,只需安装停止用户枚举插件。

禁用 XML-RPC

RPC 代表远程过程调用,它可以用来从位于网络上另一台计算机上的程序请求服务的协议。对于 WordPress 来说,XML-RPC 允许你使用流行的网络博客客户端(如 Windows Live Writer)在你的 WordPress 博客上发布文章,如果你使用 WordPress 移动应用程序那么也需要它。 XML-RPC 在早期版本中被禁用,但是从 WordPress 3.5 时它被默认启用,这让你的网站面临更大的攻击可能。虽然各种安全研究人员建议这不是一个大问题,但如果你不打算使用网络博客客户端或 WP 的移动应用程序,你应该禁用 XML-RPC 服务。

有多种方法可以做到这一点,最简单的是安装禁用 XML-RPC插件。


via: https://www.rosehosting.com/blog/5-tips-for-securing-your-wordpress-sites/

作者:<rosehosting.com> 译者:geekpi 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

Global Menus in Kde Plasma 5.9

全局菜单是 KDE Plasma 5.9 这个最新的 KDE 桌面环境主版本中的最有趣的功能之一。

全局菜单允许用户将 应用程序菜单 application menu 放到程序内,作为标题栏按钮或放到屏幕顶部的组件面板中。

全局菜单是一个用户渴望的令人兴奋的功能,但不幸的是,由于某些原因,如果你不知道在哪里找到它,启用它可能有点复杂。

在本教程中,我们将了解如何启用“标题栏按钮”和“应用程序组件”菜单。

标题栏按钮

Titlebar Button Plasma 5.9

Plasma 5.9 中 Konsole 的标题栏按钮 widget

标题栏按钮是放置在标题栏中的一个小图标,用户可以通过点击它来访问应用程序菜单。要启用它,打开 系统设置 System Settings 并进入 应用程序样式 Application Style 选项。 在 组件样式 Widget Style 设置中,进入 微调 Fine Tuning 选项卡,然后选择 标题栏按钮 Title bar button 作为 菜单样式 Menubar style 选项。

The Widget Style panel

组件样式面板

在此之后,要使用它,你需要手动放置标题按钮,因为它不是自动出现的。

为此,请进入 应用程序样式 Application Style 窗口装饰 Windows Decoration 。进入 按钮 Buttons 选项卡,并将小的 应用程序菜单 Application Menu 图标拖动到 标题栏按钮 Title bar 中。

Drag this button into the titlebar

拖动这个按钮到标题栏中

现在你可以在任何有应用菜单的程序中看到标题栏按钮了。

应用程序菜单组件

Application Menu Bar in Plasma 5.9

Plasma 5.9 中的应用菜单面板

要启用应用程序菜单组件,请在 微调 Fine Tuning 选项卡的 菜单样式 Menu Style 选项中选择相关条目。

在桌面上右键单击,然后选择 添加面板 Add Panel -> 应用程序菜单栏 Application Menu Bar

如你所见,如果你不知道在哪里找到它,启用“全局菜单”可能会有点复杂。无论如何,虽然我非常感谢 KDE 团队为这个新的 Plasma 主要版本做了出色的工作,但是我希望他们继续提高桌面可用性,让那些不想花时间在互联网上搜索这样的教程的人而言,使这个新的有趣的功能更容易启用。


via: http://fasterland.net/activate-global-menu-kde-plasma-5-9.html

作者:Francesco Mondello 译者:geekpi 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

你是否很恼火地发现你的浏览器、智能手机和平板上不装广告拦截器不行? 至少我是这样的。我家里有一些“智能”设备,但是它们似乎没有任何类型的广告拦截软件。 好了,我了解到 Pi-hole 是一个可以运行在树莓派板子上的广告拦截软件,它能在各种广告到达你的设备之前拦截它们。它允许你将任何域加入到黑名单或白名单,并且它有一个很好的仪表盘面板,可以让你深入了解你的家庭网络最常访问的域/网站、最活跃的设备和最常见的广告商。

Pi-hole 原本是运行在树莓派上的,但我想知道它能否在我运行 Armbian Linux 的廉价 Orange Pi 上运行。 好吧,它绝对可以!下面是我让 Pi-hole 能快速运行的方法。

安装 Pi-hole

安装 Pi-hole 是使用终端完成的,所以打开你的 Orange Pi 桌面上的终端或使用 ssh 连接。

因为需要下载软件,所以进入到一个你选定的目录,确保你有写入权限。像这样:

cd <your preferred directory>/

我没有选择 Pi-hole 主页上的“单条命令”安装方式。 我的意思是,他们在那条命令下面写着“用管道到 bash 可能是危险的”,本地安装“更安全”。所以,这里是我的本地安装步骤:

git clone --depth 1 https://github.com/pi-hole/pi-hole.git Pi-hole
cd Pi-hole/automated\ install/
./basic-install.sh

如果你没有以 root 用户身份登录,那么这个安装脚本将提示你输入密码,然后再继续。 如果需要,脚本将下载并安装一些必备的 Linux 软件包。接着它会显示一个红蓝界面,提示你回答有关如何配置 Pi-hole 的几个问题。以我的经验,直接接受默认值就可以了,我后来发现 Pi-hole 的 web 应用可以让你更改设置,比如 DNS 提供商。

该脚本将告诉你在图形界面和终端中 Pi-hole 的密码。 请记住该密码!

脚本还会告诉你 Pi-hole 的网址,应该像这样:

http://<your pi’s IP address>/admin

或者类似这样:

http://orangepipc/admin

输入 Pi-hole 密码,接着你会看到像下面这样的漂亮的仪表盘面板:

Ph-hole

请记住更改家庭网络路由器上的 DNS 设置并使用你的 Orange Pi 的地址。 否则,广告不会被过滤!

上面的说明与 Pi-hole 网站提供的替代“安全”方法大致相同,尽管 Armbian 没有被列为官方支持的操作系统。我相信这些说明应该在树莓派或其他运行某种形式的基于 Debian 的 Linux 操作系统的 Pi 上工作。但是,我并没有测试这一点,所以期待听到你的经验(请给我留下简短的评论)。

思考和观察

运行 Pi-hole 一段时间,并研究了在 Pi-hole 面板上出现的信息后,我发现有很多我不知道的网络活动在进行,而它们并不都是我批准的活动。例如,有一些我不知道的关于游戏程序的“有趣”连接从我的孩子的设备上发出,还有社交网络程序显然一直在给我发送骚扰数据。总之,无论是否是无害流量,我很高兴减少了流量负载,即使仅减少了一点点……我的意思是,为什么我应该允许我不想要的或者不关心的应用程序和广告吃掉我的网络流量?好吧,现在他们被封锁了。

像这样为 Orange Pi 设置广告屏蔽很便宜、容易,限制一些不必要的流量在我的家庭网络中进出(特别是与孩子们相关的)使我感到放松多了。如果有兴趣,你可以看看我的上一篇文章,如何轻松设置一个 Orange Pi,并使用下面的链接来查看 Orange Pi 是多么便宜。我相信这是一个值得的投资。

更新:具有讽刺意味的是,如果你成功地按照这篇文章设置了 Pi-hole,这个站点上(s.click.aliexpress.com)的受益链接会被屏蔽,是否将它加入到白名单取决于你。


via: http://piboards.com/2017/01/07/block-ads-on-all-your-devices-at-home-with-pi-hole-and-an-orange-pi/

作者:MIKE WILMOTH 译者:geekpi 校对:jasminepeng

本文由 LCTT 原创编译,Linux中国 荣誉推出

介绍

作为一名 Linux 系统管理员,你有时必须向系统添加新的用户帐户。为此,经常使用 adduser 命令。当涉及到多个用户的创建时,adduser 命令可能会变得相当无聊和耗时。这篇短文旨在为 Linux 系统管理员提供一种简单而无人值守的方式来批量创建用户。newusers 命令将帮助你通过从预填文件中获取信息来创建多个用户。

要求

访问 Linux 计算机的特权。

约定

  • # - 给定命令需要以 root 用户权限运行或者使用 sudo 命令
  • $ - 给定命令以常规权限用户运行

如何进行

创建一个包含用户名的文件

首先,你需要创建一个包含用户名列表的文件。

$ vi users-list.txt

在文件中,一个用户一行,下面是样式:

Username:Password:User ID:Group ID:User Info:Home Directory:Default Shell
Username:Password:User ID:Group ID:User Info:Home Directory:Default Shell
Username:Password:User ID:Group ID:User Info:Home Directory:Default Shell
...

创建用户

在创建了包含用户信息的文件后,使用 newusers 命令创建用户。

# newusers users-list.txt

检查用户账户

最后你可以确认用户已经正确创建了,在 /etc/passwd 文件中查看它们:

# tail /etc/passwd

using newusers for bulk user creation


via: https://linuxconfig.org/simple-way-for-unattended-bulk-user-creation-in-linux

作者:Essodjolo Kahanam 译者:geekpi 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

rtop 是一个基于 SSH 的直接的交互式远程系统监控工具,它收集并显示重要的系统性能指标,如 CPU、磁盘、内存和网络指标。

它用 Go 语言编写,不需要在要监视的服务器上安装任何额外的程序,除了 SSH 服务器和登录凭据。

rtop 基本上是通过启动 SSH 会话和在远程服务器上执行某些命令来收集各种系统性能信息。

一旦 SSH 会话建立,它每隔几秒(默认情况下为 5 秒)刷新来自远程服务器收集的信息,类似于 Linux 中的所有其它类似 top 的使用程序(如 htop)

安装要求:

要安装 rtop 确保你已经在 Linux 中安装了 Go(GoLang)1.2 或更高版本,否则请点击下面的链接根据步骤安装 GoLang:

如何在 Linux 系统中安装 rtop

如果你已经安装了 Go,运行下面的命令构建 rtop:

$ go get github.com/rapidloop/rtop

命令完成后 rtop 可执行程序会保存在 $GOPATH/bin 或者 $GOBIN 中。

Build rtop in Linux

在 Linux 中构建 rtop

注意:使用 rtop 不需要任何运行时环境或配置。

如何在 Linux 系统中使用 rtop

尝试不用任何标志或参数运行 rtop, 会显示如下信息:

$ $GOBIN/rtop

示例输出:

rtop 1.0 - (c) 2015 RapidLoop - MIT Licensed - http://rtop-monitor.org
rtop monitors server statistics over an ssh connection
Usage: rtop [-i private-key-file] [user@]host[:port] [interval]
-i private-key-file
PEM-encoded private key file to use (default: ~/.ssh/id_rsa if present)
[user@]host[:port]
the SSH server to connect to, with optional username and port
interval
refresh interval in seconds (default: 5)

现在让我们用 rtop 监控远程 Linux 服务器,默认每 5 秒刷新收集到的信息:

$ $GOBIN/rtop [email protected] 

rtop - Monitor Remote Linux Server

rtop – 监控远程 Linux 主机

命令会每隔 10 秒刷新系统性能指标:

$ $GOBIN/rtop [email protected] 10

rtop 同样可以使用 ssh-agent、密钥或者密码授权连接。

总结一下,rtop 是一个简单易用的远程服务器监控工具,它使用非常少且直白的选项。你可以阅读服务器中其他监控系统的命令行工具来提高你的 Linux 性能监控技能。

最后,在下面的评论栏中留下你的任何问题和想法。


作者简介:

Aaron Kili 是 Linux 和 F.O.S.S 爱好者,将来的 Linux SysAdmin 和 web 开发人员,目前是 TecMint 的内容创建者,他喜欢用电脑工作,并坚信分享知识。


via: http://www.tecmint.com/rtop-monitor-remote-linux-server-over-ssh/

作者:Aaron Kili 译者:geekpi 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

在本文中, 我将根据我的实际经验,为大家阐述一个编写测试用例的最佳实践。在本文中我将使用 Espresso 编码, 但是它们可以用到单元测试和 仪器测试 instrumentation test 当中。基于以上目的,我们来研究一个新闻程序。

以下内容纯属虚构,如有雷同纯属巧合 :P

一个新闻 APP 应该会有以下这些 activity。

  • 语言选择 - 当用户第一次打开软件, 他必须至少选择一种语言。选择后,选项保存在共享偏好中,用户跳转到新闻列表 activity。
  • 新闻列表 - 当用户来到新闻列表 activity,将发送一个包含语言参数的请求到服务器,并将服务器返回的内容显示在 recycler view 上(包含有新闻列表的 id, news\_list)。 如果共享偏好中未存语言参数,或者服务器没有返回一个成功消息, 就会弹出一个错误对话框并且 recycler view 将不可见。如果用户只选择了一种语言,新闻列表 activity 有个 “Change your Language” 的按钮,或者如果用户选择多种语言,则按钮为 “Change your Languages” 。 (我对天发誓这是一个虚构的 APP 软件)
  • 新闻细节 - 如同名字所述, 当用户点选新闻列表项时将启动这个 activity。

这个 APP 功能已经足够,,让我们深入研究下为新闻列表 activity 编写的测试用例。 这是我第一次写的代码。

/*
    Click on the first news item.
    It should open NewsDetailActivity
     */
    @Test
    public void testClickOnAnyNewsItem() {
        onView(allOf(withId(R.id.news_list), isDisplayed())).perform(RecyclerViewActions
                .actionOnItemAtPosition(1, click()));
        intended(hasComponent(NewsDetailsActivity.class.getName()));
    }


  /**
   * To test the correct text on the button
   */
  @Test
  public void testChangeLanguageFeature() {
    int count = UserPreferenceUtil.getSelectedLanguagesCount();
    if (count == 1) {
      onView(withText("Choose your Language")).check(matches(isDisplayed()));
    } else if (count > 1) {
      onView(withText("Choose your Languages")).check(matches(isDisplayed()));
    }
 ?}

仔细想想测试什么

在第一个测试用例 testClickOnAnyNewsItem(), 如果服务器没有返回成功信息,测试用例将会返回失败,因为 recycler view 是不可见的。但是这个测试用例的目的并非如此。 不管该用例为 PASS 还是 FAIL,它的最低要求是 recycler view 总是可见的, 如果因某种原因,recycler view 不可见,那么测试用例不应视为 FAILED。正确的测试代码应该像下面这个样子。

 /*
  Click on any news item.
  It should open NewsDetailActivity
   */
  @Test
  public void testClickOnAnyNewsItem() {
    try {
            /*To test this case, we need to have recyclerView present. If we don't have the
            recyclerview present either due to the presence of error_screen, then we should consider
            this test case successful. The test case should be unsuccesful only when we click on a
            news item and it doesn't open NewsDetail activity
            */
      ViewInteraction viewInteraction = onView(withId(R.id.news_list));
      viewInteraction.check(matches(isDisplayed()));
    } catch (NoMatchingViewException e) {
      return;
    } catch (AssertionFailedError e) {
      return;
    }
 &nbsp; &nbsp;//在这里我们确信,news_list的 recyclerview 对用户是可见的。
 &nbsp; &nbsp;onView(allOf(withId(R.id.news_list), isDisplayed())).perform(RecyclerViewActions
        .actionOnItemAtPosition(1, click()));
    intended(hasComponent(NewsDetailsActivity.class.getName()));
  }
}

一个测试用例本身应该是完整的

当我开始测试, 我通常按如下顺序测试 activity:

  • 语言选择
  • 新闻列表
  • 新闻细节

因为我首先测试语言选择 activity,在测试 NewsList activity 之前,总有一种语言已经是选择好了的。但是当我先测试新闻列表 activity 时,测试用例开始返回错误信息。原因很简单 - 没有选择语言,recycler view 不会显示。注意, 测试用例的执行顺序不能影响测试结果。 因此在运行测试用例之前, 语言选项必须是保存在共享偏好中的。在本例中,测试用例独立于语言选择 activity 的测试。

@Rule
  public ActivityTestRule activityTestRule =
      new ActivityTestRule(TopicsActivity.class, false, false);

  /*
  Click on any news item.
  It should open NewsDetailActivity
   */
  @Test
  public void testClickOnAnyNewsItem() {
    UserPreferenceUtil.saveUserPrimaryLanguage("english");
    Intent intent = new Intent();
    activityTestRule.launchActivity(intent);
    try {
      ViewInteraction viewInteraction = onView(withId(R.id.news_list));
      viewInteraction.check(matches(isDisplayed()));
    } catch (NoMatchingViewException e) {
      return;
    } catch (AssertionFailedError e) {
      return;
    }
    onView(allOf(withId(R.id.news_list), isDisplayed())).perform(RecyclerViewActions
        .actionOnItemAtPosition(1, click()));
    intended(hasComponent(NewsDetailsActivity.class.getName()));
 ?}

在测试用例中避免使用条件代码

现在在第二个测试用例 testChangeLanguageFeature() 中,我们获取到用户选择语言的个数,基于这个数目,我们写了 if-else 条件来进行测试。 但是 if-else 条件应该写在你的代码当中,而不是测试代码里。每一个条件应该单独测试。 因此,在本例中,不是只写一条测试用例,而是要写如下两个测试用例。

/**
   * To test the correct text on the button when only one language is selected.
   */
  @Test
  public void testChangeLanguageFeatureForSingeLanguage() {
    //Other initializations
    UserPreferenceUtil.saveSelectedLanguagesCount(1);
    Intent intent = new Intent();
    activityTestRule.launchActivity(intent);
      onView(withText("Choose your Language")).check(matches(isDisplayed()));
  }

  /**
   * To test the correct text on the button when more than one language is selected.
   */
  @Test
  public void testChangeLanguageFeatureForMultipleLanguages() {
    //Other initializations
    UserPreferenceUtil.saveSelectedLanguagesCount(5); //Write anything greater than 1.
    Intent intent = new Intent();
    activityTestRule.launchActivity(intent);
    onView(withText("Choose your Languages")).check(matches(isDisplayed()));
  }

测试用例应该独立于外部因素

在大多数应用中,我们与外部网络或者数据库进行交互。一个测试用例运行时可以向服务器发送一个请求,并获取成功或失败的返回信息。但是不能因从服务器获取到失败信息,就认为测试用例没有通过。这样想这个问题 - 如果测试用例失败,然后我们修改客户端代码,以便测试用例通过。 但是在本例中, 我们要在客户端进行任何更改吗?- NO

但是你应该也无法完全避免要测试网络请求和响应。由于服务器是一个外部代理,我们可以设想一个场景,发送一些可能导致程序崩溃的错误响应。因此,你写的测试用例应该覆盖所有可能来自服务器的响应,甚至包括服务器决不会发出的响应。这样可以覆盖所有代码,并能保证应用可以处理所有响应,而不会崩溃。

正确的编写测试用例与编写这些测试代码同等重要。

感谢你阅读此文章。希望对测试用例写的更好有所帮助。你可以在 LinkedIn 上联系我。还可以在这里阅读我的其他文章。

获取更多资讯请关注我们, 我们发新文章时您将获得通知。


via: https://blog.mindorks.com/the-dos-and-don-ts-of-writing-test-cases-in-android-70f1b5dab3e1#.lfilq9k5e

作者:Anshul Jain 译者:kokialoves 校对:jasminepeng

本文由 LCTT 原创编译,Linux中国 荣誉推出