代码质量不佳会导致不可预测的行为。对于用户来说,通常表现为可用性差。对于攻击者来说,提供了以意外方式对系统施加压力的机会。
SqlClientPermission
对象,这个对象规定了用户可以使用的连接到数据库的方式。在这个例子中,程序把 false
作为第二个参数传递给构造函数(控制着是否允许用户用空密码进行连接)。如果传递的参数值为 false,则说明不允许使用空密码。
...
SCP = new SqlClientPermission(pstate, false);
...
PermissionState
对象代替了任何传递给第二个参数的值,所以这个构造函数允许使用空密码连接到数据库,这与第二个参数相矛盾。要禁止使用空密码,程序应该把 PermissionState.None
传递给构造函数的第一个参数。由于其功能尚不明确,因此不赞成采用 SqlClientPermission
构造函数的“双参数”版本,而建议采用“单参数”版本(与“双参数”版本功能相同但是避免了被误译的风险)。getpw()
来验证明文密码是否与用户加密密码相匹配。如果密码是有效的,则函数将 result
设为 1;如果无效,将其设为 0。
...
getpw(uid, pwdline);
for (i=0; i<3; i++){
cryptpw=strtok(pwdline, ":");
pwdline=0;
}
result = strcmp(crypt(plainpw,cryptpw), cryptpw) == 0;
...
getpw(
) 函数从安全角度来说是有问题的,因为它可以溢出传递给它的第二个参数的缓冲区。因为这个漏洞,getpw()
已由 getpwuid()
替代,它与 getpw()
执行相同的查找,但返回一个指向静态分配结构的指针来降低风险。
...
String name = new String(nameBytes, highByte);
...
nameBytes
表示的字符串进行编码。由于用于编码字符串的字符集的演变,此构造函数已被弃用,取而代之的是接受用于编码字节进行转换的 charset
的名称作为其参数之一的构造函数。Digest::HMAC
stdlib,它的使用在文档中是明确禁止的,是由于意外介入才出现在版本中。
require 'digest/hmac'
hmac = Digest::HMAC.new("foo", Digest::RMD160)
...
hmac.update(buf)
...
Digest::HMAC
类在由于偶然纳入版本中而介入时立即被弃用。由于代码是试验性的且未经正确测试,导致类存在不按预期工作的可能性,因此绝对禁止使用该类,尤其是考虑到关系 HMAC 与加密功能有关。block.blockhash()
获取当前块的散列值,但是自 Solidity 编译器 0.5.0 版本以来已将其弃用。
bytes32 blockhash = block.blockhash(0);