API 就像是呼叫者與被呼叫者之間簽訂的規定。最常見的 API 濫用形式是由呼叫者這一當事方未能遵守此規定所造成的。例如,如果程式在呼叫 chroot() 後無法呼叫 chdir(),即違反規範如何以安全方式變更使用中根目錄的規定。程式庫濫用的另一個好例子是期待被呼叫者向呼叫者傳回值得信賴的 DNS 資訊。在這種情況下,呼叫者是透過對其行為做出某些假設 (傳回值可用於驗證目的) 來濫用被呼叫者 API。另一方也可能違反呼叫者與被呼叫者間的規定。例如,如果編碼器衍生出子類別 SecureRandom 並傳回一個非隨機值,則違反了規定。
private
和 final
集,然後錯誤地建立會變動集的方法。
@Immutable
public final class ThreeStooges {
private final Set stooges = new HashSet>();
...
public void addStooge(String name) {
stooges.add(name);
}
...
}
final
。Immutable
註解。非 final 欄位允許變更值,因而違反了該類別的不可變性。public
,而不是 final
。
@Immutable
public class ImmutableInteger {
public int value;
}
public
與 final
集。
@Immutable
public final class ThreeStooges {
public final Set stooges = new HashSet();
...
}
ctx = new InitialContext();
datasource = (DataSource)ctx.lookup(DB_DATASRC_REF);
conn = datasource.getConnection();
conn = DriverManager.getConnection(CONNECT_STRING);
--auto-tls
旗標設定為 true
。因此,etcd 執行個體會使用自行簽署憑證與用戶端進行 TLS 連線。
...
spec:
containers:
- command:
...
- etcd
...
- --auto-tls=true
...
RegisterModel
或 Details
類別中的任何屬性:
public ActionResult Register(RegisterModel model)
{
if (ModelState.IsValid)
{
try
{
return RedirectToAction("Index", "Home");
}
catch (MembershipCreateUserException e)
{
ModelState.AddModelError("", "");
}
}
return View(model);
}
RegisterModel
類別定義為:
public class RegisterModel
{
[BindRequired]
[Display(Name = "User name")]
public string UserName { get; set; }
[BindRequired]
[DataType(DataType.Password)]
[Display(Name = "Password")]
public string Password { get; set; }
[DataType(DataType.Password)]
[Display(Name = "Confirm password")]
public string ConfirmPassword { get; set; }
public Details Details { get; set; }
public RegisterModel()
{
Details = new Details();
}
}
Details
類別定義為:範例 2:在 ASP.NET MVC 或 Web API 應用程式中使用
public class Details
{
public bool IsAdmin { get; set; }
...
}
TryUpdateModel()
或 UpdateModel()
時,模型繫結器會根據預設,自動嘗試繫結所有 HTTP 要求參數:範例 3:在 ASP.NET 網頁表單應用程式中,使用
public ViewResult Register()
{
var model = new RegisterModel();
TryUpdateModel<RegisterModel>(model);
return View("detail", model);
}
TryUpdateModel()
或 UpdateModel()
搭配 IValueProvider 介面時,模型繫結器會自動嘗試繫結所有 HTTP 要求參數。
Employee emp = new Employee();
TryUpdateModel(emp, new System.Web.ModelBinding.FormValueProvider(ModelBindingExecutionContext));
if (ModelState.IsValid)
{
db.SaveChanges();
}
Employee
類別定義為:
public class Employee
{
public Employee()
{
IsAdmin = false;
IsManager = false;
}
public string Name { get; set; }
public string Email { get; set; }
public bool IsManager { get; set; }
public bool IsAdmin { get; set; }
}
Booking
類別中的任何屬性:
<view-state id="enterBookingDetails" model="booking">
<on-render>
<render fragments="body" />
</on-render>
<transition on="proceed" to="reviewBooking">
</transition>
<transition on="cancel" to="cancel" bind="false" />
</view-state>
Booking
類別定義為:
public class Booking implements Serializable {
private Long id;
private User user;
private Hotel hotel;
private Date checkinDate;
private Date checkoutDate;
private String creditCard;
private String creditCardName;
private int creditCardExpiryMonth;
private int creditCardExpiryYear;
private boolean smoking;
private int beds;
private Set<Amenity> amenities;
// Public Getters and Setters
...
}
Order
、Customer
和 Profile
都是 Microsoft .NET 實體持續性類別。
public class Order {
public string ordered { get; set; }
public List<LineItem> LineItems { get; set; }
pubilc virtual Customer Customer { get; set; }
...
}
public class Customer {
public int CustomerId { get; set; }
...
public virtual Profile Profile { get; set; }
...
}
public class Profile {
public int profileId { get; set; }
public string username { get; set; }
public string password { get; set; }
...
}
OrderController
則是處理要求的 ASP.NET MVC 控制項類別:
public class OrderController : Controller{
StoreEntities db = new StoreEntities();
...
public String updateOrder(Order order) {
...
db.Orders.Add(order);
db.SaveChanges();
}
}
Order
、Customer
及 Profile
都是 Hibernate 持續性類別。
public class Order {
String ordered;
List lineItems;
Customer cust;
...
}
public class Customer {
String customerId;
...
Profile p;
...
}
public class Profile {
String profileId;
String username;
String password;
...
}
OrderController
則是處理要求的 Spring 控制項類別:
@Controller
public class OrderController {
...
@RequestMapping("/updateOrder")
public String updateOrder(Order order) {
...
session.save(order);
}
}
[FromBody]
註解時,會仰賴 Input Formatter。[FromBody]
註解套用於某個動作的複雜參數,接著將 [Bind]
或 [BindNever]
等任何其他繫結屬性套用於參數類型或其任何欄位將被有效忽略時,這意味著使用繫結註解進行緩解是不可能的。[FromBody]
註解套用於某個動作的參數時,模型繫結器會自動嘗試使用 Input Formatter 繫結要求本文中所指定的所有參數。繫結器預設使用 JSON Input Formatter 嘗試繫結要求本文中的所有可能參數:
[HttpPost]
public ActionResult Create([FromBody] Product p)
{
return View(p.Name);
}
[FromBody]
註解時,對後續的 Product
類型套用的任何繫結註解 (例如 [Bind]
或 [BindNever]
) 都會被忽略。
public class Product
{
...
public string Name { get; set; }
public bool IsAdmin { get; set; }
...
}
null
的函數回傳值。Equals()
成員函數前,不會檢查 Item
屬性回傳的字串是否為 null
,可能會造成 null
解除參照。
string itemName = request.Item(ITEM_NAME);
if (itemName.Equals(IMPORTANT_ITEM)) {
...
}
...
null
值都沒有關係。null
的函數回傳值。malloc()
回傳的指標之前,並不會檢查記憶體是否已成功分配。
buf = (char*) malloc(req_size);
strncpy(buf, xfer, req_size);
malloc()
呼叫的失敗是由於 req_size
太大,或者因為在同一時刻有太多的要求需要被處理?或者是由於建立已久的記憶體洩露所引起的?若不處理此錯誤,我們將永遠不知道答案。null
的函數回傳值。compareTo()
成員函數前,不會檢查 getParameter()
傳回的字串是否為 null
,可能會造成 null
解除參照。範例 2:以下程式碼顯示,設定為
String itemName = request.getParameter(ITEM_NAME);
if (itemName.compareTo(IMPORTANT_ITEM)) {
...
}
...
null
的系統特性,之後被程式設計人員錯誤地假設為始終會被定義,因而被解除參照。
System.clearProperty("os.name");
...
String os = System.getProperty("os.name");
if (os.equalsIgnoreCase("Windows 95") )
System.out.println("Not supported");
null
值都沒有關係。null
作比較,但是卻違反了這個規定。Object.equals()
、Comparable.compareTo()
和 Comparator.compare()
方法時,如果其參數為 null
,則必須傳回指定的值。若沒有遵守這個規定,將會導致無法預期的結果。equals()
方法的實作,不會將其參數與 null
比較。
public boolean equals(Object object)
{
return (toString().equals(object.toString()));
}
clone()
方法應呼叫 super.clone()
來取得新的物件。clone()
方法的執行中,都應透過呼叫 super.clone()
來取得新物件。如果某個類別無法遵守這個慣例,那麼子類別的 clone()
方法將會回傳錯誤的物件類型。super.clone()
而產生的錯誤。由於類別的 Kibitzer
執行 clone()
方法,FancyKibitzer
類別的複製方法將會回傳 Kibitzer
類型的物件,而非 FancyKibitzer
類型。
public class Kibitzer implements Cloneable {
public Object clone() throws CloneNotSupportedException {
Object returnMe = new Kibitzer();
...
}
}
public class FancyKibitzer extends Kibitzer
implements Cloneable {
public Object clone() throws CloneNotSupportedException {
Object returnMe = super.clone();
...
}
}
Equals()
和 GetHashCode()
。a.Equals(b) == true
,那麼 a.GetHashCode() == b.GetHashCode()
。 Equals()
,但是沒有替換 GetHashCode()
。
public class Halfway() {
public override boolean Equals(object obj) {
...
}
}
equals()
和 hashCode()
。a.equals(b) == true
,那麼 a.hashCode() == b.hashCode()
。 equals()
,但是沒有替換 hashCode()
。
public class halfway() {
public boolean equals(Object obj) {
...
}
}
saveState()
和 restoreState()
。saveState(javax.faces.context.FacesContext)
及 restoreState(javax.faces.context.FacesContext, java.lang.Object)
,或者兩個方法都不實作。因為這兩個方法有緊密連結的關係,所以不允許將 saveState(javax.faces.context.FacesContext)
和 restoreState(javax.faces.context.FacesContext, java.lang.Object)
兩個方法置於繼承體系的不同層級中。saveState()
,但未定義 restoreState()
,所以不論延伸此類別的任何類別執行操作,它總是會出錯。
public class KibitzState implements StateHolder {
public Object saveState(FacesContext fc) {
...
}
}
checkCallingOrSelfPermission()
或 checkCallingOrSelfUriPermission()
函數會判定呼叫的程式是否有存取某些服務或特定 URI 的必要權限。但是,您應謹慎使用這些函數,因為他們可能在沒有適當權限的情況下取得您的應用程式權限,而授與惡意應用程式的存取權。Assert()
與特定權限一起使用時,也就表明目前的控制流程具有指定的權限。這反過來會導致只要 .NET Framework 滿足所需的權限就會停止進行任何深入的權限檢查,這也就意味著,呼叫程式碼的程式碼會使對 Assert()
進行的呼叫可能不具有所需的權限。在某些案例中,使用 Assert()
是實用的,但當此操作允許惡意使用者控制其無權控制的資源時,就可能會導致弱點。
IPAddress hostIPAddress = IPAddress.Parse(RemoteIpAddress);
IPHostEntry hostInfo = Dns.GetHostByAddress(hostIPAddress);
if (hostInfo.HostName.EndsWith("trustme.com")) {
trusted = true;
}
getlogin()
函數很容易欺騙。請勿依賴其傳回的名稱。getlogin()
函數應該傳回包含目前已登入終端機的使用者名稱的字串,但是攻擊者可能讓 getlogin()
傳回登入該機器的任意使用者的名稱。請勿依賴 getlogin()
傳回的名稱來確定是否安全。getlogin()
來判定是否信任使用者。這很容易被推翻。
pwd = getpwnam(getlogin());
if (isTrustedGroup(pwd->pw_gid)) {
allow();
} else {
deny();
}
String ip = request.getRemoteAddr();
InetAddress addr = InetAddress.getByName(ip);
if (addr.getCanonicalHostName().endsWith("trustme.com")) {
trusted = true;
}
Boolean.getBoolean()
方法經常會與 Boolean.valueOf()
或 Boolean.parseBoolean()
方法呼叫混淆。Boolean.getBoolean()
經常被誤用,因為一般認為它會傳回由指定的 String 引數代表的布林值。但是,如 Javadoc Boolean.getBoolean(String)
方法中所述,「只有當引數命名的系統屬性存在且等於 String 'true'時傳回 true」("Returns true if and only if the system property named by the argument exists and is equal to the string 'true'.")。Boolean.valueOf(String)
或 Boolean.parseBoolean(String)
方法。Boolean.getBoolean(String)
不會轉譯 String 基本元。它只會轉譯系統屬性。
...
String isValid = "true";
if ( Boolean.getBoolean(isValid) ) {
System.out.println("TRUE");
}
else {
System.out.println("FALSE");
}
...
Decoder
和 Encoding
類別中的 GetChars
方法,以及 Encoder
和 Encoding
類別中的 GetBytes
方法,會在內部針對字元與位元組陣列進行指標算術運算,來將一系列字元轉換為一系列位元組,或是將一系列位元組轉換為一系列字元。
out.println("x = " + encoder.encodeForJavaScript(input) + ";");
...
unichar ellipsis = 0x2026;
NSString *myString = [NSString stringWithFormat:@"My Test String%C", ellipsis];
NSData *asciiData = [myString dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES];
NSString *asciiString = [[NSString alloc] initWithData:asciiData encoding:NSASCIIStringEncoding];
NSLog(@"Original: %@ (length %d)", myString, [myString length]);
NSLog(@"Best-fit-mapped: %@ (length %d)", asciiString, [asciiString length]);
// output:
// Original: My Test String... (length 15)
// Best-fit-mapped: My Test String... (length 17)
...
...
let ellipsis = 0x2026;
let myString = NSString(format:"My Test String %C", ellipsis)
let asciiData = myString.dataUsingEncoding(NSASCIIStringEncoding, allowLossyConversion:true)
let asciiString = NSString(data:asciiData!, encoding:NSASCIIStringEncoding)
NSLog("Original: %@ (length %d)", myString, myString.length)
NSLog("Best-fit-mapped: %@ (length %d)", asciiString!, asciiString!.length)
// output:
// Original: My Test String ... (length 16)
// Best-fit-mapped: My Test String ... (length 18)
...