搜索
首页web前端html教程HTTP请求和数据安全 - 邹恒伟

/*------------------------------------- 01 HTTP请求 ---------------------------------------*/

重点:1.超文本传输协议. 2.http请求过程.

{

    1> http协议: 超文本传输协议(Hypertext Transfer Protocol)

    {

        http协议规定了客户端和服务器之间的数据传输格式.

        

        http协议是在网络开发中最常用的协议.不管是移动客户端还是PC,访问网络资源经常使用http协议.

        

        http优点:

        

        简单快速:

            http协议简单,通信速度很快.

        

        灵活:

            http协议允许传输任意类型的数据.

        

        http协议是短连接(非持续性连接) (TCP/IP  UDP/IP)

            http协议限制每次连接只处理一个请求,服务器对客户端的请求作出响应后,马上断开连接.这种方式可以节省传输时间.

    }

    

    2> http协议的使用;

    

    完整的http通信分为两步:

    

    请求:客户端向服务器索要数据.

    {

        http协议规定:一个完整的http请求包含'请求行','请求头','请求体'三个部分;

        

        '请求行':包含了请求方法,请求资源路径,http协议版本.

        

        "GET /resources/images/ HTTP/1.1"

        

        '请求头':包含了对客户端的环境描述,客户端请求的主机地址等信息.

        

        Accept: text/html // 客户端所能接收的数据类型

        Accept-Language: zh-cn // 客户端的语言环境

        Accept-Encoding: gzip // 客户端支持的数据压缩格式

        Host: m.baidu.com // 客户端想访问的服务器主机地址

        User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.10; rv:37.0) Gecko/20100101 Firefox/37.0 // 客户端的类型,客户端的软件环境

       

        '请求体':客户端发给服务器的具体数据,比如文件/图片等.

    }

    

    响应:服务器返回客户端想要的数据.

    {

        http协议规定:一个完整的http响应包含'状态行','响应头','实体内容'三个部分;

        

        '状态行':包含了http协议版本,状态吗,状态英文名称.

        

        "HTTP/1.1 200 OK"

        

        '响应头':包含了对服务器的描述,对返回数据的描述.

    

        Content-Encoding: gzip // 服务器支持的数据压缩格式

        Content-Length:  1528 // 返回数据的长度

        Content-Type:  application/xhtml+xml;charset=utf-8 // 返回数据的类型

        Date: Mon, 15 Jun 2015 09:06:46 GMT // 响应的时间

        Server: apache  // 服务器类型

        

        '实体内容':服务器返回给客户端的具体数据(图片/html/文件...).

    }

    

    3> 发送http请求:

    {

        iOS开发中,发送http请求的方案有很多,常见的有如下几种:

        苹果原生:

        {

            * NSURLConnection:用法简单,古老经典的一种方案.

        

            * NSURLSession:iOS7以后推出的技术,功能比NSURLConnection更加强大.

        

            * CFNetWork:NSURL 的底层,C语言,一般不用.

        }

        

        第三方框架:

        {

            * ASIHttpRequest:http终结者,功能很强大,可惜作者已停止更新.

            

            * AFNetWorking:简单易用,提供了基本够用的常用功能,维护和使用者多.

            

            * MKNetWorkKit:简单易用,产自印度,维护和使用者少.

        }

        

        在开发中,一般使用第三方框架.

    }

}

/*------------------------------------- 02 GET POST ------------------------------------*/

重点:1.GET POST的区别? 2.POST方法发送登陆请求.

