封装即绘制强边界。在 Web 浏览器中,这可能意味着确保您的移动代码不会被其他移动代码滥用。在服务器上,这可能意味着区分已验证数据和未验证数据、区分一个用户的数据和另一个用户的数据,或者区分允许用户查看的数据和不允许用户查看的数据。
usrname
参数,再进行检查以确保该用户已经过验证。
usrname = request.Item("usrname");
if (session.Item(ATTR_USR) == null) {
session.Add(ATTR_USR, usrname);
}
usrname
参数,再进行检查以确保该用户已经过验证。
usrname = request.getParameter("usrname");
if (session.getAttribute(ATTR_USR) != null) {
session.setAttribute(ATTR_USR, usrname);
}
var GetURL = function() {};
GetURL.prototype = {
run: function(arguments) {
...
arguments.completionFunction({ "URL": document.location.href });
}
...
};
var ExtensionPreprocessingJS = new GetURL;
usrname
参数,再进行检查以确保该用户已经过了验证。
val usrname: String = request.getParameter("usrname")
if (session.getAttribute(ATTR_USR) != null) {
session.setAttribute(ATTR_USR, usrname)
}
webview
主机。
#import <MobileCoreServices/MobileCoreServices.h>
- (IBAction)done {
...
[self.extensionContext completeRequestReturningItems:@[untrustedItem] completionHandler:nil];
}
usrname
Cookie,并且在对该用户进行身份验证之前,将该值存储在 HTTP DB 会话中。
...
IF (OWA_COOKIE.get('usrname').num_vals != 0) THEN
usrname := OWA_COOKIE.get('usrname').vals(1);
END IF;
IF (v('ATTR_USR') IS null) THEN
HTMLDB_UTIL.set_session_state('ATTR_USR', usrname);
END IF;
...
username
参数,再进行检查以确保该用户已经过验证。
uname = request.GET['username']
request.session['username'] = uname
webview
主机。
import MobileCoreServices
@IBAction func done() {
...
self.extensionContext!.completeRequestReturningItems([unstrustedItem], completionHandler: nil)
}
usrname
参数,再进行检查以确保该用户已经过验证。
...
Dim Response As Response
Dim Request As Request
Dim Session As Session
Dim Application As Application
Dim Server As Server
Dim usrname as Variant
Set Response = objContext("Response")
Set Request = objContext("Request")
Set Session = objContext("Session")
Set Application = objContext("Application")
usrname = Request.Form("usrname")
If IsNull(Session("ATTR_USR")) Then
Session("ATTR_USR") = usrname
End If
...
public
访问方法中返回了一个 private
数组变量。 public
访问方法中返回一个 private
数组变量,通过此种方式,您可以调用代码来修改该数组的内容,还可以轻易地获取数组的 public
访问,并阻止程序员将其设置为 private
的计划。 public
访问方法中返回了一个 private
数组变量。
public final class urlTool extends Applet {
private URL[] urls;
public URL[] getURLs() {
return urls;
}
...
}
public class CustomerServiceApplet extends JApplet
{
public void paint(Graphics g)
{
...
conn = DriverManager.getConnection ("jdbc:mysql://db.example.com/customerDB", "csr", "p4ssw0rd");
...
package
有同等级别的类(有权访问源外部类)。由于内部类可以访问其封装类中的 private
字段,一旦某个 inner class 成为字节码中的同等类,该编译器便会把 inner class 访问的 private
字段转换成 protected
字段,这一点具有潜在的危险性。
public final class urlTool extends Applet {
private final class urlHelper {
...
}
...
}
finalize()
方法声明为 public
。finalize()
的实现方法内部调用 super.finalize()
,否则请不要显式地调用 finalize。在移动代码中,手动垃圾回收这种带有错误倾向的操作会威胁到系统的安全,由于 finalize()
的声明中包含对 public
访问,因此会造成攻击者的恶意调用。如果您按其最初设计使用 finalize()
,则应首先声明 finalize()
包含 protected
访问权限。public finalize()
方法。
public final class urlTool extends Applet {
public void finalize() {
...
}
...
}
public
、final
和 static
。public
、final
和 static
是一个 bug。因为数组是一个可变的对象,而 final
限制要求数组对象本身只能分配一次,但并不保证数组元素的数值不变。既然数组是公用的,恶意程序便可以篡改数组中存储的值。所以,在大多数情况下,应将数组设置为 private
。 public
、final
和 static
。
public final class urlTool extends Applet {
public final static URL[] urls;
...
}
public
,而不是 final
。 public
的成员变量都应声明 final
,以防止攻击者未经授权,操纵或获取对 Applet 内部状态的访问权。public
,而不是 final
。
public final class urlTool extends Applet {
public URL url;
...
}