Xinu's Note - php
type: channel
link: http://xbug.top/index.php/tag/php
items: php安全基础一
items: Apache服务器设置多种php运行方式
items: Apache基础配置详解【能用级别】
items: Linux、Centos下源码编译安装apache、php、mysql
items: PHP 编译安装 PHP各参数配置详解
items: php 建设银行支付接口，支付+验签
items: php 模拟js escape函数处理字符串
items: php 根据域名获取IP，判断域名是否合法
items: php异步执行操作
items: php 过滤微信昵称中的emoji

php安全基础一
type: item
date: 2019-12-14T23:32:00+08:00
description: PHP安全基础一生产环境php.ini推荐配置; 基础设置 ; 关闭错误输出 display_erros = Off ; 错误日志输出到指定位置 error_log = /var/log/error.log ; 显示除通知和编码标准警告之外的所有错误。 error_reporting = E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED ; 关闭php版本号在http头中的显示 expose_php = Off ; 限制php访问的文件系统位置；如果设置的是一个指定目录，则需要在最后加上 '/'，否则会被认为是目录的前缀 open_basedir = /home/www/ ; 禁用远程文件访问 allow_url_fopen = Off ; 禁用远程文件包含 allow_url_include = Off ; 禁用危险函数 危险函数 参考附录中的危险函数 disable_functions = phpinfo,eval ; cookie安全 ; 开启httponly 让Cookie在浏览器中不可见，浏览器脚本语言(如JavaScript)无法访问它 session.cookie_httponly = 1 ; 如果开启了ssl 则设置此选项，只有https下请求才会携带cookies session.cookie_secure = 1代码安全会话相关setcookie($name, $value, $expire, $path, $domain, $secure, $httponly); /** name Cookie 名称。 value Cookie 值。 这个值储存于用户的电脑里，请勿储存敏感信息。 比如 name 是 'cookiename'， 可通过 $_COOKIE['cookiename'] 获取它的值。 expire Cookie 的过期时间。 这是个 Unix 时间戳，即 Unix 纪元以来（格林威治时间 1970 年 1 月 1 日 00:00:00）的秒数。 也就是说，基本可以用 time() 函数的结果加上希望过期的秒数。 或者也可以用 mktime()。 time()+60*60*24*30 就是设置 Cookie 30 天后过期。 如果设置成零，或者忽略参数， Cookie 会在会话结束时过期（也就是关掉浏览器时）。 Note: 你可能注意到了，expire 使用 Unix 时间戳而非 Wdy, DD-Mon-YYYY HH:MM:SS GMT 这样的日期格式，是因为 PHP 内部作了转换。 path Cookie 有效的服务器路径。 设置成 '/' 时，Cookie 对整个域名 domain 有效。 如果设置成 '/foo/'， Cookie 仅仅对 domain 中 /foo/ 目录及其子目录有效（比如 /foo/bar/）。 默认值是设置 Cookie 时的当前目录。 domain Cookie 的有效域名/子域名。 设置成子域名（例如 'www.example.com'），会使 Cookie 对这个子域名和它的三级域名有效（例如 w2.www.example.com）。 要让 Cookie 对整个域名有效（包括它的全部子域名），只要设置成域名就可以了（这个例子里是 'example.com'）。 旧版浏览器仍然在使用废弃的 » RFC 2109， 需要一个前置的点 . 来匹配所有子域名。 secure 设置这个 Cookie 是否仅仅通过安全的 HTTPS 连接传给客户端。 设置成 TRUE 时，只有安全连接存在时才会设置 Cookie。 如果是在服务器端处理这个需求，程序员需要仅仅在安全连接上发送此类 Cookie （通过 $_SERVER["HTTPS"] 判断）。 httponly 设置成 TRUE，Cookie 仅可通过 HTTP 协议访问。 这意思就是 Cookie 无法通过类似 JavaScript 这样的脚本语言访问。 要有效减少 XSS 攻击时的身份窃取行为，可建议用此设置（虽然不是所有浏览器都支持），不过这个说法经常有争议。 PHP 5.2.0 中添加。 TRUE 或 FALSE **/php版本// 使用php7版本 更少的漏洞 // 开启严格模式，严格约束变量类型，防止数据类型转换造成的安全隐患 declare(strict_types=1); // 使用php7中的random_int,random_bytes代替php5中的mt_rand random_int(100, 900); bin2hex(random_bytes(10)); // 尽量减少非必要模块加载 // 使用第三方安全扩展 如 Suhosin, Taint 附录…