{

    http方法:

    http协议定义了很多方法对应不同的资源操作,其中最常用的是GET POST 方法.

    {

        { GETPOSTOPTIONSHEADPUTDELETETRACECONNECTPATCH }

        

        :PUT

        :DELETE

        :POST

        :GET

    }

    

    参数

    {

        因为 GET POST 可以实现上述所有操作,所以,在现实开发中,我们只要会用GET POST 方法就可以了.

        

        在与服务器交互时,有时候需要给服务器发送一些数据,比如登录时需要发送用户名和密码.

        

        参数:就是指传递给服务器的具体数据.

    }

 

    GET POST 的主要区别表现在参数的传递上.

    

    "GET":

    {

        GET的本质是从服务器得到数据,效率更高.并且GET请求可以被缓存.

        

        '注意': 网络缓存数据,保存在SQLite的数据库中(路径:NSHomeDirectory()).

        查看缓存数据命令行:

        'cd 文件目录'   (打开文件目录)

        'ls'   查看当前文件下目录

        'sqlite3 Cache.db'   打开数据库

        '.tables'    查看数据库中的表单

        'select * from cfurl_cache_response;'   查看服务器响应缓存

        'select * from cfurl_cache_receiver_data;'   查看服务器返回的数据缓存

    

        在请求 URL 后面以 ? 的形式跟上发给服务器的参数,参数以 "参数名"="参数值"的形式拼接,多个参数之间用 & 分隔.

    

        注意:GET的长度是有限制的,不同的浏览器有不同的长度限制,一般在2~8K之间.

    }

    

    "POST":

    {

        POST的本质是向服务器发送数据,也可以获得服务器处理之后的结果,效率不如GET.POST请求不可以被缓存,每次刷新之后都需要重新提交表单.

    

        发送给服务器的参数全部放在'请求体';

    

        理论上,POST传递的数据量没有限制.

    

        注意:所有涉及到用户隐私的数据(密码/银行卡号等...)都要用POST的方式传递.

    }

    

    注意:URL中不能出现空格以及中文等特殊符号.

    

    1>URL,所有的字符都必须是 ASCII ;

    

    2>URL中不能出现中文和特殊符号(如空格);

    

    所以,如果 URL 中出现了中文,需要添加百分号转译.

    urlString = [urlString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

    

    POST 发送登陆请求:

    

    注意:

    

    1> 用可变请求: NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];

    

    2> 指定请求方法: request.HTTPMethod = @"POST";

    

    3> 设置请求体数据: request.HTTPBody = data;

    

    // 实例化请求体字符串

    NSString *body = [NSString stringWithFormat:@"username=%@&password=%@",self.userName.text,self.password.text];

    // 将字符串转换成二进制数据

    NSData *data = [body dataUsingEncoding:NSUTF8StringEncoding];

    

    4> 发送异步网络请求.

    [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {

        

        // NSURLResponse *response: 服务器响应

        

        // NSData *data: 服务器返回的数据

        

        // NSError *connectionError: 连接错误处理

        

        // 网络请求的回调.

    }]

}

/*------------------------------------- 03 保存用户信息 -------------------------------------*/

重点:1.偏好设置保存用户信息.

{

    如果用户登陆成功,就保存用户信息.下次直接从偏好设置中读取用户信息,以此做到用户只需要输入一次账号和密码,以后登陆就可以不用再次输入.

    

    1>.登陆成功,保存用户信息(偏好设置)

    2>.再次进入,直接显示用户之前保存的信息.避免用户重复输入.

    

    // 偏好设置存储用户信息

    -(void)savaUserInfo

    {

        // 实例化偏好设置对象(单例)

        NSUserDefaults *User = [NSUserDefaults standardUserDefaults];

        // 保存用户名

        [User setObject:self.userName.text forKey:kITUSERNAMEKEY];

        // 保存用户密码

        [User setObject:pass forKey:kITUSERPASSKEY];

        // 同步保存用户信息

        [User synchronize];

    }

    

    // 加载偏好设置中的用户信息

    - (void)loadUserInfo

    {

        NSUserDefaults *User = [NSUserDefaults standardUserDefaults];

        

        if ([User objectForKey:ITUSERNAMEKEY]) {

            

            self.userName.text = [User objectForKey:ITUSERNAMEKEY];

            

        }if ([User objectForKey:ITUSERPASSKEY]) {

            

            self.password.text = [User objectForKey:ITUSERPASSKEY];

            

        };

    }

    

    用户登陆业务逻辑

    {

        // 用户登陆需要一个单独的控制器,因为只需要登陆一次(Login.storyboard). 应用程序需要有一个入口:main.storyboard: app 主页面

        

        // 判断用户是否登陆成功过(通过偏好设置中存储的用户信息判断)

        // 1> 如果偏好设置中存有用户信息(说明之前登陆成功过),直接进入 app 主页面 :main.storyboard

        // 2> 如果偏好设置中不存在用户信息(第一次登陆或者之前注销了用户信息),进入登陆界面 :Login.storyboard

        

        // 如果用户登陆成功,跳转到 app 主页面:main.storyboard.并且在偏好设置中保存用户信息.

        

        // 如果用户点击注销按钮,注销用户信息,返回到登陆页面.

    }

    

 

    问题: 用户密码不能以明文的形式保存,需要对用户密码加密之后再保存!

    

    密码的安全原则:

    

    1> 本地和服务器都不允许保存用户的密码明文.

    

    2> 在网络上,不允许传输用户的密码明文.

    

    现代密码学趣闻! 中途岛海战(AF)

    

    数据加密算法:

    

    1> 对称加密算法:加密和解密使用同一密钥.加密解密速度快,要保证密钥安全.适合给大数据加密.

    

    2> 非对称加密算法:使用公钥加密,私钥解密.或者使用私钥加密,公钥解密.更加安全,但是加密解密速度慢,适合给小数据加密.

    

    小技巧:

    

    openssl :是一个强大的安全套接字层密码库,囊括主要的密码算法,常用的密钥和证书封装管理功能以及 SSL 协议.提供丰富的应用程序测试功能.

    

    终端命令:

    

        echo hello |openssl md5

        echo hello |openssl sha1

        echo hello |openssl sha -sha256

        echo hello |openssl sha -sha512

}

 

 

