PHP常见的安全问题汇总
2017-05-11 00:00
344 查看
一. XSS(跨站脚本攻击)
可以用于窃取其他用户的Cookie信息,要避免此类问题,可以采用如下解决方案:
● 直接过滤所有的JavaScript脚本;
● 转义Html元字符,使用htmlentities、htmlspecialchars等函数;
● 系统的扩展函数库提供了XSS安全过滤的remove_xss方法;
● 新版对URL访问的一些系统变量已经做了XSS处理。
二:Server相关的配置信息被暴露,未进行模糊处理
1.http {
……省略配置
server_tokens off; ->即可隐藏版本号
…….省略配置
}
重启nginx后,我们返回的Server头格式为Server:nginx ,而且nginx自己的404页面也没有版本号的信息
2.返回自定义的server 混淆Server信息
我是不太愿意告诉别人我是使用什么Server的,但没有找到相关文献去隐藏它,所以我们可以混淆她,如把Server返回GFW之类的,吓唬吓唬那些脚本小子
大部分情况下,脚本的小子的扫描工具是扫描我们response返回的header中的server信息.我们可以采用编译源码的方法来改变返回的Server,笔者的版本是nginx1.7.0,我们修改src/http/ngx_http_header_filter_module.c 中的48行
static char ngx_http_server_string[] = "Server: nginx" CRLF;
把其中的nginx改为我们自己想要的文字即可,笔者就改为了GFW. 笔者输出的Server:GFW.(这个前提是你进行了第一个步句的操作,关闭了版本号)
如果你的版本号是开着的,你又想调戏下脚本小子.比如Server:billgate/1.9.0
我们修改src/core/nginx.h 定位到13-14行
#define NGINX_VERSION "1.7.0"
#define NGINX_VER "nginx/" NGINX_VERSION
Server返回的就是常量NGINX_VER, 我们把NGINX_VERSION大小定义为1.9.0,nginx改为billgate就能达到我们的目的了
三:url_fopen开启可能导致文件包含漏洞
php.ini 中的 allow_url_fopen设置为Off; allow_url_include设置为Off
四:不安全的函数引用
1.不要使用mysql_escape_string,它已被弃用,请使用mysql_real_escape_string代替它。
/**
* SQL指令安全过滤
* @access public
* @param string $str SQL字符串
* @return string
*/
public function escapeString($str) {
if($this->_linkID) {
return mysql_real_escape_string($str,$this->_linkID);
}else{
return mysql_escape_string($str);
}
}
2.split() 替代方案
* 需要regex 的split, 可用preg_split() 代替
* 不需要regex, 只要要快速分割固定的字串, 可用explode() 代替. (速度会比需要regex 的快很多)
五:开放的重定向,跨站攻击
1.url白名单,对重定向路径进行验证
例:
//白名单配置
'LEGAL_URL' => array(
'http://localhost/shenzhen',
'shenzhen',
),
$legalUrls = C('LEGAL_URL');
$isLegal = false;
foreach($legalUrls as $legalUrl){
if(strstr($tourl,$legalUrl)){
$isLegal = true; break;
}
}
if($isLegal){
if (php_sapi_name() === 'cli') {
@header('Location: '.$tourl);
} else {
header('Location: '. $tourl);
}
}
六:SQL注入
1.对参数进行过滤
如:1.$fids = is_array($fids) ? array_unique(array_map( 'intval' , $fids)) : array_unique(array_map( 'intval' , explode(',', $fids)));
2.$data ['table'] = $data ['table_name'] 改为 $data ['table'] = preg_replace("/[^\w|,]/","",t($data ['table_name']));
3.$map [$idField] = $data ['row_id']; 改为 $map [$idField] = intval($data ['row_id']);
七: 未设置cookie的httponly和secure属性。存在cookie被窃取和篡改的风险。
在PHP文件添加 ini_set("session.cookie_httponly", 1); //开启全局的httponly
八:越权操作(添加,修改,删除)
可根据需求而定,对当前操作用户添加权限验证。
九: 泄露绝对路径
对绝对路径进行加密处理
可以用于窃取其他用户的Cookie信息,要避免此类问题,可以采用如下解决方案:
● 直接过滤所有的JavaScript脚本;
● 转义Html元字符,使用htmlentities、htmlspecialchars等函数;
● 系统的扩展函数库提供了XSS安全过滤的remove_xss方法;
● 新版对URL访问的一些系统变量已经做了XSS处理。
二:Server相关的配置信息被暴露,未进行模糊处理
1.http {
……省略配置
server_tokens off; ->即可隐藏版本号
…….省略配置
}
重启nginx后,我们返回的Server头格式为Server:nginx ,而且nginx自己的404页面也没有版本号的信息
2.返回自定义的server 混淆Server信息
我是不太愿意告诉别人我是使用什么Server的,但没有找到相关文献去隐藏它,所以我们可以混淆她,如把Server返回GFW之类的,吓唬吓唬那些脚本小子
大部分情况下,脚本的小子的扫描工具是扫描我们response返回的header中的server信息.我们可以采用编译源码的方法来改变返回的Server,笔者的版本是nginx1.7.0,我们修改src/http/ngx_http_header_filter_module.c 中的48行
static char ngx_http_server_string[] = "Server: nginx" CRLF;
把其中的nginx改为我们自己想要的文字即可,笔者就改为了GFW. 笔者输出的Server:GFW.(这个前提是你进行了第一个步句的操作,关闭了版本号)
如果你的版本号是开着的,你又想调戏下脚本小子.比如Server:billgate/1.9.0
我们修改src/core/nginx.h 定位到13-14行
#define NGINX_VERSION "1.7.0"
#define NGINX_VER "nginx/" NGINX_VERSION
Server返回的就是常量NGINX_VER, 我们把NGINX_VERSION大小定义为1.9.0,nginx改为billgate就能达到我们的目的了
三:url_fopen开启可能导致文件包含漏洞
php.ini 中的 allow_url_fopen设置为Off; allow_url_include设置为Off
四:不安全的函数引用
1.不要使用mysql_escape_string,它已被弃用,请使用mysql_real_escape_string代替它。
/**
* SQL指令安全过滤
* @access public
* @param string $str SQL字符串
* @return string
*/
public function escapeString($str) {
if($this->_linkID) {
return mysql_real_escape_string($str,$this->_linkID);
}else{
return mysql_escape_string($str);
}
}
2.split() 替代方案
* 需要regex 的split, 可用preg_split() 代替
* 不需要regex, 只要要快速分割固定的字串, 可用explode() 代替. (速度会比需要regex 的快很多)
五:开放的重定向,跨站攻击
1.url白名单,对重定向路径进行验证
例:
//白名单配置
'LEGAL_URL' => array(
'http://localhost/shenzhen',
'shenzhen',
),
$legalUrls = C('LEGAL_URL');
$isLegal = false;
foreach($legalUrls as $legalUrl){
if(strstr($tourl,$legalUrl)){
$isLegal = true; break;
}
}
if($isLegal){
if (php_sapi_name() === 'cli') {
@header('Location: '.$tourl);
} else {
header('Location: '. $tourl);
}
}
六:SQL注入
1.对参数进行过滤
如:1.$fids = is_array($fids) ? array_unique(array_map( 'intval' , $fids)) : array_unique(array_map( 'intval' , explode(',', $fids)));
2.$data ['table'] = $data ['table_name'] 改为 $data ['table'] = preg_replace("/[^\w|,]/","",t($data ['table_name']));
3.$map [$idField] = $data ['row_id']; 改为 $map [$idField] = intval($data ['row_id']);
七: 未设置cookie的httponly和secure属性。存在cookie被窃取和篡改的风险。
在PHP文件添加 ini_set("session.cookie_httponly", 1); //开启全局的httponly
八:越权操作(添加,修改,删除)
可根据需求而定,对当前操作用户添加权限验证。
九: 泄露绝对路径
对绝对路径进行加密处理
相关文章推荐
- PHP开发中常见的安全问题详解和解决方法
- 【常见Web应用安全问题】---9、PHP code injection
- [PHP] php中常见小问题汇总
- 转阿彪 PHP常见的安全问题
- PHP常见问题汇总
- PHP项目常见的安全问题
- PHP常见问题汇总
- PHP开发中常见的安全问题详解和解决方法(如Sql注入、CSRF、Xss、CC等)
- PHP开发中常见的安全问题详解和解决方法(如Sql注入、CSRF、Xss、CC等)
- 【常见Web应用安全问题】---9、PHP code injection
- PHP常见的安全问题
- 安装PHP常见问题汇总
- PHP网站开发中常见问题汇总
- (一)PHP常见问题汇总
- 汇总PHPmailer群发Gmail的常见问题
- PHP项目常见的安全问题
- centos搭建PHP的常见问题汇总
- PHP开发中常见的安全问题详解和解决方法(如Sql注入、CSRF、Xss、CC等)
- 【常见Web应用安全问题】---9、PHP code injection
- PHP网站开发中常见问题汇总