如何在TruffleHog扫描脚本的requests.get请求中加入GitHub组织名和访问令牌
解决方案
错误点说明
你之前尝试的写法存在参数分隔符错误:多个URL查询参数之间需要用&分隔,而非第二个?,原写法会导致access_token和page参数都无法被GitHub API正确识别。
推荐修改方案
我们可以通过两种方式实现参数的正确注入,更推荐将token放在请求头中的写法,安全性更高,不会被访问日志泄露token信息。
方案1:使用requests params参数自动构造查询(最稳妥)
不需要手动拼接URL参数,requests会自动处理编码和分隔,修改后的完整代码如下:
import requests # 其余你原有依赖的import(truffleHog、json loads/dumps等)保持不变 def get_org_repos(orgname, access_token, page): response = requests.get( # 扫描组织仓库用/orgs端点,扫描个人账号仓库可以改回/users url=f'https://api.github.com/orgs/{orgname}/repos', # token放在请求头中,符合GitHub API规范 headers={ 'Authorization': f'token {access_token}', 'Accept': 'application/vnd.github.v3+json' }, params={ 'page': page, 'per_page': 100 # 单页返回最多100条,减少请求次数 } ) # 新增API响应校验,避免报错导致程序无响应 if response.status_code != 200: print(f"API请求失败,状态码:{response.status_code},错误信息:{response.text}") return None json = response.json() if not json: return None for item in json: if not item['fork']: print('searching ' + item["html_url"]) results = truffleHog.find_strings(item["html_url"], do_regex=True, custom_regexes=rules, do_entropy=False, max_depth=100000) for issue in results["foundIssues"]: d = loads(open(issue).read()) d['github_url'] = "{}/blob/{}/{}".format(item["html_url"], d['commitHash'], d['path']) d['github_commit_url'] = "{}/commit/{}".format(item["html_url"], d['commitHash']) d['diff'] = d['diff'][0:200] d['printDiff'] = d['printDiff'][0:200] print(dumps(d, indent=4)) get_org_repos(orgname, access_token, page + 1) # 调用时直接填入你的组织名、GitHub访问令牌即可 get_org_repos("替换为你的组织名", "替换为你的GitHub访问令牌", 1)
方案2:手动拼接URL(仅作参考,不推荐)
如果你坚持要手动拼接URL,正确的写法如下:
response = requests.get(url=f'https://api.github.com/users/{orgname}/repos?access_token={access_token}&page={page}')
额外注意事项
- 生成GitHub访问令牌时,仅勾选repo相关的只读权限即可,遵循最小权限原则
- 如果你的组织仓库数量较多,递归调用可能会触发栈溢出,建议改成循环分页的写法更稳定
内容的提问来源于stack exchange,提问作者adampz
相关产品推荐
相关产品推荐