/*------------------------------------- 04 信息安全加密 -------------------------------------*/

常用加密方法: 1> base64  2> MD5  3> MD5加盐  4> HMAC  5> 时间戳密码(用户密码动态变化)

{

    1> base64

    {

        base64 编码是现代密码学的基础.

        

        原本是 8bit 一组表示数据,改为 6bit一组表示数据,不足的部分补零, 两个0 一个 = 表示.

        base64 编码之后,数据长度会变大,增加了大约 1/3 左右.

        

        base64 基本能够达到安全要求,但是,base64能够逆运算,非常不安全!

        base64 编码有个非常显著的特点,末尾有个 '=' .

        

        利用终端命令进行base64运算:

        

            // 将文件 meinv.jpg 进行 base64运算之后存储为 meinv.txt

            base64 meinv.jpg -o meinv.txt

        

            // meinv.txt 解码生成 meinv.png

            base64 -D meinv.txt -o meinv.png

        

            // 将字符串 "hello" 进行 base 64 编码 结果:aGVsbG8=

            echo "hello" | base64

        

            // base64编码之后的结果 aGVsbG8= 反编码为字符串

            echo aGVsbG8= | base64 -D

    }

    

    2> MD5 -- (信息-摘要算法) 哈希算法之一.

    {

    

        把一个任意长度的字节串变换成一定长度的十六进制的大整数. 注意,字符串的转换过程是不可逆的.

    

        用于确保'信息传输'完整一致.

    

        MD5特点:

        

        *1.压缩性:   任意长度的数据,算出的 MD5 值长度都是固定的.

        *2.容易计算: 从原数据计算出 MD5 值很容易.

        *3.抗修改性: 对原数据进行任何改动,哪怕只修改一个字节,所得到的 MD5 值都有很大区别.

        *4.弱抗碰撞: 已知原数据和其 MD5 ,想找到一个具有相同 MD5 值的数据(即伪造数据)是非常困难的.

        *5.强抗碰撞: 想找到两个不同数据,使他们具有相同的 MD5 ,是非常困难的.

        

        MD5 应用:

        

        *1. 一致性验证: MD5 将整个文件当做一个大文本信息,通过不可逆的字符串变换算法,产生一个唯一的 MD5 信息摘要.就像每个人都有自己独一无二的指纹,MD5 对任何文件产生一个独一无二的"数字指纹".

        

            利用 MD5 来进行文件校验, 被大量应用在软件下载站,论坛数据库,系统文件安全等方面.

        

        *2. 数字签名;

        

        *3. 安全访问认证;

    

    }

    

    3> MD5加盐

    {

        MD5 本身是不可逆运算,但是,目前网络上有很多数据库支持反查询.

        

        MD5加盐 就是在密码哈希过程中添加的额外的随机值.

        

        注意:加盐要足够长,足够复杂.

    }

    

    4> HMAC

    {

        HMAC 利用哈希算法,以一个密钥和一个消息为输入,生成一个消息摘要作为输出.

        

        HMAC 主要使用在身份认证中;

        

        认证流程:

        

            *1. 客户端向服务器发送一个请求.

            *2. 服务器接收到请求后,生成一个'随机数'并通过网络传输给客户端.

            *3. 客户端将接收到的'随机数''密钥'进行 HMAC-MD5 运算,将得到的结构作为认证数据传递给服务器.

            (实际是将随机数提供给 ePass,密钥也是存储在 ePass中的)

            *4. 与此同时,服务器也使用该'随机数'与存储在服务器数据库中的该客户'密钥'进行 HMAC-MD5 运算,如果

            服务器的运算结果与客户端传回的认证数据相同,则认为客户端是一个合法用法.

        

    }

    

    5> 时间戳密码(用户密码动态变化)

    {

        相同的密码明文 + 相同的加密算法 === 每次计算都得出不同的结果.可以充分保证密码的安全性.

        

        原理:将当前时间加入到密码中;

        

        因为每次登陆时间都不同,所以每次计算出的结果也都不相同.

        

        服务器也需要采用相同的算法.这就需要服务器和客户端时间一致.

        

        注意:服务器端时间和客户端时间,可以有一分钟的误差(比如:59S发送的网络请求,一秒钟后服务器收到并作出响应,这时服务器当前时间比客户端发送时间晚一分钟).

        

        这就意味着,服务器需要计算两次(当前时间和一分钟之前两个时间点各计算一次).只要有一个结果是正确的,就可以验证成功!

        

    }

    

    // IP辅助/手机绑定...

 

}

