富贵长生天做主由不得我
钢骨正气我做主由不得天

ThinkPHP3.2.X SQL注入漏洞的解决方案

程序部分

1.入口文件加入SQL关键字过滤(立刻要做), API的有多维数据的需要注意

2.任何密码要有等级检测, 密码位数提高到8位以上

3.纯数字的支付密码也要有安全检测, 如’123456’的密码将不能通过

4.登录/支付密码连续错误5次账号暂停24小时(后台参数可设置)

5.密码要先在本地加密(SHA1)

6.涉及API接口对接的项目全部使用AES加密(每个项目最好使用不同的密钥, 注意同一项目密钥一旦确定最好不要修改)

7.涉及金额的重要项目, 金额先用用户的ID连接再使用AES加密, 如用户的ID为1, 金额为1.00, 那组合成AesEn(‘1_1.00’), 解密后要对用户ID比对. 防止直接串改数据库. 同时可以有一项不加密的金额字段, 只是做为程序员用

8.涉及金额项目要有日志, 日志变更和余额变更做好封装

运维部分

1.服务器数据库密码使用10位以上数字字母符号混合的字符串

2.服务器尽量少开端口, 一般80, 443, 22端口即可, 另外最好把22端口修改为其它端口

3.涉及Windows服务器需要安装微软自带杀毒软件, 及打开防火墙, 同时系统安装完之后要先把所有的补丁打上之后再作其它操作, 3389端口最好也要修改一下

4.打开服务器的各种日志, 如nginx访问日志, mysql的日志等, lnmp默认是不打开的

//防止SQL注入代码,请将该文件中前两段代码添加到自己项目index.php的最前面即可
//判断是否含有SQL注入并跳出
function sqlInj($value) {
    if (is_string($value)) {
        $arr =array('UPDATEXML','UPDATE','WHERE','EXEC','INSERT','SELECT','DELETE','COUNT','CHR','MID','MASTER','TRUNCATE','DECLARE','BIND','DROP'
        ,'CREATE',' EXP ','EXP%',' OR ','XOR',' LIKE ','NOTLIKE','NOT BETWEEN','NOTBETWEEN','BETWEEN','NOTIN','NOT IN','CONTACT','EXTRACTVALUE'
        ,'LOAD_FILE','INFORMATION_SCHEMA','INFORMATION_SCHEMA','outfile','%20','into','union');
        foreach ($arr as $a) {
            if (stripos($value, $a) !== false) exit(json_encode(array('status' => -1, 'info' => '参数错误,含有敏感字符' . $a, 'data' => array($a)), 0));
        }
    } elseif (is_array($value)) {
        foreach ($value as $v) {
            sqlInj($v);
        }
    }
}
 
//防止微信支付宝回调被屏蔽
if (stripos($_SERVER['PHP_SELF'], 'wxNotify') === false && stripos($_SERVER['PHP_SELF'], 'alipayNotify') === false)
    sqlInj($_REQUEST);//不是回调方法时执行防止SQL注入代码
//防止SQL注入代码,请将该文件中前两段代码添加到自己项目index.php的最前面即可
/*****防止SQL注入代码 begin*****/
//判断是否含有注入并跳出
function sqlInj($value) {
    //过滤参数
    $arr = explode('|', 'UPDATEXML|UPDATE|WHERE|EXEC|INSERT|SELECT|DELETE|COUNT|CHR|MID|MASTER|TRUNCATE|DECLARE|BIND|DROP|CREATE| EXP |EXP%| OR |XOR| LIKE |NOTLIKE|NOT BETWEEN|NOTBETWEEN|BETWEEN|NOTIN|NOT IN|CONTACT|EXTRACTVALUE|LOAD_FILE|INFORMATION_SCHEMA|outfile|%20|into|union');
    if (is_string($value)) {
        foreach ($arr as $a) {
            //判断参数值中是否含有SQL关键字,如果有则跳出
            if (stripos($value, $a) !== false) exit(json_encode(array('status' => -1, 'info' => '参数错误,含有敏感字符' . $a, 'data' => array($a)), 0));
        }
    } elseif (is_array($value)) {
        //如果参数值是数组则递归遍历判断
        foreach ($value as $v) {
            sqlInj($v);
        }
    }
}

//过滤请求参数
foreach ($_REQUEST as $key => $value) {
    sqlInj($value);
}
/*****防止SQL注入代码 end*****/

Thinkphp3.2.3最新版update注入漏洞

简要描述 

thinkphp是国内著名的php开发框架,有完善的开发文档,基于MVC架构,其中Thinkphp3.2.3是目前使用最广泛的thinkphp版本,虽然已经停止新功能的开发,但是普及度高于新出的thinkphp5系列,由于框架实现安全数据库过程中在update更新数据的过程中存在SQL语句的拼接,并且当传入数组未过滤时导致出现了SQL注入。

Git补丁更新新增加了BIND表达式

ThinkPHP/Common/functions.php

赞(0)
版权声明:本文采用知识共享 署名4.0国际许可协议 [BY-NC-SA] 进行授权
文章名称:《ThinkPHP3.2.X SQL注入漏洞的解决方案》
文章链接:https://www.lolmm.cn/stwd/839.html
本站资源仅供个人学习交流,请于下载后24小时内删除,不允许用于商业用途,否则法律问题自行承担。

评论 抢沙发

评论前必须登录!