零点博客技术笔记:C#爬虫实战,手把手教你防范SQL注入与JSON解析

大家好,我是来自零点博客的技术博主。在之前的文章里,我们聊了怎么用C#做个简单的HTML解析器,最近后台私信很多朋友问:数据抓下来了,怎么存到数据库里才安全?今天咱们就来做一个真实的技术笔记复盘,实战演示如何开发一个爬虫,重点在于JSON解析和关键的SQL注入防护。

一、 背景与目标

我们的目标是写一个轻量级的采集工具,去抓取某公开API的JSON数据,并将其解析后存入MySQL数据库。在写代码前,必须明确一点:除非你能确保接口100%安全且只读,否则永远不要信任用户输入,更不要相信拼接的SQL语句。

二、 核心痛点:如何安全存入MySQL?

很多初学者喜欢用拼接字符串的方式存数据,比如 `sql = "INSERT INTO logs (title) VALUES ('" + content + "')"`。这简直是给SQL注入攻击敞开大门。我在零点博客的开发实践中,坚持使用预处理语句(Prepared Statement),这是底层的避坑指南。

三、 实战代码:C# JSON与数据库交互

下面是一个简化的代码片段,包含了HttpClient请求、Newtonsoft.Json解析以及MySQL的安全写入。

using MySql.Data.MySqlClient;
using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Text;
using Newtonsoft.Json.Linq;

public class SpiderHelper
{
    // 数据库连接字符串(建议使用配置文件管理,切勿硬编码明文密码)
    private static string connStr = "Server=localhost;Database=spider_db;Uid=root;Pwd=your_password;";

    public static void StartFetch()
    {
        // 1. 发送HTTP请求获取JSON数据
        using (var client = new HttpClient())
        {
            var response = client.GetStringAsync("https://api.example.com/data").Result;
            var json = JObject.Parse(response);

            foreach (var item in json["data"])
            {
                string title = item["title"].ToString();

                // 2. 数据入库:使用预处理语句防止注入
                SaveToDatabase(title);
            }
        }
    }

    private static void SaveToDatabase(string title)
    {
        using (MySqlConnection conn = new MySqlConnection(connStr))
        {
            conn.Open();
            // 注意:参数化查询的核心在于 @Title 占位符
            string sql = "INSERT INTO articles (title, create_time) VALUES (@Title, NOW())";

            using (MySqlCommand cmd = new MySqlCommand(sql, conn))
            {
                // 添加参数,数据库会自动转义,杜绝注入
                cmd.Parameters.AddWithValue("@Title", title);

                cmd.ExecuteNonQuery();
                Console.WriteLine($"已保存: {title}");
            }
        }
    }
}

四、 避坑指南与底层拆解

  1. 编码问题:在读取网页或JSON时,如果是中文乱码,务必检查UTF-8编码设置,这是最常遇到的初阶坑。
  2. 事务处理:如果数据量巨大,频繁开启关闭数据库连接非常耗费性能,建议使用连接池,或者直接使用事务。
  3. 接口反爬:如果对方限制了频率,简单的做法是配合正则表达式提取Referer或者User-Agent,在HttpClient的请求头中伪装。

这次实战主要展示了后端开发中安全性的重要性。如果你对EMLOG二次开发或者PHP后端相关的爬虫逻辑感兴趣,欢迎在零点博客留言讨论。记住,代码不仅要能跑,更要跑得安全!