Apache服务器设置多种php运行方式
type: item
date: 2019-05-30T09:25:00+08:00
description: php在apache服务器下运行方式主要有一下几种：模块化(效率最高)CGI方式(不推荐，效率低)FastCgiphpfpm1. 模块化方式在编译安装php的时候,增加--with-apxs2=/server/httpd/bin/apxs 选项，会自动生成php5_module。在http.conf文件中如下设置 # 加载模块 LoadModule php5_module modules/libphp5.so # 设置方式1 <FilesMatch "\.php$"> SetHandler application/x-httpd-php </FilesMatch> # 设置方式2 # 在<IfModule mime_module>中添加如下内容 AddType application/x-httpd-php .php 2.CGI方式CGI是通用网关接口协议的缩写，是一种通用的规范协议，与语言无关，编译安装的php在bin下会存在一个php-cgi，就是php自带的CGI接口程序设置如下# 加载模块 LoadModule alias_module modules/mod_alias.so LoadModule cgid_module modules/mod_cgid.so(linux) LoadModule cgi_module modules/mod_cgi.so(windows) LoadModule actions_module modules/mod_actions.so # 在安装好的php目录下的bin下复制php-cgi到 /server/www/cgi-bin # /server/www/cgi-bin 此目录是在安装apache的时候自动生成的，/server/www/是apaceh服务器的网页根目录 # 将安装好的php-cgi复制到有执行CGI程序权限的目录下 # 这个目录可以是任意目录，只要在配置中给权限就好，建议放在官方推荐的位置，根据安装位置的不同，默认的位置不同 cp /server/php56/bin/php-cgi /server/www/cgi-bin/ # 在http.conf文件中查找ScriptAlias，规定了CGI执行目录 ScriptAlias /cgi-bin/ "/server/www/cgi-bin" <Directory "/server/www/cgi-bin"> AllowOverride None Options All Require all granted </Directory> AddType application/x-httpd-php .php Action application/x-httpd-php /cgi-bin/php-cgi # application/x-httpd-php 可以自定义 扩展.php的Mime 3.FastCgi方式FastCgi是对CGI方式的一个优化，效率有显著提升php官网中的FastCgi安装说明 点我不过FastCgi的官网已经倒闭了....好在Apache提供了新的模块mod_fcgid来支持FastCgi的实现mod_fcgid官方文档地址 点我# 安装 mod_fcgid 模块 wget http://mirror.bit.edu.cn/apache//httpd/mod_fcgid/mod_fcgid-2.3.9.tar.gz tar -zxvf mod_fcgid-2.3.9.tar.gz cd mod_fcgid-2.3.9 APXS=/server/httpd/bin/apxs ./configure.apxs make make install 查看http.conf文件，会发现配置文件LoadModule最后面会自动加了一行 LoadModule fcgid_module modules/mod_fcgid.so # 这里是通用设置所有的.php文件都会被处理 # 不同的虚拟机还可以配置不同的php版本处理 <IfModule fcgid_module> # 初始化设置 # CGI进程的最大请求个数 FcgidInitialEnv PHP_FCGI_MAX_REQUESTS 1000 #fcgi每个进程的最大请求数要<= 上面的PHP_FCGI_MAX_REQUESTS 否则会出现请求完不成的问题 FcgidMaxRequestsPerProcess 1000 #php-cgi最大的进程数 FcgidMaxProcesses 5 #最大执行时间 FcgidIOTimeout 120 FcgidIdleTimeout 120 AddHandler fcgid-script .php <FilesM…

