Skip to content

后端代码相关

更新: 2023-12-07 18:05:28   字数: 0 字   时长: 0 分钟

1、通过反射实现深拷贝和浅拷贝

浅拷贝:仅复制对象的引用,修改其中一个对象,会影响另一个对象

深拷贝:既复制对象的值,也复制对象的引用,修改其中一个对象,不会影响另一个对象

C#
// 通过反射实现对象浅拷贝泛型方法
public T? ShallowCopy<T>(T? obj) where T : class
{
    if (obj == null)
    {
        return default;
    }
    // 获取类型
    Type type = obj.GetType();
    // 创建实例
    T? copy = (T?)Activator.CreateInstance(type);
    // 获取所有字段
    FieldInfo[] fields = type.GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);
    // 遍历字段
    foreach (FieldInfo field in fields)
    {
        // 获取字段值
        object? value = field.GetValue(obj);
        // 设置字段值
        field.SetValue(copy, value);
    }
    return copy;
}

// 通过反射实现对象深拷贝泛型方法
public T? DeepCopy<T>(T? obj) where T : class
{
    if (obj == null)
    {
        return default;
    }
    // 获取类型
    Type type = obj.GetType();
    // 创建实例
    T? copy = (T?)Activator.CreateInstance(type);
    // 获取所有字段
    FieldInfo[] fields = type.GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);
    // 遍历字段
    foreach (FieldInfo field in fields)
    {
        // 获取字段值
        object? value = field.GetValue(obj);
        // 判断值是否为null
        if (value == null)
        {
            continue;
        }
        // 判断字段值是否为值类型
        if (value.GetType().IsValueType)
        {
            // 设置字段值
            field.SetValue(copy, value);
        }
        else
        {
            // 递归调用
            field.SetValue(copy, DeepCopy(value));
        }
    }
    return copy;
}

2、文本文件读写

C#
// 读取文本文件
public string ReadTextFile(string path)
{
    using FileStream fs = new(path, FileMode.Open, FileAccess.Read);
    using StreamReader sr = new(fs);
    return sr.ReadToEnd();
}

// 写入文本文件
public void WriteTextFile(string path, string text)
{
    using FileStream fs = new(path, FileMode.Create, FileAccess.Write);
    using StreamWriter sw = new(fs);
    sw.Write(text);
}

3、时间戳/DateTime 转化

C#
// 获取当前时间戳
long timestamp = DateTimeOffset.Now.ToUnixTimeSeconds();

// 时间戳转DateTime
DateTime time = DateTimeOffset.FromUnixTimeSeconds(timestamp).LocalDateTime;

4、图片转 Base64

C#
// 图片转Base64
public string ImageToBase64(string path)
{
    using FileStream fs = new(path, FileMode.Open, FileAccess.Read);
    byte[] buffer = new byte[fs.Length];
    fs.Read(buffer, 0, buffer.Length);
    return Convert.ToBase64String(buffer);
}

5、防止跨站脚本(XSS)攻击

为了防止 XSS 攻击,需要对用户提供的数据进行适当的 HTML 编码,以确保任何用户输入不会被解释为 HTML 或 JavaScript 代码。

C#
public string AntiXss(string text)
{
    return WebUtility.HtmlEncode(text);
}

6、防止 SQL 注入的三种方法

1、使用参数化 SQL 语句:参数化查询通过将输入参数作为参数传递给查询来避免 SQL 注入攻击。这样可以将输入值作为字符串传递,而不是将字符串值作为查询的一部分来编写查询语句。

2、使用 ORM 框架:框架可以去除 SQL 注入攻击的需求,因为它们通常使用参数化查询来保护你的代码。

3、输入过滤:输入过滤是一种处理用户输入的技术,使其不包含任何可以用于 SQL 注入攻击的恶意字符或语句。输入过滤有很多不同的方式和技术,最常见的方式是将关键字符或语句从输入数据中移除。

C#
public string AntiSqlInjection(string str)
{
    return str.Replace("'", "''");
}
你觉得这篇文章怎么样?
  • 0
  • 0
  • 0
  • 0
  • 0
  • 0
评论
  • 按正序
  • 按倒序
  • 按热度