Улучшение читаемости кода: Используйте различные стили шрифтов, цвета и размеры для усложнения распознавания машинами. 2. Добавление фоновых шумов: Введение случайных шумов на изображении может сделать автоматическое распознавание сложнее. 3. Использование искажений: Искажение букв и цифр может помочь предотвратить автоматическое распознавание. 4. Включение альтернативных методов проверки: Предоставление альтернативных методов проверки, таких как проверка по электронной почте или SMS, может улучшить удобство для пользователей. 5. Использование CAPTCHA с аудио: Предоставление альтернативного аудио CAPTCHA может помочь пользователям с ограниченными возможностями. 6. Обеспечение безопасности: Убедитесь, что ваша система CAPTCHA защищена от атак и может эффективно различать людей и ботов. 7. Улучшение пользовательского опыта: Убедитесь, что CAPTCHA легко читаема и не создает проблем для пользователей. 8. Использование современных технологий: Используйте современные технологии CAPTCHA, такие как hCaptcha или reCAPTCHA, которые используют машинное обучение для улучшения точности и удобства использования. 9. Тестирование и мониторинг: Регулярно тестируйте и мониторьте систему CAPTCHA для выявления и устранения проблем.10. Обеспечение конфиденциальности: Убедитесь, что ваша система CAPTCHA не собирает или не использует конфиденциальную информацию пользователя.
Предыдущий private static byte[] GenerateImage(string code) имел серьезные проблемы совместимости на Linux или в контейнерах Docker, поэтому был заменен на SixLabors.ImageSharp.
using System;
using System.Text;
using System.IO;
using SixLabors.Fonts;
using SixLabors.ImageSharp;
using SixLabors.ImageSharp.PixelFormats;
using SixLabors.ImageSharp.Processing;
using SixLabors.ImageSharp.Drawing;
using SixLabors.ImageSharp.Drawing.Processing;
using System.Linq;
namespace ReZero.SuperAPI
{
/// <summary>
/// ** Описание: класс для генерации验证码类
/// ** 创建时间:2015-6-30
/// ** 修改时间:-
/// ** 修改人:sunkaixuan
/// </summary>
public class VerifyCodeSugar
{
private static readonly char[] chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789".ToCharArray();
private static readonly Random random = new Random();
internal static (string, byte[]) Create()
{
string code = GenerateCode(4);
byte[] imageBytes = GenerateImage(code);
return (code, imageBytes);
}
private static string GenerateCode(int length)
{
StringBuilder sb = new StringBuilder(length);
for (int i = 0; i < length; i++)
{
sb.Append(chars[random.Next(chars.Length)]);
}
return sb.ToString();
}
private static byte[] GenerateImage(string code)
{
int width = 100;
int height = 40;
using var image = new Image<Rgba32>(width, height);
image.Mutate(ctx =>
{
ctx.Fill(Color.White);
var font = SystemFonts.CreateFont("Arial", 20);
var textOptions = new RichTextOptions(font)
{
HorizontalAlignment = HorizontalAlignment.Center,
VerticalAlignment = VerticalAlignment.Center,
Origin = new PointF(width / 2f, height / 2f)
};
ctx.DrawText(textOptions, code, Color.DarkBlue);
});
using var ms = new MemoryStream();
image.SaveAsPng(ms);
return ms.ToArray();
}
}
}