web安全问题:SQL防注入,XSS攻击,CSRF攻击
1. SQL注入是一种将sql代码添加到输入参数中,传递到SQL服务器解析并执行的一种攻击手法。
防范手段:
严格检查输入变量的类型和格式
过滤和转义特殊字符(用PHP函数addslashes()进行转义;mysql_real_escape_string(): 转义SQL语句中使用的字符串中的特殊字符毛病考虑到连接的当前字符集)
利用预编译机制(其实就是where条件参数加上单引号)
2. XSS攻击时Web攻击中最常见的攻击方法之一,它是通过网页注入可执行代码且成功被浏览器执行,达到攻击的目的,形成了一次有效XSS攻击。一旦攻击成功,它可以获取用户的联系人列表,然后向联系人发送虚假诈骗信息,可以删除用户的日志等。
防范手段:
在表单提交或者url参数传递前,对需要的参数进行过滤
过滤用户输入的,检查用户输入的内容是否有非法内容,如尖括号:<>,引号:",单引号:',百分比符号:%, 分号:;, 括号:(), &,+ 等,严格控制输出。
3. CSRF攻击:CSRF跨站点请求伪造(cross-site request forgery),跟XSS攻击一样,存在巨大的危害性。
攻击者盗用了身份信息,以该身份信息的名义发送恶意请求,对服务器来说这个请求时完全合法的,但是却完成了攻击者所期望的一个操作,比如以该身份的名义发送邮件,发消息,盗取账号,添加系统管理员,甚至于购买商品,虚拟货币转账等。
CSRF攻击原理及过程如下:
(1). 用户C打开浏览器,访问受信任网站A,输入用户名和密码请求登录网站A
(2). 在用户信息通过验证后,网站A产生Cookie信息并返回给浏览器,此时用户登录网站A成功,可以正常发送请求到网站A
(3). 用户在未退出网站A之前,在同一浏览器中,打开一个TAB页访问网站B
(4). 网站B接收到用户请求后,返回一些攻击性代码,并发出一个请求要求访问第三方站点A
(5). 浏览器在接收到这些攻性代码后,根据网站B的请求,在用户不知情的情况下携带Cookie信息,向网站A发出请求。网站A并不知道该请求是由B发起的,所以会根据用户C的Cookie信息以C的权限处理该请求,导致来自网站B的恶意代码被执行。
防范手段:
加token验证
验证HTTP Referer字段
(Referer是HTTP请求header的一部分,当浏览器,或者模仿浏览器行为,向web服务器发送请求的时候,头信息里有包含Referer, Referer值会记录下用户的访问来源)
什么是死锁
所谓死锁,是指多个进程在运行过程中因争夺资源而造成的一种僵局,当进程处于这种僵持状态,若无外力作用,它们都将无法再向前推进。
或者
如果一个进程合集里面的每个进程都在等待这个集合中的其他一个进程(包括自身)才能继续往下执行,若无外力它们将无法推进,这种情况就是死锁,处于死锁状态的进程称为死锁进程。
产生死锁的主要原因
可归结为两点
1. 竞争资源
系统中的资源可以分为两类:可剥夺资源,不可剥夺资源
可剥夺资源:是指某进程在获得这类资源后,该资源可以再被其他进程或系统剥夺,CPU和内存均属于可剥夺性资源
不可剥夺资源:当系统把这类资源分配给某进程后,再不能强行收回,只能在进程用完后自行释放,如磁带机、打印机等
(1). 产生死锁中的竞争资源之一指的是竞争不可剥夺资源(例如:系统中只有一台打印机,可供进程P1使用,假定P1已占用了打印机,若P2继续要求打印机打印将阻塞)
(2). 产生死锁中的竞争资源另外一种资源指的是竞争临时资源(临时资源包括硬件中断、信号、消息、缓冲区内的消息等),通常消息通信顺序进行不当,则会产生死锁
2. 进程间推进顺序非法
若P1保持了资源R1,P2保持了资源R2,系统处于不安全状态,因为这两个进程再向前推进,便可能发生死锁
例如,当P1运行到P1:Request(R2)时,将因R2已被P2占用而阻塞;当P2运行到P2:Request(R1)时,也将因R1已被P1占用而阻塞,于是发生进程死锁
死锁产生的4个必要条件
1. 互斥条件:一段时间内,某资源只能被一个进程使用
2. 请求和保持条件:当进程因请求资源而阻塞时,对已获得的资源保持不放
3. 不可剥夺条件:进程已获得的资源在未使用完之前,不能剥夺,只能在使用完时由自己释放
4. 环路等待条件(循环等待条件):若干进程之间形成一种头尾相接的循环等待资源关系
解决死锁的基本方法
1. 预防死锁:通过设置一些限制条件,去破坏产生死锁的必要条件
资源一次性分配:一次性分配所有资源,这样就不会再有请求了(破坏请求条件)
只要有一个资源得不到分配,也不给这个进程分配其他资源(破坏保持条件)
2. 避免死锁:在资源分配过程中,使用某种方法避免系统进入不安全的状态,从而避免发生死锁
3. 检测死锁:允许死锁的发生,但是通过系统的检测之后,采取一些措施,将死锁清除掉
4. 解除死锁:该方法与检测死锁配合使用
进程与线程
进程:指在系统中正在运行的一个应用程序;程序一旦运行就是进程;进程是资源分配的最小单位
线程:系统分配处理器时间资源的基本单位,即调度和分配的基本单位,或者说进程之内独立执行的一个单元执行流;线程是程序执行的最小单位
进程(线程+内存+文件/网络句柄)

线程(栈+PC+TLS)

具体例子:打开微信软件,就开启了一个进程,当我们在微信中进行各种操作(查看朋友圈,扫一扫),这些操作就是线程。所以可以说“进程”包含“线程”,“线程”是“进程”的一个子集。
即便是同一进程里的多个线程,每个线程也有自己独立的栈空间,其他资源是共享的。
线程和进程都可并发执行,线程的粒度小于进程,通常多线程比多进程并发性更高。
进程之间是怎么进行交互的?
通过TCP/IP的端口来实现
线程之间是怎么进行交互的?
线程的通信比较简单,有一大块共享的内存,只要线程的指针是同一个就可以看到各自的内存
进程与线程,小结
1. 进程要分配一大部分的内存,而线程只需要分配一部分栈就可以了
2. 一个程序至少有一个进程,一个进程至少有一个线程
3. 进程是资源分配的最小单位,线程是程序执行的最小单位
4. 一个线程可以创建和撤销另一个线程,同一个进程中的多个线程之间可以并发执行
并发与并行
并发:是同时处理很多事情。并发的关键是处理多个任务的能力,不一定要同时、比如一个人可以先吃饭,后处理工作,再看电影,这三个事情并不一定要同时发生。
并行:是同时执行很多事情。并行的关键是有同时处理多个任务的能力。比如一个人一边工作,一边听音乐,两件事是同时进行的。
缓冲区溢出
例如:我们有个地方要输入用户名,本来是用来存数据的地方,黑客把数据输入的特别长。这个长度超出了我们给数据存储的内存区,这个时候跑到了我们给程序分配的一部分内存中。黑客就可以通过这种办法将它要运行的代码写入到用户名框中,来植入进来。
解决方法就是,用户名的长度限制不要超过用户名缓冲区的大小来解决。
网友评论