说明:本文主要是平常工作中遇到的一些安全性问题总结,会持续更新。
- 关闭PHP版本信息在http头中的泄漏
PHP隐藏server
修改 php.ini 文件 设置 expose_php = Off
apache 隐藏 server
修改httpd.conf 设置 ServerSignature Off ServerTokens Prod
nginx 隐藏 server
修改nginx.conf 在http里面设置 server_tokens off; - web应用表单密码类型输入启用了自动完成操作
在type="password"的input框中加入autocomplete="off"属性 - X-Frame-Options未配置
X-Frame-Options 有三个值:
①DENY
表示该页面不允许在 frame 中展示,即便是在相同域名的页面中嵌套也不允许。
②SAMEORIGIN
表示该页面可以在相同域名页面的 frame 中展示。
③ALLOW-FROM uri
表示该页面可以在指定来源的 frame 中展示。
nginx配置
添加add_header X-Frame-Options SAMEORIGIN;
Apache配置:
apache可配置http.conf如下:
<IfModule headers_module>
Header always append X-Frame-Options "DENY"
</IfModule>
- 检测到会话cookie中缺少HttpOnly属性
将php.ini配置修改成session.cookie_httponly = 1,这主要是为了防止攻击者通过程序(JS脚本、Applet等)获取到用户的cookie信息 - crossdomain.xml解决跨域问题
示例:
<?xml version="1.0"?>
<cross-domain-policy>
<allow-access-from domain="*.luoyang.changyan.cn" />
<allow-http-request-headers-from domain="*.luoyang.changyan.cn" headers="*"/>
</cross-domain-policy>
6.XSS反射型和存储型
①tp框架尽量用I方法获取传入参数,富文本框除外,因为可能需要过滤,所以需要没有经过任何处理过的参数。
②输出时,可以使用htmlspecialchars,eg:{$test|htmlspecialchars=###,ENT_QUOTES}
③使用过滤函数,或者使用白名单方式,或者360提供的php类
eg:
/**
1. t函数用于过滤标签,输出没有html的干净的文本
2. @param string text 文本内容
3. @return string 处理后内容
*/
function t($text){
$text = str_replace(array("\""," "), array('',''),$text);
$text = nl2br($text);
$text = real_strip_tags($text);
$text = addslashes($text);
$text = trim($text);
$text = htmlspecialchars($text);
return $text;
}
- SQL注入
①参数只可能为整型时 将参数转换为整型
②参数过滤
eg:
//防sql注入
function post_check($post) {
// 判断magic_quotes_gpc是否为打开
if (!get_magic_quotes_gpc()) {
$post = addslashes($post); // 进行magic_quotes_gpc没有打开的情况对提交数据的过滤
}
$post = str_replace("_", "\_", $post); // 把 '_'过滤掉
$post = str_replace("%", "\%", $post); // 把' % '过滤掉
$post = nl2br($post); // 回车转换
$post= htmlspecialchars($post); // html标记转换
$post = mysql_real_escape_string($post);
return $post;
}
③PDO,从根本上解决sql注入问题