Alert Block方法.

这篇博客介绍了如何在Objective-C中使用Block来创建和处理Alert视图,详细阐述了在.h和.m文件中的实现过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

.h文件

-(void) handlerClickedButton:(void (^)(NSInteger btnIndex))aBlock;
-(void) handlerCancel:(void (^)(void))aBlock;
-(void) handlerWillPresent:(void (^)(void))aBlock;
-(void) handlerDidPresent:(void (^)(void))aBlock;
-(void) handlerWillDismiss:(void (^)(NSInteger btnIndex))aBlock;
-(void) handlerDidDismiss:(void (^)(NSInteger btnIndex))aBlock;
-(void) handlerShouldEnableFirstOtherButton:(BOOL (^)(void))aBlock;


.m文件

#undef	UIAlertView_key_clicked
#define UIAlertView_key_clicked	"UIAlertView.clicked"
#undef	UIAlertView_key_cancel
#define UIAlertView_key_cancel	"UIAlertView.cancel"
#undef	UIAlertView_key_willPresent
#define UIAlertView_key_willPresent	"UIAlertView.willPresent"
#undef	UIAlertView_key_didPresent
#define UIAlertView_key_didPresent	"UIAlertView.didPresent"
#undef	UIAlertView_key_willDismiss
#define UIAlertView_key_willDismiss	"UIAlertView.willDismiss"
#undef	UIAlertView_key_didDismiss
#define UIAlertView_key_didDismiss	"UIAlertView.didDismiss"
#undef	UIAlertView_key_shouldEnableFirstOtherButton
#define UIAlertView_key_shouldEnableFirstOtherButton	"UIAlertView.SEFOB"

-(void) handlerClickedButton:(void (^)(NSInteger btnIndex))aBlock{
    self.delegate = self;
    objc_setAssociatedObject(self, UIAlertView_key_clicked, aBlock, OBJC_ASSOCIATION_COPY);
}
-(void) handlerCancel:(void (^)(void))aBlock{
    self.delegate = self;
    objc_setAssociatedObject(self, UIAlertView_key_willPresent, aBlock, OBJC_ASSOCIATION_COPY);
}
-(void) handlerWillPresent:(void (^)(void))aBlock{
    self.delegate = self;
    objc_setAssociatedObject(self, UIAlertView_key_cancel, aBlock, OBJC_ASSOCIATION_COPY);
}

-(void) handlerDidPresent:(void (^)(void))aBlock{
    self.delegate = self;
    objc_setAssociatedObject(self, UIAlertView_key_didPresent, aBlock, OBJC_ASSOCIATION_COPY);
}
-(void) handlerWillDismiss:(void (^)(NSInteger btnIndex))aBlock{
    self.delegate = self;
    objc_setAssociatedObject(self, UIAlertView_key_willDismiss, aBlock, OBJC_ASSOCIATION_COPY);
}
-(void) handlerDidDismiss:(void (^)(NSInteger btnIndex))aBlock{
    self.delegate = self;
    objc_setAssociatedObject(self, UIAlertView_key_didDismiss, aBlock, OBJC_ASSOCIATION_COPY);
}
-(void) handlerShouldEnableFirstOtherButton:(BOOL (^)(void))aBlock{
    self.delegate = self;
    objc_setAssociatedObject(self, UIAlertView_key_shouldEnableFirstOtherButton, aBlock, OBJC_ASSOCIATION_COPY);
}

#pragma mark - UIAlertViewDelegate
-(void) alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex{
    void (^block)(NSInteger btnIndex) = objc_getAssociatedObject(self, UIAlertView_key_clicked);
    
    if (block) block(buttonIndex);
}
-(void) alertViewCancel:(UIAlertView *)alertView{
    void (^block)(void) = objc_getAssociatedObject(self, UIAlertView_key_cancel);
    
    if (block) block();
}
-(void) willPresentAlertView:(UIAlertView *)alertView{
    void (^block)(void) = objc_getAssociatedObject(self, UIAlertView_key_willPresent);
    
    if (block) block();
}

-(void) didPresentAlertView:(UIAlertView *)alertView{
    void (^block)(void) = objc_getAssociatedObject(self, UIAlertView_key_didPresent);
    
    if (block) block();
}

-(void) alertView:(UIAlertView *)alertView willDismissWithButtonIndex:(NSInteger)buttonIndex{
    void (^block)(NSInteger btnIndex) = objc_getAssociatedObject(self, UIAlertView_key_willPresent);
    
    if (block) block(buttonIndex);
}

-(void) alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex{
    void (^block)(NSInteger btnIndex) = objc_getAssociatedObject(self, UIAlertView_key_didPresent);
    
    if (block) block(buttonIndex);
}


-(BOOL) alertViewShouldEnableFirstOtherButton:(UIAlertView *)alertView{
    BOOL (^block)(void) = objc_getAssociatedObject(self, UIAlertView_key_shouldEnableFirstOtherButton);
    
    if (block) {
        return block();
    }
    return YES;
}