Apache基础配置详解【能用级别】
type: item
date: 2019-05-30T09:14:00+08:00
description: Apache安装参看此文章 https://xbug.top/index.php/archives/195.html基础命令# 启动服务 /server/httpd/bin/apachectl -k start # 立即停止 kill -TERM `cat /server/httpd/logs/httpd.pid` # 立即停止2 /server/httpd/bin/apachectl -k stop # 优雅重启 # 此方式重启不会停止服务 # 在重启过程中确保有适当数量的进程和线程以响应客户端的请求 /server/httpd/bin/apachectl -k graceful # 立即重启 /server/httpd/bin/apachectl -k restart # 优雅停止 # 进程会完成现有的服务再退出，如果没有服务，立刻退出 /server/httpd/bin/apachectl -k graceful-stop # 检测配置文件语法错误 /server/httpd/bin/apachectl -t 配置文件详解主配置文件httpd.conf详解# 常用配置及配置详解 # apache安目录，编译时指定，不指定路径时默认路径为/usr/local/apache2 ServerRoot "/server/httpd" # 主站监听端口，可以监听多个端口 #Listen 12.34.56.78:80 # Listen 443 Listen 80 # 模块动态加载，这里只列举几个用到的模块 # 别名 LoadModule alias_module modules/mod_alias.so # url重写 LoadModule rewrite_module modules/mod_rewrite.so # php以模块的形式处理请求 LoadModule php5_module modules/libphp5.so # <Ifxxxx > 容器下文与详细说明 <IfModule unixd_module> # 运行httod服务的用户 User www # 运行httod服务的用户组 Group www </IfModule> # 管理员邮件地址 ServerAdmin you@example.com # 出错时是否显示服务器信息 ServerSignature On # On显示 # Off不显示,默认Off # Email,On的升级版，显示且点击ServerName就会向ServerAdmin中设置的邮箱发邮件 #显示的内容如下 # Apache/2.4.38 (Unix) PHP/5.6.38 Server at 192.168.73.129 Port 80 # 控制Response Header中的Server显示 ServerTokens Full # 选项有 Major | Minor | Min[imal] | Prod[uctOnly] | OS | Full # 默认是Full 这里的选项也会影响ServerSignature的显示内容，主要是详细的服务器版本号内容 # 主站点名称，域名或者IP皆可 ServerName 127.0.0.1:80 # 保持长连接设置 KeepAlive On # 一个连接服务最多请求次数 MaxKeepAliveRequests 100 # 长连接持续时间,超过该时间没有请求数据则断开连接 KeepAliveTimeOut 15 # 记录父进程PID的文件,默认值如下 PidFile "logs/httpd.pid" # 常用的资源限制配置,可减轻DOS攻击 # 设置客户端发送的HTTP请求的最大字节数 默认0 不限制 LimitRequestBody 0 # 限制为500K # LimitRequestBody 512000 # 设置客户端向服务器请求中HTTP请求头域的数量 LimitRequestFields 100 # 默认值一般为100 # 设置客户端发送的HTTP请求头的最大字节数 一般不要改动 LimitRequestFieldsize 8190 # 设置客户端发送的HTTP请求行的最大字节数 # GET / HTTP/1.1 LimitRequestLine 8190 # Dirctory容器对根目录的限制 <Directory /> # indexs 没有默认文件的情况下展示目录结构 options更多选项下文详细叙述 options indexes # 禁用.htaccess文件 AllowOverride none Require all denied </Directory> # 主站访问的根目录 DocumentRoot "/server/…

