您的位置:首页 > 编程语言 > PHP开发

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
八:越权操作(添加,修改,删除)
可根据需求而定,对当前操作用户添加权限验证。
九: 泄露绝对路径
对绝对路径进行加密处理
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  PHP安全