繁体   English   中英

我怎么知道我是否被黑客入侵了?

[英]How do I know if I'm being hacked?

我正在 LAMP 服务器上构建一个小型站点,并且已经好几天没有登录了。 我今天登录进行一些更改,在检查错误日志后,我发现在过去的 2 天里,我每隔 20 分钟左右就会出现以下错误:


[Tue Jan 10 17:35:49.638900 2023] [php:error] [pid 613684] [client 34.210.246.88:16546] script '/var/www/myfirstsite.com/public_html/.\\login.php' not found or unable to stat

然后今天下午间歇性地我得到


[Tue Jan 10 10:26:34.458025 2023] [core:error] [pid 613686] [client 152.89.196.211:40956] AH10244: invalid URI path (/cgi-bin/.%2e/.%2e/.%2e/.%2e/bin/sh)

然后


[Tue Jan 10 17:54:40.408131 2023] [php:error] [pid 613688] [client 152.89.196.211:41694] script '/var/www/myfirstsite.com/public_html/.\\login.php' not found or unable to stat, referer: https://myip:myforwardingport/index.php?s=/Index/\\think\\app/invokefunction&function=call_user_func_array&vars[0]=md5&vars[1][]=HelloThinkPHP21
[Tue Jan 10 18:20:26.710678 2023] [php:error] [pid 613685] [client 130.61.143.194:46704] script '/var/www/myothersite.com/wp-login.php' not found or unable to stat, referer: http://myothersite.com/wp-login.php

我假设这是有人试图进入我的服务器,但我对网络一无所知,所以它也可能只是一个随机错误,但不是我向这些不存在的页面发出请求。

我不是特别担心,因为这只是我为了自学如何做 webdev 而建立的服务器和网站,并且它都是远程备份的,据我所知,配置/站点文件中没有任何变化。

但是有人能解释一下吗?

我只是不会将成员指针存储为模板参数:

template<class T, class Foo>
struct X {
    X(T Foo::*p): p(p) {}
    void operator()(Foo & f) {
        (f.*p) = 12 * (f.*p);   // simple example. could be more complex `operator()`
    }
private:
    T Foo::*p;
};

template <class T, class Foo>
X<T, Foo> MakeX(T Foo::*p)
{
    return p;
}

我不认为用你的方法推断类型是不可能的:你不能使用指向成员的指针传递给发生类型推导的函数。

编辑:可能有基于宏的解决方案。

例如,您可以创建一个类来创建X实例,如下所示:

template <class T, class Foo>
struct XMaker
{
    template <T Foo::*p>
    X<T, Foo, p> make() { return X<T, Foo, p>(); }
};

现在,您可以创建一个make ...函数来推导T和Foo:

template <class T, class Foo>
XMaker<T, Foo> make_x_maker(T Foo::*)
{
    return XMaker<T, Foo>();
}

这使得编写一个宏成为可能:

#define CREATE_X(member) make_x_maker(member).make<member>()

用法:

std::for_each(cont.begin(), cont.end(), CREATE_X(&FF::r) );

您有一个关于加强站点漏洞的有效问题。 您遵循了 LAMP 的安全建议(例如来自TecAdminRoseHostingLinode的建议)之后,您可以尝试使用在线工具来评估漏洞。 一些站点是Pentest ToolsImmuniWeb

NB Pen 测试会引发攻击……请务必在测试前研究该工具的安全性。

如果您希望将任意成员函数指针作为模板参数,我认为不可能减少必须指定的模板参数的数量。

您可以使用普通类型参数代替成员函数指针来提取引用的仿函数:

template<typename Func>
class X
{
public:
    explicit X(Func f = Func()) : f(f) {}

    template<class K>
    void operator()(K & k) const {
       f(k) = 12 * f(k);
    }
private:
    Func f;
};

然后,您仍然可以选择使用直接访问某个成员的特殊仿函数(如果您认为这可以提供更好的性能),或者使用更通用的访问器仿函数,使用成员函数指针作为成员。

我有一个问题:你真的需要指定所有这些论点吗?

struct XR
{
  template <class Foo>
  void operator()(Foo& foo) const { foo.r = 12 * foo.r; }
};

这是有效的,不需要额外的make方法它只是工作:

void testforx()
{
  std::vector<FF> cont(5);
  std::for_each(cont.begin(), cont.end(), XR()); 
}

在创建模板时,我不想成为通用的。

如果你需要一个更复杂的operator() ,你可以随时做一些繁重的操作。

此外,如果您真的希望提取指针函数和属性引用,您可以考虑使用Boost.Bind

编辑

我有一个想法,这将有点不同,不涉及任何宏观魔法,甚至任何元编程魔术。

为什么不简单地使用typedef并完成它?

好吧,可能没有你想要的那么自动化......毕竟你只需输入一次。

typedef X<int,FF,&FF::m> X_FF_m; // once

std::for_each(cont.begin(), cont.end(), X_FF_m() );

似乎打字少于

std::for_each(cont.begin(), cont.end(), createX<&FF::m>());

一遍又一遍地重复。

我在代码中几乎不使用裸模板,我更喜欢键入它们以提高可读性。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM