临近年关,不知是黑客兄弟们闲来无事,还是各个部门要年总总结,总之是在放假之际,系统漏洞陆续爆出。一言蔽之,总是自己技术不过关考虑不周导致的。
在网址url参数后,如果对相对应的参数未做过滤,即直接执行javascript脚本,给系统带来的潜在风险。如:
http://test.com/?m=User&a=userForget<script>alert(1)script>
将常见的威胁系统安全的脚本符合进行过滤,代码如下:
/**
* 安全过滤函数
* @param $str
*/
function safe_replace($str)
{
$disallow_str = array('%20', '%27', '%2527', '*', '"', "'", ';', '<', '>', "{", '}', '\\');
if (is_array($str)) {
return $str;
} else {
for ($i = 0; $i < count($disallow_str); $i++) {
if (stripos($str, $disallow_str[$i]) !== false) {
die('传递参数非法,禁止访问。');
}
}
return $str;
}
}
HttpOnly是Cookie中一个属性,用于防止客户端脚本通过document.cookie属性访问Cookie,有助于保护Cookie不被跨站脚本攻击窃取或篡改。但是,HttpOnly的应用仍存在局限性,一些浏览器可以阻止客户端脚本对Cookie的读操作,但允许写操作;此外大多数浏览器仍允许通过XMLHTTP对象读取HTTP响应中的Set-Cookie头。
Cookie的设置方式(本文采用较为简单的一种方式,其他方式另行查询)
SetCookie("admin_name", $row["user_name"], time() + 604800, "/", '', '', TRUE);
SetCookie("admin_phone", $row["user_phone"], time() + 604800, "/", '', '', TRUE);
SetCookie("admin_id", $row["user_id"], time() + 604800, "/", '', '', TRUE);
SetCookie("admin_menu", $row["user_menu"], time() + 604800, "/", '', '', TRUE);
这是程序开发约定俗成的常见漏洞,比如:
使用默认密码登录系统后,在强制修改密码时,存在手机验证码验证机制,但手机验证码可以使用bp拦截工具进行获取,从而得到修改密码的功能。
直接进行后端校验,不要前端校验完再后端校验。
弱口令,指用户出于偷懒的行为,随时输入123456、88888等常见,容易被暴力破解字典记录,不费吹灰之力就可以破解的密码。
在用户注册、修改等行为时,系统增加密码验证的强度即可。
<div class="layui-form-item">
<label for="L_pass" class="layui-form-label">密码label>
<div class="layui-input-inline"><input type="password" id="L_pass" name="pass" lay-verify="pass" autocomplete="off" class="layui-input">div>
<div class="layui-form-mid layui-word-aux"><span class="x-red">* 密码必须同时包含大写、小写、数字和特殊字符其中三项且至少6位span>div>
div>
密码必须同时包含大写、小写、数字和特殊字符其中三项且至少6位
form.verify({
user_phone: [/^1[3|4|5|6|7|8|9]\d{9}$/, '手机必须11位,只能是数字!']
,smscode: [/[\S]+/, "验证码为6位数且5分钟内有效"]
,pass: [/(?=.*[0-9])(?=.*[a-zA-Z])(?=.*[^a-zA-Z0-9]).{6,30}/, '密码必须同时包含大写、小写、数字和特殊字符其中三项且至少6位']
,repass: function(){
if($('#L_pass').val()!=$('#L_repass').val()){
return '两次密码不一致';
}
}
,user_email: [/^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/, "邮箱格式不正确"],
});
$_SESSION['upToken'] = md5(rand(111111, 999999));
$tpl->assign('upToken', $_SESSION['upToken']);
//01.获取验证token
if ($token != $_SESSION['upToken'] || $token == "") {
$res['code'] = "1";
$res['msg'] = "非法传参页面,请刷新重新上传";//$token . 'a-a' . $_SESSION['upToken'];
//验证码自动销毁;
session_destroy();
die(json_encode_lockdata($res));
}
<script>
var upToken='{$upToken}';
script>
//白名单;
$allow_type = array('application/pdf', 'image/png', 'image/jpeg', 'video/mp4');
$allow_ext = array('pdf', 'jpg', 'png', 'mp4');
//02.服务器端检查上传文件类型;
if ($uploaded_tmp == "") {
$res['code'] = "1";
$res['msg'] = "无法获取上传文件";
die(json_encode_lockdata($res));
}
//03.检测内容是否包含木马;
if (checkHex($uploaded_tmp) != 0) {
$res['code'] = "1";
$res['msg'] = "文件包含危险信息";
die(json_encode_lockdata($res));
}
//重新制作一张图片,抹去任何可能有危害的数据
if ((strtolower($uploaded_ext) == 'jpg' || strtolower($uploaded_ext) == 'jpeg' || strtolower($uploaded_ext) == 'png') &&
($uploaded_type == 'image/jpeg' || $uploaded_type == 'image/png') && getimagesize($uploaded_tmp)) {
if ($uploaded_type == 'image/jpeg') {
$img = imagecreatefromjpeg($uploaded_tmp);
imagejpeg($img, $temp_file, 80);
} else {
$img = imagecreatefrompng($uploaded_tmp);
imagepng($img, $temp_file, 80);
}
imagedestroy($img);
//文件转储;
if (rename($temp_file, $imgUrl . "/" . $fileName)) {
$res['code'] = "0";
$res['imgUrl'] = $imgUrl . "/" . $fileName;
$res['data'] = ["src" => $imgUrl . "/" . $fileName, "title" => $fileName];//富文本上传调用
$res['msg'] = '上传成功!';
die(json_encode_lockdata($res));
} else {
$res['code'] = "1";
$res['msg'] = '上传文件异常';
die(json_encode_lockdata($res));
}
//删除所有暂时文件
if (file_exists($temp_file)) {
unlink($temp_file);
}
}
所谓攻防,如果知道攻,那么防是简单的;如果对攻不甚了解,那么就无所谓防。感谢在系统上线,不同网络安全检测团队对系统不同方面的检测和及时反馈,让自己的系统不断的优化和调整,不断地成长。