一键导入
security
Production security practices covering OWASP Top 10, input validation, SQL injection prevention, authentication/authorization, and secrets management.
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
菜单
Production security practices covering OWASP Top 10, input validation, SQL injection prevention, authentication/authorization, and secrets management.
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
基于 SOC 职业分类
Build production-ready AI agents with Microsoft Foundry and Agent Framework. Covers agent architecture, model selection, orchestration, tracing, and evaluation.
Design robust REST APIs with proper versioning, pagination, error handling, rate limiting, and OpenAPI documentation.
Structure projects for maintainability and scalability with clean architecture, separation of concerns, and consistent project layouts.
Systematic code review and audit practices including automated checks, security audits, compliance verification, and review checklists.
Manage application configuration with environment variables, Azure Key Vault, feature flags, and environment-specific settings.
Fundamental coding principles for production development including SOLID, DRY, KISS, and common design patterns with C# examples.
| name | security |
| description | Production security practices covering OWASP Top 10, input validation, SQL injection prevention, authentication/authorization, and secrets management. |
Purpose: Production security practices to protect against common vulnerabilities.
Focus: Input validation, SQL injection prevention, authentication, secrets management.
using FluentValidation;
public class UserInputValidator : AbstractValidator<UserInput>
{
public UserInputValidator()
{
RuleFor(x => x.Email)
.NotEmpty()
.EmailAddress()
.MaximumLength(255);
RuleFor(x => x.Username)
.NotEmpty()
.Length(3, 20)
.Matches(@"^[a-zA-Z0-9_]+$")
.WithMessage("Username can only contain letters, numbers, and underscores");
RuleFor(x => x.Age)
.InclusiveBetween(13, 120);
}
}
// Use in controller
public async Task<IActionResult> CreateUser([FromBody] UserInput input)
{
var validator = new UserInputValidator();
var result = await validator.ValidateAsync(input);
if (!result.IsValid)
return BadRequest(result.Errors);
return Ok(await _service.CreateUserAsync(input));
}
using Ganss.Xss;
public class HtmlSanitizer
{
private readonly HtmlSanitizer _sanitizer;
public HtmlSanitizer()
{
_sanitizer = new HtmlSanitizer();
_sanitizer.AllowedTags.Clear();
_sanitizer.AllowedTags.Add("p");
_sanitizer.AllowedTags.Add("br");
_sanitizer.AllowedTags.Add("strong");
_sanitizer.AllowedTags.Add("em");
}
public string Sanitize(string html) => _sanitizer.Sanitize(html);
}
// ❌ NEVER concatenate SQL
public async Task<User> GetUser(string email)
{
var sql = $"SELECT * FROM Users WHERE Email = '{email}'"; // VULNERABLE!
return await _db.QueryFirstAsync<User>(sql);
}
// ✅ Always use parameters
public async Task<User> GetUser(string email)
{
var sql = "SELECT * FROM Users WHERE Email = @Email";
return await _db.QueryFirstAsync<User>(sql, new { Email = email });
}
// ✅ EF Core (safe by default)
public async Task<User> GetUser(string email)
{
return await _context.Users
.FirstOrDefaultAsync(u => u.Email == email);
}
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(options =>
{
options.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuer = true,
ValidateAudience = true,
ValidateLifetime = true,
ValidateIssuerSigningKey = true,
ValidIssuer = builder.Configuration["Jwt:Issuer"],
ValidAudience = builder.Configuration["Jwt:Audience"],
IssuerSigningKey = new SymmetricSecurityKey(
Encoding.UTF8.GetBytes(builder.Configuration["Jwt:Secret"]))
};
});
app.UseAuthentication();
app.UseAuthorization();
builder.Services.AddAuthorization(options =>
{
options.AddPolicy("AdminOnly", policy => policy.RequireRole("Admin"));
options.AddPolicy("CanEditUser", policy =>
policy.RequireClaim("Permission", "EditUser"));
});
[Authorize(Policy = "AdminOnly")]
public IActionResult DeleteUser(int id)
{
_service.DeleteUser(id);
return NoContent();
}
using BCrypt.Net;
public class PasswordService
{
public string HashPassword(string password)
{
return BCrypt.HashPassword(password, workFactor: 12);
}
public bool VerifyPassword(string password, string hash)
{
return BCrypt.Verify(password, hash);
}
}
// ❌ Never store plain text passwords
user.Password = input.Password; // NEVER!
// ✅ Always hash passwords
user.PasswordHash = _passwordService.HashPassword(input.Password);
// appsettings.json - NO SECRETS HERE
{
"ConnectionStrings": {
"Default": "Server=localhost;Database=MyApp;User Id=myapp;"
}
}
// ✅ Use environment variables or Azure Key Vault
var connectionString = builder.Configuration.GetConnectionString("Default");
var password = Environment.GetEnvironmentVariable("DB_PASSWORD");
connectionString += $"Password={password}";
builder.Configuration.AddAzureKeyVault(
new Uri($"https://{keyVaultName}.vault.azure.net/"),
new DefaultAzureCredential());
// Access secrets
var apiKey = builder.Configuration["ApiKey"]; // Retrieved from Key Vault
# Initialize user secrets
dotnet user-secrets init
# Set secret
dotnet user-secrets set "ApiKey" "my-secret-key"
// Access in development
var apiKey = builder.Configuration["ApiKey"];
// Force HTTPS in production
if (app.Environment.IsProduction())
{
app.UseHttpsRedirection();
app.UseHsts();
}
// Configure HSTS
builder.Services.AddHsts(options =>
{
options.MaxAge = TimeSpan.FromDays(365);
options.IncludeSubDomains = true;
options.Preload = true;
});
builder.Services.AddCors(options =>
{
options.AddPolicy("Production", policy =>
{
policy.WithOrigins("https://myapp.com")
.AllowAnyMethod()
.AllowAnyHeader()
.AllowCredentials();
});
});
app.UseCors("Production");
// ❌ Never use in production
// policy.AllowAnyOrigin() - DANGEROUS!
using AspNetCoreRateLimit;
builder.Services.AddMemoryCache();
builder.Services.Configure<IpRateLimitOptions>(options =>
{
options.GeneralRules = new List<RateLimitRule>
{
new RateLimitRule
{
Endpoint = "*",
Limit = 100,
Period = "1m"
},
new RateLimitRule
{
Endpoint = "*/api/login",
Limit = 5,
Period = "1m"
}
};
});
builder.Services.AddInMemoryRateLimiting();
app.UseIpRateLimiting();
app.Use(async (context, next) =>
{
context.Response.Headers.Add("X-Content-Type-Options", "nosniff");
context.Response.Headers.Add("X-Frame-Options", "DENY");
context.Response.Headers.Add("X-XSS-Protection", "1; mode=block");
context.Response.Headers.Add("Referrer-Policy", "no-referrer");
context.Response.Headers.Add("Content-Security-Policy",
"default-src 'self'; script-src 'self'; style-src 'self'");
await next();
});
OWASP: Top 10 • Cheat Sheets
Tools: Snyk • OWASP ZAP • SonarQube
.NET Security: Microsoft Docs
See Also: 10-configuration.md • 03-error-handling.md
Last Updated: January 13, 2026