技术分享
未读
一文读懂 Web 安全
Web安全是互联网安全领域的关键组成部分,涉及黑帽子(恶意黑客)与白帽子(道德黑客)之间的技术对抗。文章从一个通俗的角度探讨了Web安全的基础知识、攻防实例及安全策略。
**安全世界观**:随着互联网的演进,网页功能日益丰富,随之而来的是安全威胁的增长。早期的木马病毒通过监控键盘窃取用户信息,催生了杀毒软件的发展。安全问题本质上是信任问题,需要通过持续的安全防护减少漏洞和非法攻击。
**如何做好安全**:安全三要素为机密性、完整性和可用性。评估安全问题时,应进行资产等级划分、威胁分析和风险评估,随后确认解决方案。安全原则包括使用白名单授权、最小权限原则、纵深防御、数据与代码分离及不可预测性原则。
**安全攻防案例**:
- **XSS攻击**:攻击者通过注入恶意脚本,将用户数据作为HTML代码执行,从而窃取敏感信息。
- **CSRF攻击**:利用用户已登录的身份,在不知情的情况下执行非用户意愿的操作。
- **点击劫持**:诱骗用户点击伪装的界面,进行非预期的操作。
- **文件上传漏洞**:通过上传恶意文件,如脚本,获得服务器访问权限。
- **登录认证攻击**:包括彩虹表破解密码、Session Fixation和Session保持攻击。
- **应用层拒绝服务攻击**(DDoS):通过大量请求耗尽服务器资源。
**防御措施**:
- 限制文件上传目录权限,检查文件类型,使用随机文件名。
- 实施多因素认证,频繁更换SessionID,限制请求频率。
- 优化应用代码性能,使用负载均衡,及时更新Web服务器软件版本。
总结而言,Web安全是一个涉及多方面技术和策略的领域,要求开发者从设计之初就考虑安全问题,遵循最佳实践,持续改进防御机制,以应对不断变化的威胁 landscape。
技术分享
未读
计算机组成原理
计算机组成原理涵盖了计算机从诞生至今的技术发展历程,主要经历了四代变革。第一代计算机使用电子管作为基本组件,特点是体积庞大、能耗高且运算速度慢;第二代采用晶体管,体积减小、能耗降低、速度提升,并开始使用磁芯存储器;第三代计算机使用中小规模集成电路,运算速度提升至每秒数十万至近百万次,同时软件方面出现了多道批处理和分时操作系统;第四代计算机采用超大规模集成电路,集成度飞跃提升,运算速度极大加快,并分化为大型计算机与微型计算机两大发展方向。
计算机硬件主要由运算器、控制器、存储器、输入设备和输出设备组成。运算器负责数据处理,包括算术运算和逻辑运算,且包含寄存器用于暂存数据。控制器负责协调各部件,确保指令的有序执行,含有程序计数器、指令寄存器、指令译码器和控制单元。存储器用于存储程序和数据,分为主存和辅存。输入输出设备则是人机交互的界面,帮助信息的输入与输出。这一模型由冯·诺依曼提出,奠定了现代计算机体系结构的基础。
技术分享
未读
学习函数式编程 Monad
Monad 的使用场景
链式操作:简化多步骤计算,避免回调地狱,如 Promises 的链式 .then() 调用。
副作用管理:将副作用(如 I/O 操作)封装在 Monad 中,确保程序的纯函数性质。
Monad 与 Promise
虽然 Promise 在很多方面与 Monad 行为相似,如支持链式调用和异步操作的封装,但它并不严格符合 Monad 的所有规则。Promise 的 resolve 方法类似于 Monad 的 unit 函数,而 then 方法则类似 bind。然而,Promise 在处理某些边缘情况时(如传入已解决的 Promise 或 thenable 对象)可能会导致行为与 Monad 的理想定义不符,从而不完全满足 Monad 的单位元和结合律规则。
Monad 处理副作用
Monad 适合处理副作用,因为它能够将副作用操作封装起来,确保这些操作在程序的特定时刻以可控方式执行。例如,通过 IO Monad,可以将读取文件、数据库查询等操作封装,确保它们在程序执行的适当阶段被执行,同时保持程序其他部分的纯功能性。
总结
Monad 是函数式编程中用于解决复杂性和副作用问题的强大工具。它通过提供一套规则和结构,使得开发者能够以声明式、组合的方式编写代码,即便在处理诸如异步、错误处理等复杂场景时也能保持代码的清晰和简洁。虽然 Promise 作为一种常见异步处理模式,与 Monad 思想接近,但严格意义上并不完全符合 Monad 的所有要求。深入理解和应用Monad概念,可以显著提升代码质量和维护性。
技术分享
未读
函数式编程
函数式编程是一种编程范式,强调使用函数来计算,避免改变状态和可变数据,侧重于数据的映射和转换。其核心特点包括:
纯函数:对于相同的输入,总产生相同的输出,无副作用,不依赖外部状态。
函数是一等公民:函数可以作为参数传递给其他函数,也可以作为其他函数的返回值。
无副作用:计算过程不改变外部状态,仅依赖输入值产生输出值。
不可变数据:一旦数据被创建,就不能被修改,确保数据的安全性和预测性。
高阶函数与柯里化:高阶函数以函数为参数或返回函数;柯里化将多参数函数转化为一系列单参数函数。
函数组合:将简单函数组合成复杂功能,提高代码的模块化和重用性。
惰性求值:延迟计算,直到结果真正需要时才执行,提高效率。
Monad:一种特殊的函子,用于处理计算中的副作用,如错误处理、状态管理和I/O操作。
函子与Applicative:函子用于处理值的容器,Applicative提供一种应用函子内函数到函子内值的方式,支持函数和值的组合。
IO函子:特别的函子类型,用于封装具有副作用的操作,如文件读写、网络请求等,保持程序的纯函数特性。
函数式编程在JavaScript等现代语言中越来越受欢迎,特别是在处理异步操作、数据流和大规模并行计算等领域,通过库如RxJS、CycleJS、lodash、underscore、Ramda等得以广泛应用。它鼓励编写简洁、可读性强、易于测试和推理的代码,适合构建复杂且可维护的系统。
技术分享
未读
设计模式
设计模式是软件开发中广泛认可的最佳实践,用于解决常见的设计问题,提高代码的可重用性、可读性和可维护性。它们分为创建型、结构型和行为型三大类。
创建型设计模式关注对象的创建过程,包括:
单例模式确保一个类只有一个实例,并提供全局访问点。
简单工厂模式定义创建对象的接口,将实例化推迟到子类。
建造者模式通过一步步构建复杂对象,支持灵活的构造过程。
工厂方法模式为创建对象提供接口,让子类决定实例化哪一个类。
原型模式通过克隆现有对象来创建新对象,适用于初始化成本高的情况。
结构型设计模式关注类和对象的组合方式,包括:
外观模式提供统一接口,简化系统外部对内部子系统的访问。
适配器模式让不兼容的接口能够协同工作。
代理模式为其他对象提供代理以控制访问或增加功能。
装饰器模式动态地给对象添加职责,不影响其他对象。
桥接模式将抽象部分和实现部分分离,使它们可以独立变化。
组合模式允许以一致方式处理个体对象和组合对象。
享元模式通过共享技术有效支持大量细粒度对象,减少内存消耗。
行为型设计模式关注对象间的交互和职责分配,包括:
模板方法模式定义算法框架,并允许子类重写某些步骤。
观察者模式定义一对多依赖关系,当对象状态改变时自动通知观察者。
状态模式允许对象在其内部状态改变时改变其行为。
策略模式定义一系列算法,并将每一个封装起来,使它们可相互替换。
职责链模式让多个对象有机会处理请求,避免发送者和接收者的直接耦合。
命令模式将请求封装为对象,支持参数化命令、日志和队列等操作。
访问者模式在不改变元素结构的前提下定义新的操作。
中介者模式通过中介者来降低多个对象间的耦合,简化通信方式。
每种模式都有其适用场景和优势,正确运用设计模式可以使软件更加模块化、灵活且易于维护。