程式碼品質不佳,會導致無法預料的行為。從使用者的角度來看,這通常表現為可用性不佳。對於攻擊者而言,這提供了以意想不到的方式向系統施加壓力的機會。
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()
取得目前區塊的雜湊。
bytes32 blockhash = block.blockhash(0);