本文目录导读:

Git 钩子脚本可以通过多种方式检查密码策略,以下是几种常见方法:
使用 pre-commit 钩子检查硬编码密码
#!/bin/bash
# .git/hooks/pre-commit
# 需要检查的文件类型
FILE_TYPES="*.py *.js *.java *.properties *.yml *.yaml *.json *.xml"
# 密码相关的正则表达式模式
PASSWORD_PATTERNS=(
"(password|passwd|pwd|secret|secretkey)['\"]?\s*[:=]\s*['\"][^'\"]+['\"]"
"password:\s+\S+"
"passwd=\S+"
)
echo "检查密码硬编码..."
STAGED_FILES=$(git diff --cached --name-only --diff-filter=ACM)
for FILE in $STAGED_FILES; do
# 检查文件类型
for PATTERN in "${FILE_TYPES[@]}"; do
if [[ "$FILE" == $PATTERN ]]; then
# 检查每个模式
for PATTERN in "${PASSWORD_PATTERNS[@]}"; do
if grep -q -E "$PATTERN" "$FILE"; then
echo "错误: 在文件 $FILE 中发现潜在密码硬编码"
echo "请删除或替换为环境变量"
exit 1
fi
done
fi
done
done
检查密码复杂度
#!/bin/bash
# .git/hooks/pre-receive - 服务器端钩子
# 密码复杂度要求
MIN_LENGTH=8
MIN_UPPERCASE=1
MIN_LOWERCASE=1
MIN_DIGITS=1
MIN_SPECIAL=1
check_password_complexity() {
local password=$1
# 检查长度
if [ ${#password} -lt $MIN_LENGTH ]; then
echo "密码长度至少需要 $MIN_LENGTH 个字符"
return 1
fi
# 检查大写字母
if [[ ! "$password" =~ [A-Z]{$MIN_UPPERCASE,} ]]; then
echo "密码需要至少 $MIN_UPPERCASE 个大写字母"
return 1
fi
# 检查小写字母
if [[ ! "$password" =~ [a-z]{$MIN_LOWERCASE,} ]]; then
echo "密码需要至少 $MIN_LOWERCASE 个小写字母"
return 1
fi
# 检查数字
if [[ ! "$password" =~ [0-9]{$MIN_DIGITS,} ]]; then
echo "密码需要至少 $MIN_DIGITS 个数字"
return 1
fi
# 检查特殊字符
if [[ ! "$password" =~ [!@#$%^&*()_+\-=\[\]{};':\"\\|,.<>\/?]{$MIN_SPECIAL,} ]]; then
echo "密码需要至少 $MIN_SPECIAL 个特殊字符"
return 1
fi
return 0
}
检查常见弱密码
#!/bin/bash
# .git/hooks/pre-receive
# 常见弱密码列表
WEAK_PASSWORDS=(
"password"
"password123"
"12345678"
"qwerty"
"admin"
"letmein"
"welcome"
"monkey"
"dragon"
"master"
"123456789"
"1234567890"
"test"
"guest"
)
check_weak_password() {
local password=$1
for weak in "${WEAK_PASSWORDS[@]}"; do
if [[ "${password,,}" == "$weak" ]]; then
echo "错误: 使用弱密码 '$password'"
return 1
fi
done
return 0
}
完整的密码策略检查脚本
#!/bin/bash
# .git/hooks/pre-commit
# 配置
MIN_PASSWORD_LENGTH=12
MAX_PASSWORD_LENGTH=64
WEAK_PASSWORD_FILE="/etc/git/weak_passwords.txt"
PASSWORD_REGEX='^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[@$!%*?&])[A-Za-z\d@$!%*?&]{12,}$'
# 颜色输出
RED='\033[0;31m'
GREEN='\033[0;32m'
NC='\033[0m' # No Color
check_password_policy() {
local password=$1
local errors=()
# 1. 长度检查
if [ ${#password} -lt $MIN_PASSWORD_LENGTH ]; then
errors+=("密码长度不能少于 $MIN_PASSWORD_LENGTH 个字符")
fi
if [ ${#password} -gt $MAX_PASSWORD_LENGTH ]; then
errors+=("密码长度不能超过 $MAX_PASSWORD_LENGTH 个字符")
fi
# 2. 字符类型检查
if ! [[ "$password" =~ [A-Z] ]]; then
errors+=("密码需要至少包含1个大写字母")
fi
if ! [[ "$password" =~ [a-z] ]]; then
errors+=("密码需要至少包含1个小写字母")
fi
if ! [[ "$password" =~ [0-9] ]]; then
errors+=("密码需要至少包含1个数字")
fi
if ! [[ "$password" =~ [!@#$%^&*()_+\-=\[\]{};':\"\\|,.<>\/?] ]]; then
errors+=("密码需要至少包含1个特殊字符")
fi
# 3. 连续字符检查 (不允许3个以上连续相同字符)
if [[ "$password" =~ (.)\1{2,} ]]; then
errors+=("密码不允许3个以上连续相同字符")
fi
# 4. 常见顺序检查
if [[ "$password" =~ (abc|bcd|cde|def|123|234|345|456|567|678|789|890|qwe|wer|ert|rty|tyu|yui|uio|iop|asd|sdf|dfg|fgh|ghj|hjk|jkl|zxc|xcv|cvb|vbn|bnm) ]]; then
errors+=("密码不允许包含常见顺序字符")
fi
# 5. 键盘模式检查
KEYBOARD_PATTERNS=("qwerty" "asdfgh" "zxcvbn" "qwert" "werty" "erty" "rtyu" "tyui" "yuio" "uiop")
for pattern in "${KEYBOARD_PATTERNS[@]}"; do
if echo "$password" | grep -qi "$pattern"; then
errors+=("密码不允许包含键盘连续模式")
break
fi
done
# 输出错误
if [ ${#errors[@]} -gt 0 ]; then
echo -e "${RED}密码策略检查失败:${NC}"
for error in "${errors[@]}"; do
echo -e "${RED} - $error${NC}"
done
return 1
fi
echo -e "${GREEN}密码策略检查通过${NC}"
return 0
}
# 检查暂存区中的密码文件
PASSWORD_FILES=$(git diff --cached --name-only --diff-filter=ACM | grep -i "password\|credential\|secret")
for FILE in $PASSWORD_FILES; do
echo "检查文件: $FILE"
while IFS= read -r line; do
# 提取行中的密码(假设格式为 password=xxx 或 password: xxx)
if [[ $line =~ (password|passwd|pwd)[=:]\s*([^\s]+) ]]; then
password="${BASH_REMATCH[2]}"
# 移除引号
password="${password%[\'\"]}"
password="${password#[\'\"\"]}"
if ! check_password_policy "$password"; then
exit 1
fi
fi
done < "$FILE"
done
exit 0
安装和配置钩子
# 创建钩子文件 cp pre-commit-hook .git/hooks/pre-commit chmod +x .git/hooks/pre-commit # 或者创建全局钩子(适用于所有仓库) git config --global core.hooksPath ~/.git-hooks mkdir ~/.git-hooks cp pre-commit-hook ~/.git-hooks/pre-commit chmod +x ~/.git-hooks/pre-commit
使用专用工具集成
#!/bin/bash
# 集成 git-secrets(推荐用于 AWS 密钥检查)
# 安装 git-secrets
# brew install git-secrets # macOS
# apt-get install git-secrets # Ubuntu
# 在仓库中设置
init_repo() {
git secrets --install
git secrets --register-aws
# 添加自定义模式
git secrets --add 'password\s*=\s*.*'
git secrets --add 'passwd\s*=\s*.*'
git secrets --add 'secret\s*=\s*.*'
git secrets --add 'api.key\s*=\s*.*'
# 添加禁止提交的文件模式
git secrets --add --allowed 'password\s*=\s*.*changeme'
git secrets --add --allowed 'password\s*=\s*.*example'
}
建议
- 使用预定义的正则表达式库:如
truffleHog、git-secrets等 - 分级检查:根据敏感程度设置不同级别的检查
- 白名单机制:允许特定模式(如测试密码)通过
- 定期更新:密码策略应定期更新
- 日志记录:记录所有密码检查失败的事件
- 提示用户:提供清晰的错误信息和建议
这些脚本可以有效地防止密码硬编码和弱密码提交到代码库中。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播