package main
import (
"database/sql"
"fmt"
"log"
_ "github.com/go-sql-driver/mysql"
)
type User struct {
ID int `json:"id"`
Username string `json:"username"`
Email string `json:"email"`
Status string `json:"status"`
}
func getUserByID(db *sql.DB, userID string) (*User, error) {
// VULNERABLE: Direct string concatenation
query := "SELECT id, username, email, status FROM users WHERE id = " + userID
rows, err := db.Query(query)
if err != nil {
return nil, err
}
defer rows.Close()
if rows.Next() {
var user User
err := rows.Scan(&user.ID, &user.Username, &user.Email, &user.Status)
return &user, err
}
return nil, fmt.Errorf("user not found")
}
func searchUsers(db *sql.DB, name, department string) ([]User, error) {
// VULNERABLE: fmt.Sprintf with user input
query := fmt.Sprintf(
"SELECT id, username, email FROM users WHERE name LIKE '%%%s%%' AND department = '%s'",
name, department
)
rows, err := db.Query(query)
if err != nil {
return nil, err
}
defer rows.Close()
var users []User
for rows.Next() {
var user User
err := rows.Scan(&user.ID, &user.Username, &user.Email)
if err != nil {
return nil, err
}
users = append(users, user)
}
return users, nil
}
// Malicious inputs:
// userID: "1 OR 1=1 --"
// name: "'; DROP TABLE users; --"
// department: "IT'; UPDATE users SET salary=999999; --"