Linux、Centos下源码编译安装apache、php、mysql
type: item
date: 2019-04-23T15:46:00+08:00
description: 安装前准备安装目录创建mkdir /server需要安装以下依赖yum install gcc yum install gcc-c++ yum install ncurses-devel yum install autoconf yum install expat-devel yum install zlib-devel yum install libxml2-devel yum install openssl yum install openssl-devel yum install curl-devel yum install libpng-devel yum install freetype-develcmake编译参数详情：https://blog.csdn.net/zero_295813128/article/details/51223209https://www.cnblogs.com/martinzhang/p/3455681.htmlMysql源码编译安装1. 资源获取下载地址：https://dev.mysql.com/downloads/mysql/版本区别：https://www.cnblogs.com/langtianya/p/5185601.html获取安装包：# cmake安装包获取 wget https://github.com/Kitware/CMake/releases/download/v3.14.2/cmake-3.14.2.tar.gz # boost安装包获取 # mysql5.7.5版本及以上需要boost，而且可能需要的boost版本还不一样，最好下载mysql源码的时候就下载带有boost的 #wget https://dl.bintray.com/boostorg/release/1.59.0/source/boost_1_59_0.tar.gz #下面的mysql是自带boost的 # mysql安装包获取 wget https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-boost-5.7.26.tar.gz5.7版本以后需要使用boost不同版本的Mysql使用的boost版本不同2.安装安装cmaketar -zxvf cmake-3.14.2.tar.gz && cd cmake-3.14.2 ./configure --prefix=/usr/local/cmake # 编译完会提示使用gmake # 在centos上gmake和make都是GUN make 在某些发行版上make不是GUN make就需要使用gmake,这里使用make就行 make && make install安装mysql# 检测是否有mysql用户 id mysql # 创建mysql用户 groupadd -g 550 mysql useradd -g mysql -u 550 mysql # 创建mysql安装目录 版本号5.5 mkdir /server/mysql57 # 解压安装包并进入目录 tar -zxvf mysql-boost-5.7.26.tar.gz && cd mysql-5.7.26 /usr/local/cmake/bin/cmake . -DCMAKE_INSTALL_PREFIX=/server/mysql57 \ -DMYSQL_DATADIR=/server/mysql57/data \ -DWITH_BOOST=./boost/boost_1_59_0/ \ #使用mysql安装包自带的boost -DSYSCONFDIR=/etc \ -DWITH_INNOBASE_STORAGE_ENGINE=1 \ -DWITH_ARCHIVE_STORAGE_ENGINE=1 \ -DWITH_BLACKHOLE_STORAGE_ENGINE=1 \ -DWITH_PARTITION_STORAGE_ENGINE=1 \ -DWITH_PERFSCHEMA_STORAGE_ENGINE=1 \ -DWITHOUT_EXAMPLE_STORAGE_ENGINE=1 \ -DWITHOUT_FEDERATED_STORAGE_ENGINE=1 \ -DDEFAULT_CHARSET=utf8 \ -DDEFAULT_COLLATION=utf8_general_ci \ -DWITH_EXTRA_CHARSETS=all \ -DENABLED_LOCAL_INFILE=1 \ -DWITH_READLINE=1 \ -DMYSQL_UNIX_ADDR=/server/mysql57/mysql.sock \ -DM…

