HTML5教程:精讲__init__、__new__、__call__方法(可面试用)

HTML5教程:精讲__init__、__new__、__call__方法(可面试用)
任何事物都有一个从创建,被使用,再到消亡的过程,在程序语言面向对象编程模型中,对象也有相似的命运:创建、初始化、使用、垃圾回收,不同的阶段由不同的方法(角色)负责执行。
在面试的时候,问到面向对象免不了会问__init__、__new__、__call__ 方法这几个*常用的魔术方法。在这里为大家厘清这几个方法的用法:
1. __init__方法
__init__方法负责对象的初始化,系统执行该方法前,其实该对象已经存在了,要不然初始化什么东西呢?先看例子:
class Dog:
    def __init__(self):
        print(“__init__ “)
        super(A, self).__init__()
    def __new__(cls):
        print(“__new__ “)
        return super(A, cls).__new__(cls)
    def __call__(self):  # 可以定义任意参数
        print(‘__call__ ‘)
Dog()
输出结果为:
__new__
__init__
从输出结果来看,__new__方法先被调用,返回一个实例对象,接着__init__被调用。__call__方法并没有被调用,这个我们放到*后说,先来说说前面两个方法,稍微改写成:
def __init__(self):
    print(“__init__ “)
    print(self)
    super(A, self).__init__()
def __new__(cls):
    print(“__new__ “)
    self = super(A, cls).__new__(cls)
    print(self)
    return self
输出为:
<__main__.A object at 0x1007a95f8>
__init__
<__main__.A object at 0x1007a95f8>
从输出结果来看,__new__ 方法的返回值就是类的实例对象,这个实例对象会传递给 __init__ 方法中定义的 self 参数,以便实例对象可以被正确地初始化。
如果 __new__ 方法不返回值(或者说返回 None)那么 __init__ 将不会得到调用,这个也说得通,因为实例对象都没创建出来,调用 init 也没什么意义,此外,Python 还规定,__init__ 只能返回 None 值,否则报错。
__init__方法可以用来做一些初始化工作,比如给实例对象的状态进行初始化:
def __init__(self, a, b):
    self.a = a
    self.b = b
    super(A, self).__init__()
另外,__init__方法中除了self之外定义的参数,都将与__new__方法中除cls参数之外的参数是必须保持一致或者等效。
class B:
    def __init__(self, *args, **kwargs):
        print(“init”, args, kwargs)
    def __new__(cls, *args, **kwargs):
        print(“new”, args, kwargs)
        return super().__new__(cls)
B(1, 2, 3)
# 输出
new (1, 2, 3) {}
init (1, 2, 3) {}
2. __new__ 方法
一般我们不会去重写该方法,除非你确切知道怎么做,什么时候你会去关心它呢,它作为构造函数用于创建对象,是一个工厂函数,专用于生产实例对象。著名的设计模式之一,单例模式,就可以通过此方法来实现。
class DatabasePools:
    _singleton = None
    def __new__(cls, *a, **k):
        if not cls._singleton:
            cls._singleton = object.__new__(cls, *a, **k)
        return cls._singleton
这就是通过__new__方法是实现单例模式的的一种方式,如果实例对象存在了就直接返回该实例即可,如果还没有,那么就先创建一个实例,再返回。
小结:
__ new__ 用于创建一个对象,有返回值;__new__是类方法;__ init__ 用于初始化对象,没有返回值
__new__默认参数是cls,系统传递的是类名,__init__默认参数是self,系统传递的是当前对象
__ new__ 先于__ init__ 执行
3. __call__ 方法
关于 __call__ 方法,不得不先提到一个概念,就是可调用对象(callable),我们平时自定义的函数、内置函数和类都属于可调用对象,但凡是可以把一对括号()应用到某个对象身上都可称之为可调用对象,判断对象是否为可调用对象可以用函数 callable
如果在类中实现了 __call__ 方法,那么实例对象也将成为一个可调用对象,我们回到*开始的那个例子:
a = Dog()
print(callable(a))  # True
a是实例对象,同时还是可调用对象,那么我就可以像函数一样调用它。试试:
a()  # __call__
很神奇不是,实例对象也可以像函数一样作为可调用对象来用,那么,这个特点在什么场景用得上呢?这个要结合类的特性来说,类可以记录数据(属性),而函数不行(闭包某种意义上也可行),利用这种特性可以实现基于类的装饰器,在类里面记录状态,比如,下面这个例子用于记录函数被调用的次数:
class Counter:
    def __init__(self, func):
        self.func = func
        self.count = 0
    def __call__(self, *args, **kwargs):
        self.count += 1
        return self.func(*args, **kwargs)
