无法将bytes类型密码哈希值存入SQL Server varbinary列的问题求助
解决方案
一、DBeaver手动执行插入的修复
SQL Server不支持Python风格的b'xxx'字节串语法,要插入二进制数据需要把字节转成十六进制字符串,前面加0x前缀直接使用即可,不需要额外调用convert函数。
你提供的哈希值对应的插入语句可以修改为:
insert into users.dbo.allusers values (123456789, 0xc8c2069f8e96adb3147297526d2227fd627403c83146c539d033cf587388ff9562677fd1f6fc98e5787e639e629189807b146930996626a55c653ff2bd06f7d0, 'a@a.com', 'a', 'b' )
如果需要将Python生成的字节串转成SQL Server可用的十六进制格式,调用storage.hex().upper()即可得到无前缀的十六进制串,前面拼接0x就可以直接放到SQL语句中执行。
二、Flask pymssql代码修复
报错是因为你没有使用参数化查询的正确用法,手动拼接SQL既会因为二进制值内的特殊字符触发语法错误,还存在SQL注入风险,修改逻辑如下:
- 不要手动将参数拼接到SQL语句中
- 直接把参数按顺序放到
cursor.execute的第二个参数位置,pymssql会自动处理二进制数据适配、特殊字符转义的所有逻辑
修改后的核心代码如下:
def add_new_user(): data = request.get_json(silent=True, force=True) cpf = data.get('cpf') origin_password = data.get('password') email = data.get('email') fname = data.get('fname') lname = data.get('lname') password_hash = generate_password(origin_password) mssqlhost = '127.0.0.1' mssqluser = 'sqlserver' mssqlpass = 'sqlserver' mssqldb = 'users' try: mssqlconn = pymssql.connect( mssqlhost, mssqluser, mssqlpass, mssqldb) print("Connection Established to MS SQL server.") cursor = mssqlconn.cursor() stmt = "insert into users.dbo.allusers (cpf, password, email, fname, lname) values (%s,%s,%s,%s,%s)" # 直接传入参数元组即可,不需要手动拼接 cursor.execute(stmt, (cpf, password_hash, email, fname, lname)) mssqlconn.commit() mssqlconn.close() return {"success":"true"} except Exception as e: print(e) return {"success":"false"}
generate_password返回的字节类型数据可以直接传入参数化查询,不需要做任何额外转换,pymssql会自动适配数据库的varbinary字段类型
内容的提问来源于stack exchange,提问作者sandeep007
相关产品推荐
相关产品推荐

