API 是调用方和被调用方之间的约定。最常见的 API 滥用是由于调用方未能遵守此约定的终止导致的。例如,如果某个程序在调用 chroot() 后未能调用 chdir(),则违反了用于指定如何安全地更改活动根目录的约定。库滥用的另一个典型示例是期望被调用方向调用方返回可信的 DNS 信息。在这种情况下,调用方通过对被调用方行为做出某种假设(返回值可用于身份验证目的)滥用其 API。另一方也可能违反调用方-被调用方约定。例如,如果编码器子类化 SecureRandom 并返回一个非随机值,则将违反此约定。
unsecure
属性会指定可在客户端上设置值的属性列表。unsecure
属性可以指定此列表。unsecure
属性中显示的属性是 disabled
,该属性允许客户端定义要启用和禁用的组件。最好不要让客户端控制只应在服务器上设置的属性值。unsecure
属性的 inputText
组件。
...
<af:inputText id="pwdBox"
label="#{resources.PWD}"
value=""#{userBean.password}
unsecure="disabled"
secret="true"
required="true"/>
...
file://
协议,这可能导致不利的安全隐患。file://
。 目前还不清楚它们的行为应该是什么,以及适用何种安全分隔规则。 例如,从 Internet 下载到本地磁盘的 HTML 文件是否应与本地安装的任意 HTML 代码共享相同的 Cookie?UseCookiePolicy()
方法将 Cookie 策略中间件添加到中间件管道中,从而允许自定义 Cookie 策略。当按所示的错误顺序指定时,程序员声明的任何 Cookie 策略都将被忽略。
...
var builder = WebApplication.CreateBuilder(...);
var app = builder.Build(...);
app.UseStaticFiles();
app.UseRouting();
app.UseSession();
app.UseAuthentication();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
...
}
app.UseCookiePolicy();
...
UseHttpsRedirection()
方法将 HTTPS 重定向中间件添加到中间件管道中,这样可以将不安全的 HTTP 请求重定向到安全的 HTTPS 请求。如果以所示的错误顺序指定,则在通过重定向之前列出的中间件处理请求之前不会发生有意义的 HTTPS 重定向。这样可以使应用程序处理 HTTP 请求后重定向到安全的 HTTPS 连接。
...
var builder = WebApplication.CreateBuilder(...);
var app = builder.Build(...);
app.UseStaticFiles();
app.UseRouting();
app.UseSession();
app.UseAuthentication();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
...
}
app.UseHttpsRedirection();
...
UseHttpLogging()
方法将 HTTP 日志记录中间件添加到允许记录中间件组件的中间件管道中。当按所示的错误顺序指定时,在调用 UseHttpLogging()
之前,将不会记录添加到管道中的任何中间件。示例 2:
...
var builder = WebApplication.CreateBuilder(...);
var app = builder.Build(...);
app.UseStaticFiles();
app.UseRouting();
app.UseSession();
app.UseAuthentication();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
...
}
app.UseHttpLogging();
...
UseWC3Logging()
方法将 W3C 日志记录中间件添加到允许记录中间件组件的中间件管道中。当按所示的错误顺序指定时,在调用 UseWC3Logging()
之前,将不会记录添加到管道中的任何中间件。
...
var builder = WebApplication.CreateBuilder(...);
var app = builder.Build(...);
app.UseStaticFiles();
app.UseRouting();
app.UseSession();
app.UseAuthentication();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
...
}
app.UseWC3Logging();
...
public ActionResult UpdateWidget(Model model)
{
// ... controller logic
}
[Required]
属性)和可选的属性(标记为 [Required]
属性)的模型类可能会导致问题。[Required]
的属性和不包含 [Required]
的属性:
public class MyModel
{
[Required]
public String UserName { get; set; }
[Required]
public String Password { get; set; }
public Boolean IsAdmin { get; set; }
}
[Required]
属性)可能导致问题。[Required]
验证属性。这可能产生不可预期的应用程序行为。
public enum ArgumentOptions
{
OptionA = 1,
OptionB = 2
}
public class Model
{
[Required]
public String Argument { get; set; }
[Required]
public ArgumentOptions Rounding { get; set; }
}
[Required]
属性 -- 如果攻击者没有传送子模型,那么父模型将有一个 null
值并且子模型要求的字段将不会由模型验证声明。这是发布中攻击的一种表单。
public class ChildModel
{
public ChildModel()
{
}
[Required]
public String RequiredProperty { get; set; }
}
public class ParentModel
{
public ParentModel()
{
}
public ChildModel Child { get; set; }
}
ParentModel.Child
属性的值,那么 ChildModel.RequiredProperty
属性将有一个未声明的 [Required]
。这可能产生无法预期和不良后果。
[context evaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics localizedReason:nil
reply:^(BOOL success, NSError *error) {
if (success) {
NSLog(@"Auth was OK");
}
}];
context.evaluatePolicy(LAPolicy.DeviceOwnerAuthenticationWithBiometrics, localizedReason: "", reply: { (success, error) -> Void in
if (success) {
print("Auth was OK");
}
else {
print("Error received: %d", error!);
}
})
SHARED
查询模式,该模式允许读取和写入访问。
results = query.execute(Database.SHARED);
results = query.execute(); //missing query mode
GC.Collect()
的调用似乎可以使问题迎刃而解。GC.Collect()
并非什么好方法。事实上,过于频繁地调用 GC.Collect()
会带来性能问题。System.gc()
的调用似乎可以使问题迎刃而解。System.gc()
并非什么好方法。事实上,过于频繁地调用 System.gc()
会带来性能问题。Equals()
的对象上调用了 Equals()
。Equals()
的类(或任何超类/接口)上调用 Equals()
会导致调用继承自 System.Object
的 Equals()
方法。Object.Equals()
将比较两个对象实例,查看它们是否相同,而不是比较对象成员字段或其他属性。尽管可以合法地使用 Object.Equals()
,但这通常表示存在错误代码。
public class AccountGroup
{
private int gid;
public int Gid
{
get { return gid; }
set { gid = value; }
}
}
...
public class CompareGroup
{
public bool compareGroups(AccountGroup group1, AccountGroup group2)
{
return group1.Equals(group2); //Equals() is not implemented in AccountGroup
}
}
equals()
的对象上调用了 equals()
方法。equals()
的类(或任何超类/接口)上调用 equals()
会导致调用继承自 java.lang.Object
的 equals()
方法。Object.equals()
将比较两个对象实例,查看它们是否相同,而不是比较对象成员字段或其他属性。尽管可以合法地使用 Object.equals()
,但这通常表示存在错误代码。
public class AccountGroup
{
private int gid;
public int getGid()
{
return gid;
}
public void setGid(int newGid)
{
gid = newGid;
}
}
...
public class CompareGroup
{
public boolean compareGroups(AccountGroup group1, AccountGroup group2)
{
return group1.equals(group2); //equals() is not implemented in AccountGroup
}
}
finalize()
方法应该调用 super.finalize()
。finalize()
方法调用 super.finalize()
是一种非常好的做法 [1]。super.finalize()
。
protected void finalize() {
discardNative();
}
private void writeObject(java.io.ObjectOutputStream out) throws IOException;
private void readObject(java.io.ObjectInputStream in) throws IOException, ClassNotFoundException;
private void readObjectNoData() throws ObjectStreamException;
getOutputStream
之后调用 getWriter()
也是错误的做法,反之亦然。HttpServletRequest
、重定向 HttpServletResponse
或者刷新 servlet 的输出流缓冲区会导致提交相关的数据流。后续执行的任何缓冲区重置或数据流提交操作,例如额外的刷新或重定向,将会导致出现 IllegalStateException
。ServletOutputStream
或 PrintWriter
(但不能同时使用)将数据写入响应数据流。调用 getOutputStream()
之后调用 getWriter()
或者反向调用,也会导致出现 IllegalStateException
。IllegalStateException
会阻止响应处理程序完成运行,轻易地使其中断响应。这会导致服务器不稳定,也间接表明 servlet 实现不正确。例 2:相反,以下代码在请求转发之后会尝试写入并刷新
public class RedirectServlet extends HttpServlet {
public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
...
OutputStream out = res.getOutputStream();
...
// flushes, and thereby commits, the output stream
out.flush();
out.close(); // redirecting the response causes an IllegalStateException
res.sendRedirect("http://www.acme.com");
}
}
PrintWriter
的缓冲区。
public class FlushServlet extends HttpServlet {
public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
...
// forwards the request, implicitly committing the stream
getServletConfig().getServletContext().getRequestDispatcher("/jsp/boom.jsp").forward(req, res);
...
// IllegalStateException; cannot redirect after forwarding
res.sendRedirect("http://www.acme.com/jsp/boomboom.jsp");
PrintWriter out = res.getWriter();
// writing to an already-committed stream will not cause an exception,
// but will not apply these changes to the final output, either
out.print("Writing here does nothing");
// IllegalStateException; cannot flush a response's buffer after forwarding the request
out.flush();
out.close();
}
}
Content-Length
头文件设为负值。Content-Length
请求标题表示开发者对0
或Content-Length
。
URL url = new URL("http://www.example.com");
HttpURLConnection huc = (HttpURLConnection)url.openConnection();
huc.setRequestProperty("Content-Length", "-1000");
Content-Length
头文件设为负值。Content-Length
请求标题表示开发者对0
或Content-Length
头文件设置为负值:
xhr.setRequestHeader("Content-Length", "-1000");
ToString()
在数组上被调用。ToString()
表示开发者希望将数组内容作为字符串返回。然而,在数组上直接调用 ToString()
将返回一个字符串值,它包含该数组的类型。System.String[]
。
String[] stringArray = { "element 1", "element 2", "element 3", "element 4" };
System.Diagnostics.Debug.WriteLine(stringArray.ToString());
toString()
在数组上被调用。toString()
表示开发者希望将数组内容作为字符串返回。然而,在数组上直接调用 toString()
将返回一个字符串值,它包含内存中该数组的类型和哈希码。[Ljava.lang.String;@1232121
。
String[] strList = new String[5];
...
System.out.println(strList);