@Counter
def foo():
    pass
for i in range(10):
    foo()
print(foo.count)  # 10

Linux系统编程:信号捕捉

Linux系统编程:信号捕捉
前面我们学习了信号产生的几种方式,而对于信号的处理有如下几种方式:
默认处理方式;
忽略;
捕捉。
信号的捕捉,说白了就是抓到一个信号后,执行我们指定的函数,或者执行我们指定的动作。下面详细介绍两个信号捕捉操作参数:signal和sigaction。
##signal函数
函数原型:
sighandler_t signal(int signum, sighandler_t handler);
其中,sighandler定义是这样的:typedef void (*sighandler_t)(int);
函数作用:
注册一个信号捕捉函数,也就是说,收到了某个信号,就执行它所注册的回调函数。
函数参数:
signum:信号编号,尽量用宏来写,而别用数字,这样更适合跨平台;
handler:注册的回调函数;
函数缺陷:
由于历史原因,该函数在不同版本的Unix和Linux系统中可能起到的效果不一样,所以跨平台性不佳,尽量避免使用它,取而代之使用通用性更好的sigaction函数。
 #include
 #include
 void func()
 {
     printf(“SIGQUIT catched!\n”);
 }
 int main()
{
    signal(SIGQUIT, func);
    while(1);
}
##sigaction函数
函数原型:
int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact);
函数作用:
与signal函数类似,用来注册一个信号捕捉函数;
返回值:
成功:0;失败:-1,并设置errno;
参数:
signum:信号编号,尽量用宏来写,而别用数字,这样更适合跨平台;
act:传入参数,新的信号捕捉方式;
oldact:传出参数,旧的信号捕捉方式
这里特别要注意参数中struct sigaction结构体,这也是这个函数的难点所在,下面详细说明:
struct sigaction结构体
原型:
struct sigaction {
 void (*sa_handler)(int);
​ void (*sa_sigaction)(int, siginfo_t *, void *);
​ sigset_t sa_mask;
​ int sa_flags;
​ void (*sa_restorer)(void);
};
这个结构体成员很多,又很多是回调函数的形式,令人望而生畏。但实际上,需要掌握的只有三个。
首先,sa_restorer和sa_sigaction这两个成员一个已经被弃用了,另一个很少使用,所以我们暂且不管它们,重点掌握剩下的三个。
① sa_handler:指定信号捕捉后的处理函数,即注册回调函数。该成员也可以赋值为SIG_IGN,表示忽略该信号,也可注册为SIG_DFL,表示执行信号的默认动作。
② sa_mask:临时阻塞信号集(或信号屏蔽字)先来看这样一个情景:
某个信号已经注册了回调函数,当内核传递这个信号过来时,会先经过一个阻塞信号集,先阻塞掉部分信号。再去执行对应的回调函数。
假如说,这个回调函数回调执行的时间比较长,比如2秒,在这2秒里,又有其它的信号过来,那进程是暂停当前回调函数,去响应新的信号,还是不管新来的信号,先把当前回调函数处理完再说?
正确的做法是,在执行回调函数期间,使用sa_mask临时的去替代进程的阻塞信号集,保证回调函数安心的执行完毕,再解除替代。注意:这个过程仅仅发生在回调函数执行期间,是临时性的设置。
③ sa_flags:通常设置为0,表示使用默认属性。
再来看另外一个场景:
比如进程对SIGQUIT注册了回调函数,当回调函数在执行期间,又来了SIGQUIT函数,这时,进程是响应还是不响应该信号?这就是sa_flags的一个作用,当其设置为0时,表示使用默认属性,也就是先不响应该信号,而是执行完回调函数再处理此信号。
另外,阻塞的常规信号不支持排队,也就是说,执行回调函数期间,再来千百个同个信号时,系统只记录一次。而后面的32个实时信号则支持排队。
 #include
 #include
 #include
 void func(int signal)
 {
     printf(“SIGQUIT catched!\n”);
     sleep(2);   //用来模拟回调函数执行很长时间
     printf(“func finished!\n”);
}
int main()
{
    struct sigaction act;
    act.sa_handler = func;
    sigemptyset(&act.sa_mask);  //先清空临时阻塞信号集
    sigaddset(&act.sa_mask, SIGINT);    // 执行回调函数期间,屏蔽SIGINT
    act.sa_flags = 0;
    sigaction(SIGQUIT, &act, NULL); //注册回调函数
    while(1);
    return 0;
}

