php中mysql_real_escape_string+sprintf防止sql注入

本文详细阐述了一个用于验证密钥的PHP函数实现过程,包括数据库查询、IP验证及返回JSON响应。
    function verify_key($db, $key)
    {
        $clientIp = $_SERVER["REMOTE_ADDR"]; 
        $sql = sprintf("select *  from myweb_key where keydata = '%s'",mysql_real_escape_string($key));
        $query = $db->mysql_query($sql);
        if ($query) {
            # code...
            if ($db->column_num_rows($query) > 0) {
                $result  = $db->mysql_getdata($query);
                if ( $result['keydata'] == $key && $clientIp == $result['ip']) {
                    # code...
                    $array = ['status'=>'True', 'data'=>'the key is current'];
                    $array_to_json = json_encode($array);
                    return $array_to_json;
                }
                elseif ($clientIp != $result['ip']) 
                {
                    $array = ['status'=>'False', 
                        'data'=>'you address ip  is  not current in database ,must key with ip current, then you scan seach the block ip'];
                    $array_to_json = json_encode($array);
                    return $array_to_json;
                }
            }
            else
            {
                    $array = ['status'=>'False', 'data'=>'the key is  not found in column'];
                    $array_to_json = json_encode($array);
                    return $array_to_json;
            }               
        }

    }
直接使用mysql软件向两个表写入内容成功,为什么使用下面代码,第一个表写入中文没有问题,第二个就有问题,bool DatabaseWriter::writeToDatabase(const SchemeRunResult& task) { MYSQL* conn = connectionPool.getConnection(); if (!conn) { LWARN("获取数据库连接失败"); return false; } LWARN("开始事务"); // 开始事务 if (mysql_query(conn, "START TRANSACTION")) { char error_msg[512]; snprintf(error_msg, sizeof(error_msg), "开始事务失败 - 错误代码: %d, 错误信息: %s", mysql_errno(conn), mysql_error(conn)); LWARN(error_msg); connectionPool.releaseConnection(conn); return false; } bool success = false; int lastInsertId = 0; try { // 插入测试结果 lastInsertId = insertTestResult(conn, task); //LWARN("插入测试结果,返回ID: " + QString::number(lastInsertId).toUtf8()); if (lastInsertId <= 0) { throw std::runtime_error("插入测试结果失败"); } if (!task.Result && !task.ListDefect.isEmpty()) { //LWARN("开始插入缺陷数据,数量: " + QString::number(task.ListDefect.size()).toUtf8()); // 插入缺陷数据 if (!insertDefects(conn, lastInsertId, task.ListDefect)) { throw std::runtime_error("插入缺陷数据失败"); } LWARN("缺陷数据插入成功"); } // 提交事务 if (mysql_query(conn, "COMMIT")) { throw std::runtime_error("提交事务失败"); } //LWARN("数据写入成功,测试记录ID: " + QString::number(lastInsertId).toUtf8()); success = true; } catch (const std::exception& e) { char error_msg[512]; snprintf(error_msg, sizeof(error_msg), "数据库操作异常: %s", e.what()); LWARN(error_msg); mysql_query(conn, "ROLLBACK"); LWARN("事务已回滚"); // 输出详细的MySQL错误信息 snprintf(error_msg, sizeof(error_msg), "MySQL错误 - 代码: %d, 信息: %s", mysql_errno(conn), mysql_error(conn)); LWARN(error_msg); } connectionPool.releaseConnection(conn); return success; } bool DatabaseWriter::insertTestResult(MYSQL* mysql, const SchemeRunResult& task) { char buffer[2048] = ""; // 转义字符串防止SQL注入 char escapedScheme[256] = { 0 }; char escapedStation[256] = { 0 }; char escapedType[256] = { 0 }; mysql_real_escape_string(mysql, escapedScheme, task.schemeName.toUtf8().constData(), task.schemeName.length()); mysql_real_escape_string(mysql, escapedStation, task.StationName.toUtf8().constData(), task.StationName.length()); mysql_real_escape_string(mysql, escapedType, task.typeName.toUtf8().constData(), task.typeName.length()); sprintf(buffer, "INSERT INTO test_results (result, scheme_name, station_name, type_name, test_time, test_take_time) " "VALUES (%d, '%s', '%s', '%s', '%s', %d)", task.Result ? 1 : 0, escapedScheme, escapedStation, escapedType, task.sTestTime.toStdString().c_str(), task.nTestTakeTime ); if (mysql_query(mysql, buffer)) { char error_msg[512]; snprintf(error_msg, sizeof(error_msg), "插入测试结果失败 - 错误代码: %d, 错误信息: %s, SQL: %s", mysql_errno(mysql), mysql_error(mysql), buffer); LWARN(error_msg); return 0; } return mysql_insert_id(mysql); } bool DatabaseWriter::insertDefects(MYSQL* mysql, int testResultId, const QList<QString>& defects) { for (const QString& defect : defects) { if (defect.isEmpty()) continue; char buffer[512] = ""; char escapedDefect[256] = { 0 }; mysql_real_escape_string(mysql, escapedDefect, defect.toUtf8().constData(), defect.length()); snprintf(buffer, sizeof(buffer), "INSERT INTO defects (test_result_id, defect_name) " "VALUES (%d, '%s')", testResultId, escapedDefect ); if (mysql_query(mysql, buffer)) { char error_msg[512]; snprintf(error_msg, sizeof(error_msg), "插入缺陷数据失败 - 错误代码: %d, 错误信息: %s, SQL: %s", mysql_errno(mysql), mysql_error(mysql), buffer); LWARN(error_msg); return false; } } return true; } 为什么只有写入defect_name异常呢
最新发布
09-18
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值