后端代码相关
更新: 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("'", "''");
}