Python中格式化字符串更酷的方式

Python中格式化字符串更酷的方式
在 Python 中,大家都习惯使用 %s 或 format 来格式化字符串,在 Python 3.6 中,有了一个新的选择 f-string。
使用对比
我们先来看下 Python 中已经存在的这几种格式化字符串的使用比较。
# %s
username = ‘tom’
action = ‘payment’
message = ‘User %s has logged in and did an action %s.’ % (username, action)
print(message)
# format
username = ‘tom’
action = ‘payment’
message = ‘User {} has logged in and did an action {}.’.format(username, action)
print(message)
# f-string
username = ‘tom’
action = ‘payment’
message = f’User {user} has logged in and did an action {action}.’
print(message)
f”{2 * 3}”
# 6
comedian = {‘name’: ‘Tom’, ‘age’: 20}
f”The comedian is {comedian[‘name’]}, aged {comedian[‘age’]}.”
# ‘The comedian is Tom, aged 20.’
相比于常见的字符串格式符 %s 或 format 方法,f-strings 直接在占位符中插入变量显得更加方便,也更好理解。
方便的转换器
f-string 是当前*佳的拼接字符串的形式,拥有更强大的功能,我们再来看一下 f-string 的结构。
f ‘ <text> { <expression> <optional !s, !r, or !a> <optional : format specifier> } <text> … ‘
其中 ‘!s’ 调用表达式上的 str(),’!r’ 调用表达式上的 repr(),’!a’ 调用表达式上的 ascii()。大家可以看看下面的例子。
class Person:
    def __init__(self, name, nickname):
        self.name = name
        self.nickname = nickame
    def __str__(self):
        return self.name
    def __repr__(self):
        return self.nickname