PHP 编译安装 PHP各参数配置详解
type: item
date: 2019-04-11T17:52:00+08:00
description: php编译安装的基本步骤//首先要下载一个php的安装包,例如:php-5.6.25.tar.gz,tar zxvf php-5.6.25.tar.gz // 解压php安装包,得到一个php-5.6.25的文件夹 cd php-5.6.25 ./configure //对php的安装进行配置,后面要加配置选项 # make && make install //编译安装完成之后,需要从解压后的文件夹中把php.ini-development //或是 php.ini-production 重命名成php.ini 复制到php安装文件中的相应位置, //可在phpinfo中查看 相应位置. // 把/usr/local/php/etc/php-fpm.conf.default 复制到当前文件夹下,保存未php-fpm.conf上面是php编译安装的基本流程,下面详细介绍php的配置参数.php各参数配置详解--prefix=/usr/local/php //指定 php 安装目录--with-apxs2=/usr/local/apache/bin/apxs //整合apache， //apxs功能是使用mod_so中的LoadModule指令， //加载指定模块到 apache，要求 apache 要打开SO模块--with-config-file-path=/usr/local/php/etc //指定php.ini位置--with-MySQL=/usr/local/mysql //mysql安装目录，对mysql的支持--with-mysqli=/usr/local/mysql/bin/mysql_config //mysqli扩展技术不仅可以调用MySQL的存储过程、处理MySQL事务， //而且还可以使访问数据库工作变得更加稳定。--enable-safe-mode //打开安全模式 --enable-ftp //打开ftp的支持 --enable-zip //打开对zip的支持 --with-bz2 //打开对bz2文件的支持 --with-jpeg-dir //打开对jpeg图片的支持 --with-png-dir //打开对png图片的支持 --with-freetype-dir //打开对freetype字体库的支持 --without-iconv //关闭iconv函数，各种字符集间的转换 --with-libXML-dir //打开libxml2库的支持 --with-XMLrpc //打开xml-rpc的c语言 --with-zlib-dir //打开zlib库的支持 --with-gd //打开gd库的支持 --enable-gd-native-ttf //支持TrueType字符串函数库 --with-curl //打开curl浏览工具的支持 --with-curlwrappers //运用curl工具打开url流 --with-ttf //打开freetype1.*的支持，可以不加了 --with-xsl //打开XSLT 文件支持，扩展了libXML2库 ，需要libxslt软件 --with-gettext //打开gnu 的gettext 支持，编码库用到 --with-pear //打开pear命令的支持，PHP扩展用的 --enable-calendar //打开日历扩展功能 --enable-mbstring //多字节，字符串的支持 --enable-bcmath //打开图片大小调整,用到zabbix监控的时候用到了这个模块--enable-sockets //打开 sockets 支持--enable-exif //图片的元数据支持 --enable-magic-quotes //魔术引用的支持 --disable-rpath //关闭额外的运行库文件 --disable-debug //关闭调试模式 --with-mime-magic=/usr/share/file/magic.mime //魔术头文件位置CGI方式安装才用的参数:--enable-fpm //打上PHP-fpm 补丁后才有这个参数，CGI方式安装的启动程序--enable-fastCGI //支持fastcgi方式启动PHP--enable-force-CGI-redirect //重定向方式启动PHP--with-ncurses //支持ncurses 屏幕绘制以及基于文本终端的图形互动功能的动态库--enable-pcntl //freeTDS需要用到的，可能是链接mssql 才用到--with-mcrypt //mcrypt算法的扩展--with-mhash //mhash算法的扩展//以上函数库需要安装-…

