分类 我爱编程 下的文章

macOS Sierra中,为PHP安装RabbitMQ客户端

安装 librabbitmq :

# brew install rabbitmq-c

安装 amqp 扩展:

# phpizel
# ./configure --with-php-config=/usr/local/php/bin/php-config
# make
# make install

PS:如果在make时出现C类错误,无法正常编译,请检查macos中安装的Command Line Tools版本是否小于10.0,如果大于10.0请卸载重新安装低版本。

OK了,看一下是否安装成功:

# php --ri amqp


什么是source map文件(转)

source map文件是js文件压缩后,文件的变量名替换对应、变量所在位置等元信息数据文件,一般这种文件和min.js主文件放在同一个目录下。 比如压缩后原变量是map,压缩后通过变量替换规则可能会被替换成a,这时source map文件会记录下这个mapping的信息,这样的好处就是说,在调试的时候,如果有一些JS报错,那么浏览器会通过解析这个map文件来重新merge压缩后的js,使开发者可以用未压缩前的代码来调试,这样会给我们带来很大的方便!
而这种还原性调试功能,目前只有chorme才具有,所以就会出现标题说的问题,我引入jquery-1.10.2.min.js的时候,在firefox下或者其他浏览器下是好的,在chorme下会报错找不到jquery-1.10.2.min.map文件,404,就是因为以上说的情况,jquery会检测浏览器是否支持source map功能,如果支持的话,那就去下载source map文件,而这个时候如果你引用的是官网的min.js那没问题,它会去自己的目录下找source map文件,而如果jquery.min.js文件在你的服务器上而服务器上又没有source map的话,那就会报错了!

三种解决办法:

一,引用官网文件

二,把source map文件下载下来放到服务器上(推荐)

三,把chorme文件的工具-->开发者工具-->设置-->Enable source maps勾去掉,去掉这个勾,jquery就不会去下载source map文件了!


appScan安全性扫描问题处理记录

文档记录appScan进行安全性测试时产生相关问题的解决方法、服务器配置、解决流程等

以下解决方式及服务器配置仅对于nginx+php

以下是问题列表及解决方法:

不安全的第三方链接 (target="_blank")

原因:

链接元素中的 rel 属性未设置为“noopener noreferrer”。

技术描述:

target="_blank" 属性将添加到链接元素以在新窗口中打开链接。

此类链接标记(例如带有 target="_blank" 属性)通过 window.opener 对象将原始页面的部分窗口对象公开给链接的页面。

如果链接的页面是恶意的,那么利用这一点来进行钓鱼攻击。注意:如果链接可由用户添加并可传播到其他用户可见的页面,那么该威胁应被视为 HIGH 严重性

解决办法: 添加相关属性标签 rel=“noopener noreferrer”

例:

<a href="http://wpa.qq.com/msgrd?v=3&amp;uin=2309605388&amp;site=qq&amp;menu=yes" rel="noopener noreferrer" class="txtBtn" target="_blank">QQ客 服</a>

原因:

Web 应用程序设置了缺少 HttpOnly 属性的会话 cookie

技术描述:

在应用程序测试过程中,检测到所测试的 Web 应用程序设置了不含“HttpOnly”属性的会话 cookie。由于此会话 cookie 不包含“HttpOnly”属性,因此植入站点的恶意脚本可能访问此 cookie,并窃取它的值。任何存储在会话令牌中的信息都可能被窃取,并在稍后用于身份盗窃或用户伪装。

Cookie保护

  • HttpOnly,会阻止XSS攻击将你的用户cookie发给黑客

  • Secure,属性能让Cookie通过HTTPS连接,而不是HTTP,这样,能够访问你的网络的黑客无法读取未加密的Cookie。

解决办法:

域名服务器配置nginx.conf下添加请求头

add_header Set-Cookie: HttpOnly

add_header Set-Cookie: Secure

PHP中解决方法:

    # PHP5.2以上版本设置php.ini
     session.cookie_httponly = 1 //设置其值为1或者true

    # PHP5.2以上版本,代码中设置
    <?php        ini_set("session.cookie_httponly", 1); 
        // or session_set_cookie_params(0, NULL, NULL, NULL, TRUE); 
    ?>

    # PHP5.1以前版本以及PHP4版本的话,则需要通过header函数来变通下
    <?php 
        header("Set-Cookie: hidden=value; httpOnly"); 
    ?>

ini.session.cookie-httponly

详见HTTP中文开发手册:Set-Cookie

通过Nginx获取cookie相关值,并添加属性:

直接获取:

假如我们要获取的 cookie 的 key 是 pin,可以在 nginx 直接使用变量$cookie_pin 来获取。
获取方式是$cookie_{value_key}
但是这种方式有一个缺陷无法获取这样的 cookie 比如 pin.name 简单的说一下原因就是因为这样的变量在 nginx 中不规范
nginx 中的变量必须是字母或者_

正则匹配获取:

用正则匹配获取没有上面的问题,我们可以获取任何 cookie 但是效率肯定没有上面的高。
比如这样

set $key "";
if ( $http_cookie ~* "pin.name=(.+?)(?=;|$)" ) {
  set $key $1;
}
这样$key 变量中就获取到了 cookie pin.name 的值
可以看出 nginx 是支持非贪婪匹配的,我去在网上找资料的时候发现很多网页上写的都是错误的获取方法。