person = Person(‘王大锤’, ‘Wang Gangdan’)
print(f'{person!s}’)
print(f'{person!r}’)
print(f'{person.name!a}’)
print(f'{person.nickname!a}’)
性能
f-string 除了提供强大的格式化功能之外,还是这三种格式化方式中性能*高的实现。
>>> import timeit
>>> timeit.timeit(“””name = “Eric”
… age = 74
… ‘%s is %s.’ % (name, age)”””, number = 10000)
0.003324444866599663
>>> timeit.timeit(“””name = “Eric”
… age = 74
… ‘{} is {}.’.format(name, age)”””, number = 10000)
0.004242089427570761
>>> timeit.timeit(“””name = “Eric”
… age = 74
… f'{name} is {age}.'”””, number = 10000)
0.0024820892040722242
坦白的说,f-string 就是字符串 format 方法一个语法糖,但它进一步简化了格式化字符串的操作并带来了性能上的提升。使用 Python 3.6+ 的同学,使用 f-string 来代替你的 format 函数,以获得更强大的功能和更高的性能。

黑客攻击WEB服务器的常用方式

1、SQL注入漏洞的入侵

这种是ASP+ACCESS的网站入侵方式,通过注入点列出数据库里面管理员的帐号和密码信息,然后猜解出网站的后台地址,然后用帐号和密码登录进去找到文件上传的地方,把ASP木马上传上去,获得一个网站的WEBSHELL。
2、ASP上传漏洞的利用

这种技术方式是利用一些网站的ASP上传功能来上传ASP木马的一种入侵方式,不少网站都限制了上传文件的类型,一般来说ASP为后缀的文件都不允许上传,但是这种限制是可以被黑客突破的,黑客可以采取COOKIE欺骗的方式来上传ASP木马,获得网站的WEBSHELL权限。
3、后台数据库备份方式获得WEBSHELL

这个主要是利用网站后台对ACCESS数据库进行数据库备份和恢复的功能,备份数据库路径等变量没有过滤导致可以把任何文件的后缀改成ASP,那么利用网站上传的功能上传一个文件名改成JPG或者GIF后缀的ASP木马,然后用这个恢复库备份和恢复的功能把这个木马恢复成ASP文件,从而达到能够获取网站WEBSHELL控制权限的目的。

4、网站旁注入侵

这种技术是通过IP绑定域名查询的功能查出服务器上有多少网站,然后通过一些薄弱的网站实施入侵,拿到权限之后转而控制服务器的其它网站。

5、sa注入点利用的入侵技术

这种是ASP+MSSQL网站的入侵方式,找到有SA权限的SQL注入点,然后用SQL数据库的XP_CMDSHELL的存储扩展来运行系统命令建立系统级别的帐号,然后通过3389登录进去,或者在一台肉鸡上用NC开设一个监听端口,然后用VBS一句话木马下载一个NC到服务器里面,接着运行NC的反向连接命令,让服务器反向连接到远程肉鸡上,这样远程肉鸡就有了一个远程的系统管理员级别的控制权限。
6、sa弱密码的入侵技术

这种方式是用扫描器探测SQL的帐号和密码信息的方式拿到SA的密码,然后用SQLEXEC之类的工具通过1433端口连接到远程服务器上,然后开设系统帐号,通过3389登录。然后这种入侵方式还可以配合WEBSHELL来使用,一般的ASP+MSSQL网站通常会把MSSQL的连接密码写到一个配置文件当中,这个可以用WEBSHELL来读取配置文件里面的SA密码,然后可以上传一个SQL木马的方式来获取系统的控制权限。

7、提交一句话木马的入侵方式

这种技术方式是对一些数据库地址被改成asp文件的网站来实施入侵的。黑客通过网站的留言版,论坛系统等功能提交一句话木马到数据库里面,然后在木马客户端里面输入这个网站的数据库地址并提交,就可以把一个ASP木马写入到网站里面,获取网站的WEBSHELL权限。
8、论坛漏洞利用入侵方式

这种技术是利用一些论坛存在的安全漏洞来上传ASP木马获得WEBSHELL权限,*典型的就是,动网6.0版本,7.0版本都存在安全漏洞,拿7.0版本来说,注册一个正常的用户,然后用抓包工具抓取用户提交一个ASP文件的COOKIE,然后用明小子之类的软件采取COOKIE欺骗的上传方式就可以上传一个ASP木马,获得网站的WEBSHELL。

ddos攻击服务器的几种方式

当前主要有三种流行的DDoS攻击:
1、SYN/ACK Flood攻击:这种攻击方法是经典*有效的DDoS方法,可通杀各种系统的网络服务,主要是通过向受害主机发送大量伪造源IP和源端口的SYN或ACK 包,导致主机的缓存资源被耗尽或忙于发送回应包而造成拒*服务,由于源都是伪造的故追踪起来比较困难,缺点是实施起来有一定难度,需要高带宽的僵尸主机支持。
少量的这种攻击会导致主机服务器无法访问,但却可以Ping的通,在服务器上用Netstat -na命令会观察到存在大量的SYN_RECEIVED状态,大量的这种攻击会导致Ping失败、TCP/IP栈失效,并会出现系统凝固现象,即不响应键盘和鼠标。普通防火墙大多无法抵御此种攻击。
2、TCP全连接攻击:这种攻击是为了绕过常规防火墙的检查而设计的,一般情况下,常规防火墙大多具备过滤TearDrop、Land等DOS攻击的能力,但对于正常的TCP连接是放过的,殊不知很多网络服务程序(如:IIS、Apache等Web服务器)能接受的TCP连接数是有限的。
一旦有大量的TCP连接,即便是正常的,也会导致网站访问非常缓慢甚至无法访问,TCP全连接攻击就是通过许多僵尸主机不断地与受害服务器建立大量的TCP连接,直到服务器的内存等资源被耗尽而被拖跨,从而造成拒*服务,这种攻击的特点是可绕过一般防火墙的防护而达到攻击目的,缺点是需要找很多僵尸主机,并且由于僵尸主机的IP是暴露的,因此容易被追踪。
3、刷Script脚本攻击:这种攻击主要是针对存在ASP、JSP、PHP、CGI等脚本程序,并调用MSSQLServer、 MySQLServer、Oracle等数据库的网站系统而设计的,特征是和服务器建立正常的TCP连接,并不断的向脚本程序提交查询、列表等大量耗费数据库资源的调用,典型的以小博大的攻击方法。
一般来说,提交一个GET或POST指令对客户端的耗费和带宽的占用是几乎可以忽略的,而服务器为处理此请求却可能要从上万条记录中去查出某个记录,这种处理过程对资源的耗费是很大的,常见的数据库服务器很少能支持数百个查询指令同时执行,而这对于客户端来说却是轻而易举的,因此攻击者只需通过 Proxy代理向主机服务器大量递交查询指令,只需数分钟就会把服务器资源消耗掉而导致拒*服务。
常见的现象就是网站慢如蜗牛、ASP程序失效、PHP连接数据库失败、数据库主程序占用CPU偏高。这种攻击的特点是可以完全绕过普通的防火墙防护,轻松找一些Proxy代理就可实施攻击,缺点是对付只有静态页面的网站效果会大打折扣,并且有些Proxy会暴露攻击者的IP地址。

针对Web服务器的八种入侵攻击方式

一、WEB服务器面临威胁
在了解WEB服务器的安全状况之前,首先要让大家了解网站安全的另一面——黑客攻击。97至98年互联网开始在中国兴起之时,黑客就已经诞生了,在98年印尼排华事件中,中国黑客对印尼ZF网站的打击行动通过媒体的渲染,让黑客一词进入了广大中国网民的眼帘。随着几次黑客大战的爆发以及媒体对黑客的渲染,让更多人加入了黑客这个队伍。那么黑客都是通过怎样的技术手段实施攻击的呢?97年到2002年以来,除了比较有名的UNICODE漏洞之外,黑客们大部分都是利用系统的各种溢出漏洞来实施入侵,包括像ipc共享空连接漏洞,ida/idq,printer漏洞,rpc漏洞等等。2003年,中国互联网开始从01年的互联网寒冬逐渐走向复苏,盛大、分众传媒、空中网等一系列IT企业分别在纳斯达克上市成功更进一步激起了更多IT从业人员开始开设网站和成立IT公司,梦想有一日能上纳斯达克拿美国股民的钱。网站数量的激增以及大家对网络安全的轻视,导致通过WEB的各种漏洞来进行入侵的事件越来越多。SQL注入漏洞随着黑客高手们一次又一次地使用在拿国内外游戏数据库和游戏网站的权限,并高价卖出,买车买房子之时,SQL注入以及相关技术在黑客的群体中普及开来。黑客们在比尔.盖茨先生弥补了大部分系统漏洞之后,开始转移方向,发现基于网站的各种脚本漏洞能非常轻易的使用, 而且能够通过提权来获取系统权限。于是,基于web的脚本漏洞成功黑客们的*爱。随后流氓软件开始在中国的互联网大地上盛行了起来,互联网的网站应用领域的黑客入侵技术开始流行了起来。*典型的就是黑客的网站挂马技术,这种技术就是利用网站的漏洞建立或者上传一个ASP木马的方式来获取网站的WEBSHELL权限,然后通过WEBSHELL权限通过提权获取系统权限,再接着就是在服务器的网站里面加入一些恶意的脚本代码,让你的电脑在访问网站的时候,不知不觉的中病毒和黑客程序,*后你电脑里面的重要资料,QQ号,网络游戏帐号,网上银行帐户里面的现金都会不翼而飞。 据专业权威机构统计,02年中国境内网站被入侵的比例不到10%,而到了06年,中国境内网站被入侵的比例是85%。黑客技术的普及化以及巨大商业利益的窃取网上银行的资金,QQ号码倒卖,网络游戏装备和帐号的倒卖等地下黑客产业链的形成是导致网站遭遇安全事件的主因。

二、WEB的各种攻击手段
1、SQL注入漏洞的入侵
这种是ASP+ACCESS的网站入侵方式,通过注入点列出数据库里面管理员的帐号和密码信息,然后猜解出网站的后台地址,然后用帐号和密码登录进去找到文件上传的地方,把ASP木马上传上去,获得一个网站的WEBSHELL。
2、ASP上传漏洞的利用
这种技术方式是利用一些网站的ASP上传功能来上传ASP木马的一种入侵方式,不少网站都限制了上传文件的类型,一般来说ASP为后缀的文件都不允许上传,但是这种限制是可以被黑客突破的,黑客可以采取COOKIE欺骗的方式来上传ASP木马,获得网站的WEBSHELL权限。
3、后台数据库备份方式获得WEBSHELL
这个主要是利用网站后台对ACCESS数据库进行数据库备份和恢复的功能,备份数据库路径等变量没有过滤导致可以把任何文件的后缀改成ASP,那么利用网站上传的功能上传一个文件名改成JPG或者GIF后缀的ASP木马,然后用这个恢复库备份和恢复的功能把这个木马恢复成ASP文件,从而达到能够获取网站WEBSHELL控制权限的目的。
4、网站旁注入侵
这种技术是通过IP绑定域名查询的功能查出服务器上有多少网站,然后通过一些薄弱的网站实施入侵,拿到权限之后转而控制服务器的其它网站。
5、sa注入点利用的入侵技术
这种是ASP+MSSQL网站的入侵方式,找到有SA权限的SQL注入点,然后用SQL数据库的XP_CMDSHELL的存储扩展来运行系统命令建立系统级别的帐号,然后通过3389登录进去,或者在一台肉鸡上用NC开设一个监听端口,然后用VBS一句话木马下载一个NC到服务器里面,接着运行NC的反向连接命令,让服务器反向连接到远程肉鸡上,这样远程肉鸡就有了一个远程的系统管理员级别的控制权限。
6、sa弱密码的入侵技术
这种方式是用扫描器探测SQL的帐号和密码信息的方式拿到SA的密码,然后用SQLEXEC之类的工具通过1433端口连接到远程服务器上,然后开设系统帐号,通过3389登录。然后这种入侵方式还可以配合WEBSHELL来使用,一般的ASP+MSSQL网站通常会把MSSQL的连接密码写到一个配置文件当中,这个可以用WEBSHELL来读取配置文件里面的SA密码,然后可以上传一个SQL木马的方式来获取系统的控制权限。
7、提交一句话木马的入侵方式
这种技术方式是对一些数据库地址被改成asp文件的网站来实施入侵的。黑客通过网站的留言版,论坛系统等功能提交一句话木马到数据库里面,然后在木马客户端里面输入这个网站的数据库地址并提交,就可以把一个ASP木马写入到网站里面,获取网站的WEBSHELL权限。
8、论坛漏洞利用入侵方式
这种技术是利用一些论坛存在的安全漏洞来上传ASP木马获得WEBSHELL权限,*典型的就是,动网6.0版本,7.0版本都存在安全漏洞,拿7.0版本来说,注册一个正常的用户,然后用抓包工具抓取用户提交一个ASP文件的COOKIE,然后用明小子之类的软件采取COOKIE欺骗的上传方式就可以上传一个ASP木马,获得网站的WEBSHELL

服务器渗透测试之攻击漏洞方法

服务器信息收集在渗透攻击过程中,对目标服务器的信息收集是非常重要的一步,服务器上面可以运行大量的系统服务和第三方应用服务,如果操作系统或者第三方教件没有及时升级打补丁,攻击者就有可能直接通过服务器上运行的服务进行攻击,因为服务器的错误配置或者不安全的访问控制,导致通过服务器漏洞进行攻击的案例墨见不鲜,如果数据库可以直接对外连接并且存在数据库弱口令,攻击者就可以直接通过数据库的弱口令漏洞对数据库进行连接,获取敏感数据,甚至通过数据库控制整个服务器,对内网发动攻击,服务器需要收集的信息包含三个方面:端口信息收集、程序服务版本识别和操作系统信息识别。
端口信息收集和程序服务版本识别主要是为了收集服务器开放了哪些端口,这些端口都运行了什么类型的服务,这些服务的具体版本信息,因为不同服务的漏洞点不一样,相同服务不同版本的漏洞点也可能有很大差异,所以要识别每个服务的具体版本信息,才能根据这些信息进行相关版本漏洞的利用。比如同样是IIS服务,IIS6.0的解析漏洞与IIS7.0的解析漏洞在漏洞形成的原因和漏洞的利用方式方面就完全不同。
操作系统信息识别是为了判断目标运行了什么类型的操作系统,根据不同类型的操作系统、不同版本的操作系统漏洞进行漏洞利用,比如Windows操作系统存在“永恒之蓝漏洞”的可能,Linux操作系统存在“脏牛漏洞”的可能。服务器信息收集*常用的工具就是Nmap工具,下面将详细地介绍如何使用Nmap对服务器信息进行收集。端口扫描使用命令“nmap-p1-65535IP”,对目标IP进行全端口扫描,确保每个可能开放的口服务都能被识别到。常见端口及对应服务,渗透测试服务中对服务器方面上的端口扫描是师傅们必学的技能,如果想要对自己的网站或APP进行服务器渗透测试的话可以寻求网站安全公司的帮助,国内像SINESAFE,鹰盾安全,大树安全都是有名的网站安全公司。
从上面的扫描结果信息来看目标服务可能开放了3306数据库服务、3389远程桌面服务,但是“STATESERVICE”并不一定是准确的,很多管理员可能修改了服务的默认端口,可能将远程桌面的端口改成了3306,将数据库的端口改成了3389,那么通过“STATESERVICE”的信息来判断就非常不准确了。此时准确的服务版本识别就很重要了,Nmap扫描器使用指纹识别技术,Nmap通过TCP/IP栈不同服务的特定的数据包格式作为指纹信息来区分不同的协议,这样就可以做到准确的服务版本识别。Nmap进行指纹识别的参数是“-sV”,使用命令“nmap-sV-p1-65535IP”对目标IP进行全端口扫描,并进行服务版本识别,代码如下。通过“nmap-sV-p1-65535-192.168.88.21”对“192.168.88.21”地址的1~65535端口进行扫描并进行服务版本识别,发现80端口运行的是2.4.23版本的Apache服务,800端口运行的是IIS6.0服务,1433端口运行的是MicrosoftSQLServer2005服务,3306端口运行的是MySQL服务,3389端口运行的是远程桌面服务。通过服务器信息收集发现除了Web服务外,还开启了数据库和远程桌面等相关的务,攻击者就可以尝试对数据库和远程桌面存在的漏洞进行攻击,拿到服务器的权限。

Samba 在共享的时候,如何比较好的设定:可写但不允许删除

为什么会有这种需求呢,我共享了几个目录给大家用。主要是共享的东西比较重要,怕被误删除。

所以我在每个目录下用 git 做定期备份,所以.git 目录是不能被删除,同理.git 上一级目录也不能被删除。
这样即使其它文件他们怎么折腾都可以,我都可能通过 git 去还原。(关联的帖子: https://v2ex.com/t/785482 )
第 1 条附言 · 4 天前
把.git 目录移出来是个不错的方案,参考:#5 楼、#7 楼。
git 目录 删除 共享14 条回复
AoEiuV020 1
AoEiuV020 4 天前
不懂 Samba,但删除目录是需要目录上一级写权限的,和目录本身是否可写无关的,
ho121 2
ho121 4 天前 via Android
不如把.git 文件夹隐藏
James369 3
James369 4 天前
@ho121 比如我共享了 AAA, BBB 目录,.git 是在 AAA/.git ,BBB/.git ,那用户直接删除 AAA 或 BBB 就完了。
asilin 4
asilin 4 天前
使用 veto files 指令将 .git 目录隐藏屏蔽,这样如果目录树中包含 .git 目录,则整个目录都无法删除
hstdt 5
hstdt 4 天前 via iPhone
文件放在 git 所在文件夹的下一级,不要同级。共享的时候共享子文件夹即可。
CRVV 6
CRVV 4 天前
这个需求应该用文件系统的 snapshot 来做吧,就没有必要排除大文件,也没有不能删的 .git 目录了。
btrfs subvolume snapshot AAA /backup/AAA

可写但不可删除是个奇怪的权限,因为可以用写入操作把文件内容清空,然后等于是删了。大约查了一下只有 Windows 支持这种奇怪的设定,但我也没看明白到底怎么用的。
orzfly 7
orzfly 4 天前
要不要换个问题?.git 目录不一定必须要放在 AAA/.git 这里哦……
可以用 git-dir 和 work-tree 参数手动指定对应目录。

例如 git status 变成这样:
/share/AAA> git –git-dir=/super-non-shared-directory/AAA.git/ –work-tree=/share/AAA status
passerbytiny 8
passerbytiny 4 天前 via Android
linux 文件权限只有读、写、执行,文件夹权限只有写、执行(读取其下级列表),删除文件和删除文件夹都属于“写文件夹”,没有独立权限分配。
xtdwf 9
xtdwf 4 天前
群晖表示可以直接设置可写不可删
dingwen07 10
dingwen07 4 天前 via iPhone
https://www.linuxquestions.org/questions/linux-server-73/samba-read-and-write-even-subdir-but-no-delete-4175605300/

HUNYXV 11
HUNYXV 4 天前
@hstdt 说的方法及简单也有效哈哈。
./xxx
├── .git
└── share_xxx
Jirajine 12
Jirajine 4 天前 via Android
ACL 应该可以
YuukiIchika 13
YuukiIchika 3 天前
给目录设置 sticky bit ?
codehz 14
codehz 3 天前 via Android
小贴士:
git 支持在外部目录检出,此时目标目录将不包含.git 目录(当然 git 操作还是得在仓库目录才能做的
详情搜索 git worktree
(不过这玩意对单个分支只能同时检出一次(默认的检出也算一次),所以建议开一个 bare 仓库用作操作目录)

在 Mac 上为 Apple ID 账户余额充值的方法

如何在Mac 上为 Apple ID充值?这是很多Mac用户都想了解的,当我们的Apple ID余额不足时,我们可以按照以下方法来操作。

1.在 Mac 上,打开 App Store。
2.如果您还没有登录,请使用您的 Apple ID 登录。
3.打开“帐户信息”页面。具体方法如下:
在 Mac 上,从屏幕顶部的菜单栏中,选取“商店”>“查看我的帐户”。然后,点按屏幕顶部的“查看信息”。
4.在“帐户信息”页面上,点按“为 Apple ID 充值”。

5.点按要充值的金额。
6.点按“下一步”,然后确认您的选择。有些付款方式可能会提示您通过短信或其他方式来验证您的购买行为。

git 如何根据文件大小进行忽略,想跳过大文件。

git 提交的时候能不能自动忽略大文件(比如超过 100M ),然后给个提示消息就好了。
git 文件 忽略 提交9 条回复
AoEiuV020 1
AoEiuV020 4 天前 ❤️ 1
100M 是为了上传 github?
感觉可以用 find 把所有大文件写进 gitignore,要自动就写个 hook,
no1xsyzy 2
no1xsyzy 4 天前
pre-commit 钩子里插 find 语句并 >> .gitignore
James369 3
James369 4 天前
@AoEiuV020 不是,我只是想本地做下文件备份
no1xsyzy 4
no1xsyzy 4 天前 ❤️ 1
顺便,如果要 lfs 的话也可以 | xargs git lfs track
no1xsyzy 5
no1xsyzy 4 天前
(忘记了钩子运行时机晚于 add,pre-commit 里写的话大概需要 unstage 一下)
kyuuseiryuu 6
kyuuseiryuu 4 天前 via iPhone
git 版冰点还原吗?
misaka19000 7
misaka19000 4 天前
把大文件添加到 ignore 里面去

或者写个脚本在提交前自动检测文件大小修改 ignore 文件
jomenxiao 8
jomenxiao 4 天前
alias git=”find . -type f -max < 100 && git”