php 建设银行支付接口，支付+验签
type: item
date: 2018-04-27T17:42:00+08:00
description: <?php /** * Created by PhpStorm. * User: Xiny i@xiny9.com * Date: 2018-03-15 * Time: 13:23 */ class Dragonpay { private $pubstr = ''; //建行提供的密钥，需要登陆建行商户后台下载 private $MERCHANTID = ''; //商户代码 private $POSID = ''; //商户柜台代码 private $BRANCHID = ''; //银行分行代码 private $ORDERID = ''; //订单编号 private $PAYMENT = ''; //订单金额 private $CURCODE = '01'; //币种 private $TXCODE = '520100'; //交易码 private $REMARK1 = ''; //备注1 private $REMARK2 = ''; //备注2 private $TYPE = ''; //接口类型 private $GATEWAY = ''; //网关类型 private $CLIENTIP = ''; //客户端ip地址 private $PUB32TR2 = ''; //公钥后30位 private $bankURL = ''; //提交url private $REGINFO = ''; //注册信息 private $PROINFO = ''; //商品信息 private $REFERER = ''; //商户域名 private $URL = ''; //聚合二维码配置---start--------------------- //二维码返回形式 private $RETURNTYPE = 3; //超时时间 private $TIMEOUT = ''; //二维码URL private $QRURL = 'https://ibsbjstar.ccb.com.cn/CCBIS/ccbMain?CCB_IBSVersion=V6&'; //textcode private $TEXTCODE2 = '530550'; //聚合二维码配置---end------------------------ private $tmp = ''; private $temp_New = ''; private $temp_New1 = ''; /** * Dragonpay constructor. * @param $pubkey string 商户的公钥 * @param $merchantid string 商户号 * @param $posid string 商户柜台号 * @param $branchid string 分行代码 * @param string $order_sn string 订单号 * @param string $payment string 支付金额 * @param string $proinfo string 商品信息 * @param string $remark1 string 备注1 订单id * @param string $remark2 string 备注2 订单支付方式 */ public function __construct($pubkey, $merchantid, $posid, $branchid, $order_sn = '', $payment = '', $proinfo = '', $remark1 = '', $remark2 = '') { $this->pubstr = trim($pubkey); $this->MERCHANTID = trim($merchantid); $this->POSID = trim($posid); $this->BRANCHID = trim($branchid); $this->ORDERID = $order_sn; $this->PAYMENT = $payment; $this->CURCODE = '01'; $this->TXCODE = '520100'; $this->REMARK1 = $remark1; $this->REMARK2 = $remark2; $this->bankURL = 'https://ibsbjstar.ccb.com.cn/CCBIS/ccbMain'; $this->TYPE = 1; $this->PUB32TR2 = substr($this->pubstr, -30); $this->GATEWAY = ''; $this->CLIENTIP = '';…

php 模拟js escape函数处理字符串
type: item
date: 2018-04-27T17:38:00+08:00
description: function escape($str) { return str_replace('\\', '%', substr(json_encode($str), 1, -1)); } function unescape($str) { return json_decode('"' . str_replace('%', '\\', $str) . '"'); }php 模拟js escape函数处理字符串

php 根据域名获取IP，判断域名是否合法
type: item
date: 2018-04-27T17:29:52+08:00
description: $url = "https://xbug.top/a/c/c"; $ip = gethostbyname(parse_url($url); if (filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4)) { //有效域名 }

php异步执行操作
type: item
date: 2018-04-27T17:26:03+08:00
description: //异步执行操作 function asyn_sock($url) { $host = parse_url($url, PHP_URL_HOST); $port = parse_url($url, PHP_URL_PORT); $port = $port ? $port : 80; $scheme = parse_url($url, PHP_URL_SCHEME); $path = parse_url($url, PHP_URL_PATH); $query = parse_url($url, PHP_URL_QUERY); if ($query) { $path .= '?' . $query; } if ($scheme == 'https') { $host = 'ssl://' . $host; } $fp = fsockopen($host, $port, $error_code, $error_msg, 1); if (!$fp) { return array('error_code' => $error_code, 'error_msg' => $error_msg); } else { stream_set_blocking($fp, true); //开启了手册上说的非阻塞模式 stream_set_timeout($fp, 1); //设置超时 $header = "GET $path HTTP/1.1\r\n"; $header .= "Host: $host\r\n"; $header .= "Connection: close\r\n\r\n"; //长连接关闭 fwrite($fp, $header); usleep(1000); // 这一句也是关键，如果没有这延时，可能在nginx服务器上就无法执行成功 fclose($fp); return json_encode(array('error_code' => 0)); } }Very Nice!非常好用

php 过滤微信昵称中的emoji
type: item
date: 2018-03-14T15:54:00+08:00
description: 过滤掉微信昵称中的emoji表情符号// 过滤掉emoji表情 function filter_Emoji($str) { $str = preg_replace_callback( //执行一个正则表达式搜索并且使用一个回调进行替换 '/./u', function (array $match) { return strlen($match[0]) >= 4 ? '' : $match[0]; }, $str); return $str; }