例子:

    #获取PHPSESSID并添加相关安全属性

    #直接获取
    #set $key $cookie_PHPSESSID;

    #正则匹配获取
    set $key "";
    if ( $http_cookie ~* "PHPSESSID=(.+?)(?=;|$)" ) {
      set $key $1;
    }
    add_header Set-Cookie "PHPSESSID=$key Path=/;HttpOnly;Secure;";

使用 HTTP 动词篡改的认证旁路

原因:

Web 应用程序编程或配置不安全,未对请求头 Access-Control-Allow-Methods 进行限制

技术描述: web 服务器未对http请求进行方法设置,允许了所有http方法对web服务器进行访问

解决办法:

域名服务器配置nginx.conf下添加请求头

add_header Access-Control-Allow-Methods: POST, GET, OPTIONS

按需添加http请求方法

详见HTTP中文开发手册:Access-Control-Allow-Methods

缺少“Content-Security-Policy”头

原因:

Web 应用程序编程或配置不安全,未对请求头 Content-Security-Policy 进行限制

技术描述:

“Content-Security-Policy”头设计用于修改浏览器渲染页面的方式,并因此排除各种跨站点注入,包括跨站点脚本编制。以不会阻止 web 站点的正确操作的方式正确地设置头值就非常的重要。例如,如果头设置为阻止内联 JavaScript 的执行,那么 web 站点不得在其页面中使用内联 JavaScript。

Content-Security-Policy相关配置参数详解

指令说明

指令就是csp中用来定义策略的基本单位,我们可以使用单个或者多个指令来组合作用,功能防护我们的网站.

以下是常用的指令说明:

指令名demo说明
default-src'self' cdn.example.com默认策略,可以应用于js文件/图片/css/ajax请求等所有访问
script-src'self' js.example.com定义js文件的过滤策略
style-src'self' css.example.com定义css文件的过滤策略
img-src'self' img.example.com定义图片文件的过滤策略
connect-src'self'定义请求连接文件的过滤策略
font-srcfont.example.com定义字体文件的过滤策略
object-src'self'定义页面插件的过滤策略,如 , 或者等元素
media-srcmedia.example.com定义媒体的过滤策略,如 HTML6的
frame-src'self'定义加载子frmae的策略
sandboxallow-forms allow-scripts沙盒模式,会阻止页面弹窗/js执行等,你可以通过添加allow-forms allow-same-origin allow-scripts allow-popups, allow-modals, allow-orientation-lock, allow-pointer-lock, allow-presentation, allow-popups-to-escape-sandbox, and allow-top-navigation 策略来放开相应的操作
report-uri/some-report-uri

指令值

所有以-src结尾的指令都可以用一下的值来定义过滤规则,多个规则之间可以用空格来隔开

demo说明
*img-src *允许任意地址的url,但是不包括 blob: filesystem: schemes.
'none'object-src 'none'所有地址的咨询都不允许加载
'self'script-src 'self'同源策略,即允许同域名同端口下,同协议下的请求
data:img-src 'self' data:允许通过data来请求咨询 (比如用Base64 编码过的图片).
domain.example.comimg-src domain.example.com允许特性的域名请求资源
*.example.comimg-src *.example.com允许从 example.com下的任意子域名加载资源
https://cdn.comimg-src https://cdn.com仅仅允许通过https协议来从指定域名下加载资源
https:img-src https:只允许通过https协议加载资源
'unsafe-inline'script-src 'unsafe-inline'允许行内代码执行
'unsafe-eval'script-src 'unsafe-eval'允许不安全的动态代码执行,比如 JavaScript的 eval()方法

示例

default-src 'self';

只允许同源下的资源

script-src 'self';

只允许同源下的js

script-src 'self' google-analytics.com ajax.googleapis.com;

允许同源以及两个地址下的js加载

default-src 'none'; script-src 'self'; connect-src 'self'; img-src 'self'; style-src 'self';

多个资源时,后面的会覆盖前面的

针对课堂解决方法

域名服务器配置nginx.conf下添加请求头

add_header Content-Security-Policy "default-src * 'self' data: 'unsafe-inline' 'unsafe-eval';";

按需添加参数限制

详见HTTP中文开发手册:Content-Security-Policy

缺少“X-Content-Type-Options”头

原因:

Web 应用程序编程或配置不安全,未对请求头 X-Content-Type-Options 进行设置

技术描述:

“X-Content-Type-Options”头(具有“nosniff”值)可防止 IE 和 Chrome 忽略响应的内容类型。该操作可能防止在用户浏览器中执行不受信任的内容(例如用户上载的内容)(例如在恶意命名之后)。

互联网上的资源有各种类型,通常浏览器会根据响应头的Content-Type字段来分辨它们的类型。例如:"text/html"代表html文档,"image/png"是PNG图片,"text/css"是CSS样式文档。然而,有些资源的Content-Type是错的或者未定义。这时,某些浏览器会启用MIME-sniffing来猜测该资源的类型,解析内容并执行。

解决办法:

域名服务器配置nginx.conf下添加请求头

MySQL类型转换 使用CAST将varchar转换成int类型排序

MySQL类型转换 使用CAST将varchar转换成int类型排序

--使用CAST将varchar转换成int类型排序
select distinct(zone_id)  from guild_rank_info order by  CAST(zone_id as SIGNED); 

--使用CONVERT将varchar转换成int类型排序
select distinct(zone_id)  from guild_rank_info order by  convert(zone_id , SIGNED);