Xinu

php安全基础一
PHP安全基础一生产环境php.ini推荐配置; 基础设置 ; 关闭错误输出 display_erros = O...
扫描右侧二维码阅读全文
14
2019/12

php安全基础一

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

附录

PHP中的危险函数

函数名函数功能危害
chgrp()改变文件或目录所属用户组
chown()改变文件或目录的所有者
chroot()改变当前PHP进程的工作根目录,仅支持linux且cli模式
dl()在PHP运行过程中,加载一个PHP外部模块
exec()允许执行一个外部程序(Unix Shell 或 CMD命令等)
ini_alter()init_set()别名
ini_restore()将PHP环境配置参数恢复为初始值
ini_set()修改、设置PHP环境配置参数
passthru()允许执行一个外部程序并回显输出,类似exec()
pfsockopen()建立一个Internet或UNIX域的socket持久连接
phpinfo()输出PHP环境信息、扩展、web环境信息等
popen()可通过popen()参数传递命令,并对popen()打开的文件进行执行
proc_get_status()获取是使用proc_open()所打开进程的信息
proc_open()执行一个命令并打开文件指针用于读取及写入
readlink()返回符号连接指向的目标文件内容
scandir()列出指定路径中的文件和目录
shell_exec()通过shell执行命令,并将执行结果作为字符串返回
stream_socket_server()建立一个Internet或UNIX服务器连接
symlink()对已有的target建立一个名为link的符号连接
syslog()调用UNIX系统层syslog()函数
system()允许执行一个外部程序并回显输出,类似passthru()
Last modification:December 14th, 2019 at 11:48 pm

Leave a Comment