我遇到了一个与安全相关的奇怪问题,最近我尝试在nvarchar(130)的SQL Server数据库字段中插入散列密码时遇到了常规但间歇性的错误:
<cfqueryparam value="#hashpass#" cfsqltype="cf_sql_char" maxLength="130">
Run Code Online (Sandbox Code Playgroud)
因此设置了hashpass变量:
<cfset hashpass = Hash(arguments.password & getsalt.user_salt, "SHA-512")>
Run Code Online (Sandbox Code Playgroud)
想知道SHA-512哈希值如何超过128个字符,当文档说它应该总是128个?这是ColdFusion 10错误:
[Macromedia] [SQLServer JDBC驱动程序] [SQLServer]字符串或二进制数据将被截断.
从您的错误看来,问题出在数据库级别,因为 ColdFusion 不会使您maxlength对标签的检查失败cfqueryparam,并且允许执行查询。我刚刚测试尝试传递超过属性中指定的长度的字符串maxlength(在 CF10 上)并收到错误:
The cause of this output exception was that:
coldfusion.tagext.sql.QueryParamTag$InvalidDataException:
Invalid data value this-is-a-string-that-is-too-long exceeds maxlength setting 10..`
Run Code Online (Sandbox Code Playgroud)
正如亚当·卡梅伦在问题评论中提到的那样,很可能是查询中的另一个字段引发了错误。
由于散列密码的长度为 128 个字符 - 您验证 130 个字符是否有原因?