软件安全不是安全软件。此处我们关注的主题包括身份验证、Access Control、机密性、加密和权限管理。
AUTHID
子句的程序包在默认情况下使用 AUTHID DEFINER
。AUTHID DEFINER
或 AUTHID CURRENT_USER
。具有定义程序权限的程序包中的函数和程序在定义该程序包的用户的权限下执行。这样可以在不向整个表或架构授予访问权限的情况下更新并访问指定数据。在具有调用程序的权限或 AUTHID CURRENT_USER
的程序包中,函数和程序会在调用它们的用户的权限下执行。这样不会允许用户访问其无法访问的数据。如果未提供 AUTHID
子句,程序包会在默认情况下使用定义程序的权限。 SYS
或另一个具有较高权限的用户定义,这样可能会使盗取代码的问题变得更加严重。<uses-permission/>
标签在 AndroidManifest.xml
文件中将其列出。如果未请求所需的权限,需要这些权限的操作在运行时就会失败。在某些情况下,java.lang.SecurityException
会被抛回到应用程序。在其他情况下,操作会在不提示且未抛出任何异常的情况下失败。sms.sendTextMessage(recipient, null, message, PendingIntent.getBroadcast(SmsMessaging.this, 0, new Intent(ACTION_SMS_SENT), 0), null);
android.permission.SEND_SMS
权限。如果清单文件中的应用程序未请求此权限,应用程序就无法发送 SMS。<uses-permission/>
标签在 AndroidManifest.xml
文件中将其列出。如果未请求所需的权限,需要这些权限的操作在运行时就会失败。在某些情况下,java.lang.SecurityException
会被抛回到应用程序。在其他情况下,操作会在不提示且未抛出任何异常的情况下失败。Cursor cursor = getContentResolver().query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null);
android.permission.READ_CONTACTS
权限。如果清单文件中的应用程序未请求此权限,应用程序就无法读取联系人信息。<uses-permission/>
标签在 AndroidManifest.xml
文件中将其列出。如果未请求所需的权限,需要这些权限的操作在运行时就会失败。在某些情况下,java.lang.SecurityException
会被抛回到应用程序。在其他情况下,操作会在不提示且未抛出任何异常的情况下失败。android.provider.Telephony.SMS_RECEIVED
操作的意图。
Intent i = new Intent("android.provider.Telephony.SMS_RECEIVED");
context.sendBroadcast(i);
android.permission.BROADCAST_SMS
权限。如果清单文件中的应用程序未请求此权限,应用程序就无法发送该意图。public
方法中的特权代码。public
访问说明符,则表示任意外部代码都可以调用该方法。如果在代码可动态进入系统(例如 Code Injection、Dangerous File Inclusion、File Upload 等)的库或环境中共享代码,则用于执行特权操作的公共方法可能非常危险。doPrivilegedOpenFile()
声明为 public
,并且执行了一个权限操作。
public static void doPrivilegedOpenFile(final String filePath) {
final BadFileNamePrivilegedAction pa = new BadFileNamePrivilegedAction(filePath);
FileInputStream fis = null;
...
fis = (FileInputStream)AccessController.doPrivileged(pa);
...
}
ALL PRIVILEGES
或 ALL
选项会授予用户可应用于对象的所有权限。程序员可能并不知道授予了所有权限。
GRANT ALL ON employees TO john_doe;
john_doe
现在有权更改该表的定义。true
手动调用回调来指定被授予的权限,可以实现此目的:
public void onGeolocationPermissionsShowPrompt(String origin, GeolocationPermissions$Callback callback){
super.onGeolocationPermissionsShowPrompt(origin, callback);
callback.invoke(origin, true, false);
}
ACTUATOR
角色的用户才能进行访问。
management.security.enabled=false
endpoints.health.sensitive=false
@Component
public class CustomEndpoint implements Endpoint<List<String>> {
public String getId() {
return "customEndpoint";
}
public boolean isEnabled() {
return true;
}
public boolean isSensitive() {
return false;
}
public List<String> invoke() {
// Custom logic to build the output
...
}
}
spring.application.admin.enabled
属性为应用程序启用管理员相关功能。这样会在 MBeanServer
平台上公开 SpringApplicationAdminMXBean
。开发人员可以使用此功能远程管理 Spring Boot 应用程序,但此功能会以远程 JMX 端点的形式扩大攻击面。根据 MBeanServer
配置的不同,可能本地或远程公开 MBean
,可能需要(也可能不需要)身份验证。最糟糕的情况是,攻击者将可以远程管理应用程序,包括在未经身份验证的情况下关闭应用程序。最理想的情况是,服务将与用于保护服务器的凭据一样强大。spring-boot-devtools
存在安全风险。绝不能启用生产部署支持。”
endpoints.shutdown.enabled=true
<http auto-config="true">
...
<intercept-url pattern="/app/admin" access="ROLE_ADMIN" />
<intercept-url pattern="/**" access="permitAll" />
</http>
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
X-Content-Type-Options: nosniff
Strict-Transport-Security: max-age=31536000 ; includeSubDomains
X-Frame-Options: DENY
X-XSS-Protection: 1; mode=block
<http auto-config="true">
...
<headers disabled="true"/>
...
</http>
Ant
路径表达式来指定保护端点的方式。/admin
" Ant
路径表达式匹配的任何端点都需要管理员权限才可访问:
<http auto-config="true">
...
<intercept-url pattern="/app/admin" access="ROLE_ADMIN" />
...
<intercept-url pattern="/**" access="permitAll" />
</http>
Accept
标头来指定资源服务的方式,也可以指定使用了扩展名的特定内容类型。例如,您可以通过将请求发送到 /admin.json
来请求将 /admin
资源作为 JSON 文档。Ant
路径表达式并不列入内容协商扩展名。因此,请求与 /admin
表达式不匹配且端点不受保护。anyRequest()
。若无法定义使用 anyRequest()
匹配程序的退回检查,则可能导致端点得不到应有的保护。
<http auto-config="true">
<intercept-url pattern="/app/admin" access="ROLE_ADMIN" />
<intercept-url pattern="/" access="permitAll" />
</http>
Example 1
中,当前或未来端点(例如 /admin/panel
)可能未得到应有的保护。HttpFirewall
包含在其 FilterChainProxy
中实现此功能,其会借助过滤链发送预先处理过的请求。默认情况下,Sprint Security 使用 StrictHttpFirewall
实施。%2F
和 ;
字符:
<beans:bean id="httpFirewall" class="org.springframework.security.web.firewall.StrictHttpFirewall" p:allowSemicolon="true" p:allowUrlEncodedSlash="true"/>
NoneAuth
身份验证方法来确定可用的身份验证方法。
client = SSHClient()
client.connect(host, port, auth_strategy=NoneAuth("user"))
remove
命令删除整个数据集。最近,有报道称,在 Internet 上公开运行的不安全 MongoDB 实例遭到恶意攻击。攻击者删除了数据库,并要求支付赎金才能恢复数据库。remove
命令删除整个数据集。 最近,有报道称,在 Internet 上公开运行的不安全 MongoDB 实例遭到恶意攻击。 攻击者删除了数据库,并要求支付赎金才能恢复数据库。