security
4
总安装量
2
周安装量
#50676
全站排名
安装命令
npx skills add https://github.com/wutongci/agentdemo --skill security
Agent 安装分布
gemini-cli
2
replit
1
amp
1
trae
1
kimi-cli
1
Skill 文档
å®å ¨æ£æ¥ç¥è¯åº
æ¬æè½æä¾å¸¸è§å®å ¨æ¼æ´çæ£æµå鲿¤å»ºè®®ï¼æ¶µç OWASP Top 10 åå ¶ä»å¸¸è§å®å ¨é®é¢ã
OWASP Top 10 å®å ¨é£é©
1. æ³¨å ¥æ»å» (Injection)
SQL æ³¨å ¥
æå¸¸è§åå±é©çæ»å»æ¹å¼ä¹ä¸ã
// â ä¸å®å
¨ï¼SQL 注å
¥é£é©
query := "SELECT * FROM users WHERE username = '" + username + "'"
db.Query(query)
// â
å®å
¨ï¼ä½¿ç¨åæ°åæ¥è¯¢
query := "SELECT * FROM users WHERE username = ?"
db.Query(query, username)
// â
å®å
¨ï¼ä½¿ç¨ ORM
db.Where("username = ?", username).Find(&user)
å½ä»¤æ³¨å ¥
// â ä¸å®å
¨ï¼å½ä»¤æ³¨å
¥é£é©
cmd := exec.Command("sh", "-c", "ls "+userInput)
// â
å®å
¨ï¼é¿å
ä½¿ç¨ shellï¼ä½¿ç¨åæ°æ°ç»
cmd := exec.Command("ls", userInput)
// â
æ´å®å
¨ï¼éªè¯è¾å
¥
if !isValidFilename(userInput) {
return errors.New("invalid filename")
}
cmd := exec.Command("ls", userInput)
NoSQL æ³¨å ¥
// â ä¸å®å
¨
db.collection.find({ username: req.body.username })
// â
å®å
¨ï¼ç±»åéªè¯
if (typeof req.body.username !== 'string') {
return res.status(400).send('Invalid input')
}
db.collection.find({ username: req.body.username })
2. 失æçèº«ä»½è®¤è¯ (Broken Authentication)
å¯ç å®å ¨
// â ä¸å®å
¨ï¼ææåå¨å¯ç
user.Password = password
// â ä¸å®å
¨ï¼å¼±åå¸ç®æ³
hashedPassword := md5.Sum([]byte(password))
// â
å®å
¨ï¼ä½¿ç¨ bcrypt
hashedPassword, err := bcrypt.GenerateFromPassword(
[]byte(password),
bcrypt.DefaultCost,
)
// â
éªè¯å¯ç
err := bcrypt.CompareHashAndPassword(
[]byte(user.HashedPassword),
[]byte(password),
)
ä¼è¯ç®¡ç
// â ä¸å®å
¨ï¼å¯é¢æµçä¼è¯ ID
sessionID := fmt.Sprintf("%d", time.Now().Unix())
// â
å®å
¨ï¼ä½¿ç¨å å¯éæºæ°
sessionID, err := generateSecureToken(32)
func generateSecureToken(length int) (string, error) {
bytes := make([]byte, length)
if _, err := rand.Read(bytes); err != nil {
return "", err
}
return base64.URLEncoding.EncodeToString(bytes), nil
}
å¤å ç´ è®¤è¯
// â
宿½ MFA
func Login(username, password, totpCode string) error {
user, err := authenticateUser(username, password)
if err != nil {
return err
}
if user.MFAEnabled {
if !verifyTOTP(user.MFASecret, totpCode) {
return errors.New("invalid MFA code")
}
}
return createSession(user)
}
3. æææ°æ®æ³é² (Sensitive Data Exposure)
å å¯åå¨
// â ä¸å®å
¨ï¼ææåå¨æææ°æ®
user.CreditCard = creditCardNumber
// â
å®å
¨ï¼å å¯æææ°æ®
encryptedData, err := encrypt(creditCardNumber, encryptionKey)
user.EncryptedCreditCard = encryptedData
HTTPS/TLS
// â ä¸å®å
¨ï¼HTTP ä¼ è¾
http.ListenAndServe(":8080", handler)
// â
å®å
¨ï¼HTTPS ä¼ è¾
http.ListenAndServeTLS(":443", "cert.pem", "key.pem", handler)
// â
å¼ºå¶ HTTPS
func redirectToHTTPS(w http.ResponseWriter, r *http.Request) {
http.Redirect(w, r, "https://"+r.Host+r.URL.String(),
http.StatusMovedPermanently)
}
æ¥å¿è±æ
// â ä¸å®å
¨ï¼è®°å½ææä¿¡æ¯
log.Printf("User login: %s, password: %s", username, password)
// â
å®å
¨ï¼è±æææä¿¡æ¯
log.Printf("User login: %s", username)
// â
è±æå½æ°
func maskCreditCard(cc string) string {
if len(cc) < 4 {
return "****"
}
return "************" + cc[len(cc)-4:]
}
4. XML å¤é¨å®ä½ (XXE)
// â ä¸å®å
¨ï¼å
许å¤é¨å®ä½
decoder := xml.NewDecoder(input)
decoder.Decode(&data)
// â
å®å
¨ï¼ç¦ç¨å¤é¨å®ä½
decoder := xml.NewDecoder(input)
decoder.Entity = xml.HTMLEntity
decoder.Strict = false
5. 失æçè®¿é®æ§å¶ (Broken Access Control)
æéæ£æ¥
// â ä¸å®å
¨ï¼ç¼ºå°æéæ£æ¥
func DeleteUser(w http.ResponseWriter, r *http.Request) {
userID := r.URL.Query().Get("id")
db.Delete(&User{}, userID)
}
// â
å®å
¨ï¼æ£æ¥æé
func DeleteUser(w http.ResponseWriter, r *http.Request) {
currentUser := getCurrentUser(r)
userID := r.URL.Query().Get("id")
// åªå
许管çåæç¨æ·èªå·±å é¤
if !currentUser.IsAdmin && currentUser.ID != userID {
http.Error(w, "Forbidden", http.StatusForbidden)
return
}
db.Delete(&User{}, userID)
}
å¯¹è±¡çº§è®¿é®æ§å¶
// â
éªè¯èµæºæææ
func GetDocument(w http.ResponseWriter, r *http.Request) {
currentUser := getCurrentUser(r)
docID := r.URL.Query().Get("id")
var doc Document
if err := db.First(&doc, docID).Error; err != nil {
http.Error(w, "Not found", http.StatusNotFound)
return
}
// éªè¯æææ
if doc.OwnerID != currentUser.ID && !currentUser.IsAdmin {
http.Error(w, "Forbidden", http.StatusForbidden)
return
}
json.NewEncoder(w).Encode(doc)
}
6. å®å ¨é ç½®é误 (Security Misconfiguration)
ç¯å¢åé
// â ä¸å®å
¨ï¼ç¡¬ç¼ç å¯é¥
const APIKey = "sk-1234567890abcdef"
// â
å®å
¨ï¼ä½¿ç¨ç¯å¢åé
apiKey := os.Getenv("API_KEY")
if apiKey == "" {
log.Fatal("API_KEY not set")
}
é误信æ¯
// â ä¸å®å
¨ï¼æ´é²è¯¦ç»é误
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
}
// â
å®å
¨ï¼éç¨é误信æ¯
if err != nil {
log.Printf("Internal error: %v", err) // è®°å½è¯¦ç»é误
http.Error(w, "Internal server error",
http.StatusInternalServerError) // è¿åéç¨é误
}
é»è®¤åè¯
// â ä¸å®å
¨ï¼ä½¿ç¨é»è®¤å¯ç
if password == "" {
password = "admin123"
}
// â
å®å
¨ï¼å¼ºå¶è®¾ç½®å¯ç
if password == "" {
return errors.New("password required")
}
if !isStrongPassword(password) {
return errors.New("password too weak")
}
7. è·¨ç«èæ¬ (XSS)
è¾åºç¼ç
// â ä¸å®å
¨ï¼ç´æ¥è¾åºç¨æ·è¾å
¥
fmt.Fprintf(w, "<div>%s</div>", userInput)
// â
å®å
¨ï¼HTML 转ä¹
import "html"
fmt.Fprintf(w, "<div>%s</div>", html.EscapeString(userInput))
// â
ä½¿ç¨æ¨¡æ¿èªå¨è½¬ä¹
tmpl.Execute(w, data)
Content Security Policy
// â
设置 CSP 头
w.Header().Set("Content-Security-Policy",
"default-src 'self'; script-src 'self' 'unsafe-inline'")
8. ä¸å®å ¨çååºåå (Insecure Deserialization)
// â ä¸å®å
¨ï¼ååºååä¸å¯ä¿¡æ°æ®
var data MyStruct
json.Unmarshal(untrustedInput, &data)
processData(data)
// â
å®å
¨ï¼éªè¯åéå¶
var data MyStruct
if err := json.Unmarshal(untrustedInput, &data); err != nil {
return fmt.Errorf("invalid input: %w", err)
}
// éªè¯æ°æ®
if err := validateData(&data); err != nil {
return fmt.Errorf("validation failed: %w", err)
}
processData(data)
9. 使ç¨å·²ç¥æ¼æ´çç»ä»¶ (Using Components with Known Vulnerabilities)
ä¾èµç®¡ç
# å®ææ´æ°ä¾èµ
go get -u ./...
# æ£æ¥å®å
¨æ¼æ´
go list -json -m all | nancy sleuth
æå°åä¾èµ
// â
åªå¼å
¥å¿
è¦çä¾èµ
// 宿审æ¥åæ¸
çä¸ä½¿ç¨çä¾èµ
10. ä¸è¶³çæ¥å¿åçæ§ (Insufficient Logging & Monitoring)
å®å ¨äºä»¶æ¥å¿
// â
è®°å½å®å
¨ç¸å
³äºä»¶
func Login(username, password string) error {
user, err := db.FindUser(username)
if err != nil {
securityLog.Warn("Login attempt for non-existent user",
"username", username,
"ip", getClientIP())
return err
}
if !verifyPassword(user, password) {
securityLog.Warn("Failed login attempt",
"username", username,
"user_id", user.ID,
"ip", getClientIP())
return errors.New("invalid credentials")
}
securityLog.Info("Successful login",
"username", username,
"user_id", user.ID,
"ip", getClientIP())
return nil
}
审计æ¥å¿
// â
è®°å½éè¦æä½
func DeleteUser(userID string, operatorID string) error {
auditLog.Info("User deletion",
"user_id", userID,
"operator_id", operatorID,
"timestamp", time.Now(),
"action", "DELETE_USER")
return db.Delete(&User{}, userID)
}
å ¶ä»å¸¸è§å®å ¨é®é¢
CSRF (è·¨ç«è¯·æ±ä¼ªé )
// â
ä½¿ç¨ CSRF token
func HandleForm(w http.ResponseWriter, r *http.Request) {
if !validateCSRFToken(r) {
http.Error(w, "Invalid CSRF token", http.StatusForbidden)
return
}
// å¤ç表å
}
// â
SameSite Cookie
http.SetCookie(w, &http.Cookie{
Name: "session",
Value: sessionID,
SameSite: http.SameSiteStrictMode,
Secure: true,
HttpOnly: true,
})
ç®å½éå
// â ä¸å®å
¨ï¼ç®å½éåé£é©
filepath := "/var/www/" + userInput
// â
å®å
¨ï¼æ¸
çè·¯å¾
filepath := filepath.Clean("/var/www/" + userInput)
if !strings.HasPrefix(filepath, "/var/www/") {
return errors.New("invalid path")
}
éçéå¶
// â
宿½éçéå¶
limiter := rate.NewLimiter(rate.Limit(10), 100) // 10 req/s, burst 100
func HandleRequest(w http.ResponseWriter, r *http.Request) {
if !limiter.Allow() {
http.Error(w, "Too many requests",
http.StatusTooManyRequests)
return
}
// å¤ç请æ±
}
å®å ¨æ£æ¥æ¸ å
è¾å ¥éªè¯
- ææç¨æ·è¾å ¥é½ç»è¿éªè¯
- 使ç¨ç½ååèéé»åå
- è¾å ¥é¿åº¦éå¶
- ç±»åæ£æ¥
认è¯åææ
- å¯ç å®å ¨åå¨ï¼bcrypt/scryptï¼
- ä¼è¯ç®¡çå®å ¨
- 宿½æéæ£æ¥
- æ¯æ MFA
æ°æ®ä¿æ¤
- æææ°æ®å å¯
- ä½¿ç¨ HTTPS
- æ¥å¿è±æ
- å®å ¨çå¯é¥ç®¡ç
æ³¨å ¥é²æ¤
- 使ç¨åæ°åæ¥è¯¢
- é¿å 卿æå»ºå½ä»¤
- è¾åºç¼ç
é ç½®å®å ¨
- æ 硬ç¼ç å¯é¥
- å®å ¨çé»è®¤é ç½®
- æå°æéåå
- å®ææ´æ°ä¾èµ
çæ§åååº
- å®å ¨äºä»¶æ¥å¿
- å¼å¸¸çæ§
- 审计æ¥å¿
- äºä»¶ååºè®¡å
å®å ¨é®é¢æ¥å模æ¿
### å®å
¨é®é¢: [æ¼æ´ç±»å]
**严éç¨åº¦**: ð´ 严é / ð¡ éè¦ / ð¢ ä¸è¬
**ä½ç½®**: [æä»¶å:è¡å·]
**æ¼æ´æè¿°**: [详ç»è¯´æå®å
¨é®é¢]
**æ»å»åºæ¯**: [说æå¦ä½å©ç¨è¿ä¸ªæ¼æ´]
**å½±å**: [说æå¯è½çåæ]
**ä¿®å¤å»ºè®®**:
[æä¾å®å
¨ç代ç 示ä¾]
**åè**: [OWASP æå
¶ä»å®å
¨æ å龿¥]