阿里云在他们的范例中广泛地,长期地硬编码AccessKeyId和AccessKeySecret,我认为这种做法是很不负责任的,会误导很多初级开发者。ChatGPT就是被误导的受害人之一。
现象
如您所知,ChatGPT很适合帮助程序员写一些简单代码。我目前在开发一个个人爱好者项目,需要用到语音转文本功能。于是我就让ChatGPT帮我写了。
我用的指令是
写段python代码,把本地mp3文件上传给阿里云语音识别,然后取回识别文本,打印在console
ChatGPT 4.0的回复是
为了实现这个功能,你需要先安装阿里云的Python SDK,执行以下命令进行安装 pip install aliyun-python-sdk-core pip install aliyun-python-sdk-dyvmsapi
接下来,使用下面的Python代码实现上传本地MP3文件到阿里云的语音识别服务,获取识别结果并打印在控制台:
import json
import base64
from aliyunsdkcore.client import AcsClient
from aliyunsdkdyvmsapi.request.v20170525 import RecognizeSpeechRequest
# 省略部分代码,节省篇幅
def main():
access_key_id = "你的阿里云AccessKey ID"
access_key_secret = "你的阿里云AccessKey Secret"
client = AcsClient(access_key_id, access_key_secret, "cn-hangzhou")
file_path = "path/to/your/mp3file.mp3"
recognized_text = recognize_speech(client, file_path)
print("识别结果:", recognized_text)
if __name__ == "__main__":
main()
我问ChatGPT:
你这个范例是参考了阿里云官方网站的范例吗?
它回答:
是的,这个范例参考了阿里云官方网站的示例代码。阿里云提供了Python SDK,可以帮助开发者更方便地调用阿里云的API服务。在这个示例中,我们使用了阿里云的语音识别服务,并通过Python SDK调用其API。(以下省略具体的代码解释)
如您所见,这个范例硬编码了“我的阿里云AccessKey ID"和"你的阿里云AccessKey Secret",假设我是一个初级程序员,我就被误导了。
但是我不是一个初级程序员,所以我很生气,责怪ChatGPT:
ok,所以你硬编码access key id和access key secret的做法,也是来自阿里云?因为你给我的aws范例没有这样做
ChatGPT马上意识到错误了:
抱歉给您带来困扰,您是对的。将Access Key ID和Access Key Secret直接硬编码在代码中并不是一种推荐的做法,因为这样可能导致这些凭据泄露。实际上,最佳实践是将这些敏感信息存储在环境变量或配置文件中。
以下是使用环境变量的一个改进示例:(以下省略)
我问它:
你以后会给其他用户回复同样的错误范例吗?
它像个外交官一样回答得很专业:
我会尽量避免在未来的回答中提供不安全或错误的范例。作为一个AI助手,我的目标是提供有用且安全的建议。我会继续学习和进步,以便更好地帮助您和其他用户。如果您发现我给出的示例或建议存在问题,请随时指出,这将有助于我改进并为您提供更好的帮助。谢谢您的反馈!
但是很不幸,只要换个session,它就忘记了刚才说的话,给出了同样错误的范例
import base64
import json
import time
import os
from aliyunsdkcore.client import AcsClient
from aliyunsdkcore.acs_exception.exceptions import ClientException
from aliyunsdkcore.acs_exception.exceptions import ServerException
from aliyunsdkdyvmsapi.request.v20170525 import SubmitTaskRequest
# 阿里云AccessKey ID和AccessKey Secret
access_key_id = "your_access_key_id"
access_key_secret = "your_access_key_secret"
# 初始化阿里云AcsClient
client = AcsClient(access_key_id, access_key_secret, "cn-shanghai")
# 以下省略
由此可见,经过几年的熏陶,ChatGPT被阿里云彻底教坏了,没法挽救。不知道读者中有多少资深程序员也有类似的经验:你mentor的小年轻已经被阿里云带坏了, 要花很大力气纠正过来。
晾晒
以下是一些阿里云的不良范例,
def main():
client = AcsClient(
'<your-access-key-id>', # 您的AccessKey ID
'<your-access-key-secret>', # 您的AccessKey Secret
'<your-region-id>') # 您的地域ID
eip = Eip(client)
params = {}
# 创建EIP
https://help.aliyun.com/document_detail/114803.html
if __name__ == "__main__":
client = AcsClient('accessKeyId','accessSecret','cn-zhangjiakou',timeout = 35)
vpc_quick_start = VpcQuickStart(client)
params = {}
https://help.aliyun.com/document_detail/114005.html
# -*- coding: utf8 -*-
import json
from urllib import quote
from aliyunsdkcore.client import AcsClient
from aliyunsdkmts.request.v20140618 import SubmitJobsRequest
access_key_id = 'xxx'
access_key_secret = 'xxx'
https://help.aliyun.com/document_detail/67664.html
# -*- coding: utf-8 -*-
import oss2
# 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
auth = oss2.Auth('yourAccessKeyId', 'yourAccessKeySecret')
# yourEndpoint填写Bucket所在地域对应的Endpoint。以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。
# 填写Bucket名称。
https://help.aliyun.com/document_detail/88426.html
oss服务比较用心,在代码注释里“强烈建议”客户不使用root用户的AccessKeyId和AccessKeySecret,建议客户使用RAM用户缩减密码泄漏带来的危害,然后又毫不犹豫的在代码中硬编码AccessKeyId和AccessKeySecret。读起来简直有一种喜剧效果,感觉阿里云的朋友在讽刺什么。
顺便说一句,我看了他们四个python范例,就是四种不同的代码风格,这代码质量真的不敢恭维。
总结
云厂家自称是先进IT生产力的代表,就要有先进生产力的样子,在网络安全上给所有客户做出好的表率。硬编码密码到代码中多年以前就被归为不安全实践了,阿里云却还在大面积的推广,实在让人遗憾。尤其遗憾的是,像ChatGPT一样,大多数初级程序员从阿里云这里学到坏习惯之后,很难改正了。