/*-------------------------------------- 05 钥匙串访问 -------------------------------------*/

重点: 1.钥匙串访问

{

    苹果在 iOS 7.0.3 版本以后公布钥匙串访问的SDK. 钥匙串访问接口是纯C语言的.

    

    钥匙串使用 AES 256加密算法,能够保证用户密码的安全.

    

    钥匙串访问的第三方框架(SSKeychain),是对 C语言框架 的封装.注意:不需要看源码.

    

    钥匙串访问的密码保存在哪里?只有苹果才知道.这样进一步保障了用户的密码安全.

    

    使用步骤:

    {

        // 获取应用程序唯一标识.

        

        NSString *bundleId = [NSBundle mainBundle].bundleIdentifier;

        

        // 1.利用第三方框架,将用户密码保存在钥匙串

        

        [SSKeychain setPassword:self.pwdText.text forService:bundleId account:self.usernameText.text];

        

        "注意"三个参数:

        

        1.密码:可以直接使用明文.钥匙串访问本身是使用 AES 256加密,就是安全的.所以使用的时候,直接传递密码明文就可以了.

        

        2.服务名:可以随便乱写,建议唯一! 建议使用 bundleId.

        

        bundleId是应用程序的唯一标识,每一个上架的应用程序都有一个唯一的 bundleId

        

        3.账户名:直接用用户名称就可以.

        

        // 2.从钥匙串加载密码

        

        self.pwdText.text = [SSKeychain passwordForService:bundleId account:self.usernameText.text];

    }

}

/*-------------------------------------- 06 指纹识别 ---------------------------------------*/

重点: 1.指纹识别用法

{

    指纹识别功能是 iphone 5S之后推出的.SDK iOS 8.0 推出!

 

 

声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
超越HTML:网络开发的基本技术超越HTML:网络开发的基本技术Apr 26, 2025 am 12:04 AM

要构建一个功能强大且用户体验良好的网站,仅靠HTML是不够的,还需要以下技术:JavaScript赋予网页动态和交互性,通过操作DOM实现实时变化。CSS负责网页的样式和布局,提升美观度和用户体验。现代框架和库如React、Vue.js和Angular,提高开发效率和代码组织结构。

HTML中的布尔属性是什么?举一些例子。HTML中的布尔属性是什么?举一些例子。Apr 25, 2025 am 12:01 AM

布尔属性是HTML中的特殊属性,不需要值即可激活。1.布尔属性通过存在与否控制元素行为,如disabled禁用输入框。2.它们的工作原理是浏览器解析时根据属性的存在改变元素行为。3.基本用法是直接添加属性,高级用法可通过JavaScript动态控制。4.常见错误是误以为需要设置值,正确写法应简洁。5.最佳实践是保持代码简洁,合理使用布尔属性以优化网页性能和用户体验。

如何验证您的HTML代码?如何验证您的HTML代码?Apr 24, 2025 am 12:04 AM

HTML代码可以通过在线验证器、集成工具和自动化流程来确保其清洁度。1)使用W3CMarkupValidationService在线验证HTML代码。2)在VisualStudioCode中安装并配置HTMLHint扩展进行实时验证。3)利用HTMLTidy在构建流程中自动验证和清理HTML文件。