<think>嗯,用户这次的问题集中在XSS攻击和HTML注入的解决方案上,结合之前提供的详细攻击向量分析,说明ta正在进行实际的安全防护工作。用户特别强调要参考站内引用,尤其是DOMPurify库的应用和CSP策略,这提示ta可能需要具体的代码级解决方案。从引用内容看,用户真正需求可能包含三层:首先是理解攻击原理(如引用[2]描述的存储型XSS),其次是找到可落地的消毒方案(引用[1]的DOMPurify),最后是框架级防护(引用[3]的CSP和框架内置安全)。特别要注意用户提供的攻击向量“<img/src/onerror=top['alert'](1)>”,这是典型的属性分割绕过技巧,需要重点解析。在技术层面,回答需要覆盖四个维度:1)输入消毒的具体代码示例(如DOMPurify配置细节);2)CSP头部如何阻断内联事件(如onerror);3)现代框架(React/Vue)的自动防护机制;4)针对引用[3]提到的HttpOnlyCookie实践。其中DOMPurify的示例必须包含src属性处理,因为用户示例涉及img标签注入。考虑到用户可能是开发者,准备在关键处补充技术细节:比如DOMPurify如何处理onerror属性(直接删除)、CSP的'noxss-block'实验性指令效果、以及React的dangerouslySetInnerHTML警告机制。对于WAF绕过问题,还需说明正则过滤的局限性——例如属性分割攻击可能绕过简单的<script>标签检测。最后的安全建议要突出纵深防御,引用[1][3]都提到单一措施不足。比如即使使用DOMPurify,也要在服务端验证img的src协议(拦截javascript:伪协议),这点在解决思路第2点需明确。</think> 以下是针对XSS攻击和HTML注入问题的系统解决方案,结合攻击原理与防护实践: ### XSS攻击与HTML注入防护体系 #### 1. **攻击核心原理** XSS攻击通过注入恶意脚本篡改网页内容,主要形式包括: - **属性注入**:如用户提供的攻击向量: ```html <img/src/onerror=top['alert'](1)> ``` 此代码通过`src`属性分割和`onerror`事件触发脚本执行,绕过了基础过滤[^2] - **协议注入**:利用伪协议如`javascript:` ```html <a href="javascript:alert('XSS')">点击</a> ``` - **动态代码执行**:通过`eval()`或`innerHTML`执行未消毒内容[^1] #### 2. **防护解决方案** ##### (1) 输入消毒(关键措施) 使用专用库处理用户输入: ```javascript import DOMPurify from 'dompurify'; // 消毒HTML内容 const cleanHTML = DOMPurify.sanitize(userInput, { FORBID_ATTR: ['onerror', 'onload'], // 禁用危险事件属性 USE_PROFILES: { html: true } // 仅允许安全HTML标签 }); document.getElementById('output').innerHTML = cleanHTML; ``` **作用**:删除`onerror`等事件处理器,阻止属性分割攻击[^1] ##### (2) 输出编码 对不同场景采用差异化编码: ```javascript // HTML上下文编码 function encodeHTML(str) { return str.replace(/[&<>"']/g, char => ({ '&': '&', '<': '<', '>': '>', '"': '"', "'": ''' }[char])); } // URL属性编码 const safeURL = encodeURIComponent(userURL); ``` **注意**:在`href`、`src`等属性中需额外验证协议合法性(如禁止`javascript:`) ##### (3) 内容安全策略(CSP) HTTP响应头配置: ``` Content-Security-Policy: default-src 'self'; script-src 'nonce-random123'; img-src https://cdn.example.com; object-src 'none' ``` **效果**: - 禁止内联脚本(阻断`onerror=alert(1)`) - 限制图片源域名(防止恶意图床) - 禁用Flash等插件[^3] ##### (4) 框架级防护 现代前端框架的防护机制: - **React**:自动转义JSX表达式 ```jsx <div>{userInput}</div> // 内容自动编码为文本 ``` - **Vue**:`v-text`指令自动编码,`v-html`需显式消毒 #### 3. **纵深防御策略** | 层级 | 防护措施 | 作用 | |-------------|----------------------------------|--------------------------------------| | **输入层** | 白名单验证 + DOMPurify消毒 | 过滤`<script>`、危险属性 | | **输出层** | 上下文敏感编码 + DOM隔离 | 防止解析为可执行代码 | | **传输层** | CSP策略 + HttpOnly Cookie | 阻断非法资源加载,保护会话安全[^3] | | **运行时** | 沙箱化iframe隔离用户内容 | 限制恶意代码影响范围 | ### 典型攻击场景修复 **案例:存储型XSS防护** ```javascript // 后端Node.js示例(使用DOMPurify+编码) app.post('/comment', (req, res) => { const sanitized = DOMPurify.sanitize(req.body.content, { ALLOWED_TAGS: ['b', 'i'] }); const encoded = encodeHTML(sanitized); // 二次防御 db.saveComment(encoded); // 存储消毒后数据 }); // 前端渲染 <div v-html="commentContent"></div> <!-- Vue中避免使用v-html,改用: --> <div>{{ commentContent }}</div> // 自动编码 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值