HTML与CSS和JavaScript:比较Web技术HTML与CSS和JavaScript:比较Web技术Apr 23, 2025 am 12:05 AM

HTML、CSS和JavaScript是构建现代网页的核心技术:1.HTML定义网页结构,2.CSS负责网页外观,3.JavaScript提供网页动态和交互性,它们共同作用,打造出用户体验良好的网站。

HTML作为标记语言:其功能和目的HTML作为标记语言:其功能和目的Apr 22, 2025 am 12:02 AM

HTML的功能是定义网页的结构和内容,其目的在于提供一种标准化的方式来展示信息。1)HTML通过标签和属性组织网页的各个部分,如标题和段落。2)它支持内容与表现分离,提升维护效率。3)HTML具有可扩展性,允许自定义标签增强SEO。

HTML,CSS和JavaScript的未来:网络开发趋势HTML,CSS和JavaScript的未来:网络开发趋势Apr 19, 2025 am 12:02 AM

HTML的未来趋势是语义化和Web组件,CSS的未来趋势是CSS-in-JS和CSSHoudini,JavaScript的未来趋势是WebAssembly和Serverless。1.HTML的语义化提高可访问性和SEO效果,Web组件提升开发效率但需注意浏览器兼容性。2.CSS-in-JS增强样式管理灵活性但可能增大文件体积,CSSHoudini允许直接操作CSS渲染。3.WebAssembly优化浏览器应用性能但学习曲线陡,Serverless简化开发但需优化冷启动问题。

HTML:结构,CSS:样式,JavaScript:行为HTML:结构,CSS:样式,JavaScript:行为Apr 18, 2025 am 12:09 AM

HTML、CSS和JavaScript在Web开发中的作用分别是:1.HTML定义网页结构,2.CSS控制网页样式,3.JavaScript添加动态行为。它们共同构建了现代网站的框架、美观和交互性。

HTML的未来:网络设计的发展和趋势HTML的未来:网络设计的发展和趋势Apr 17, 2025 am 12:12 AM

HTML的未来充满了无限可能。1)新功能和标准将包括更多的语义化标签和WebComponents的普及。2)网页设计趋势将继续向响应式和无障碍设计发展。3)性能优化将通过响应式图片加载和延迟加载技术提升用户体验。

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

EditPlus 中文破解版

EditPlus 中文破解版

体积小,语法高亮,不支持代码提示功能

螳螂BT

螳螂BT

Mantis是一个易于部署的基于Web的缺陷跟踪工具,用于帮助产品缺陷跟踪。它需要PHP、MySQL和一个Web服务器。请查看我们的演示和托管服务。

适用于 Eclipse 的 SAP NetWeaver 服务器适配器

适用于 Eclipse 的 SAP NetWeaver 服务器适配器

将Eclipse与SAP NetWeaver应用服务器集成。

mPDF

mPDF

mPDF是一个PHP库,可以从UTF-8编码的HTML生成PDF文件。原作者Ian Back编写mPDF以从他的网站上“即时”输出PDF文件,并处理不同的语言。与原始脚本如HTML2FPDF相比,它的速度较慢,并且在使用Unicode字体时生成的文件较大,但支持CSS样式等,并进行了大量增强。支持几乎所有语言,包括RTL(阿拉伯语和希伯来语)和CJK(中日韩)。支持嵌套的块级元素(如P、DIV),

MinGW - 适用于 Windows 的极简 GNU

MinGW - 适用于 Windows 的极简 GNU

这个项目正在迁移到osdn.net/projects/mingw的过程中,你可以继续在那里关注我们。MinGW:GNU编译器集合(GCC)的本地Windows移植版本,可自由分发的导入库和用于构建本地Windows应用程序的头文件;包括对MSVC运行时的扩展,以支持C99功能。MinGW的所有软件都可以在64位Windows平台上运行。