浅谈食品包装的安全性-上海臣生商贸有限公司

Website Home

前言:保护Web应用程序的安全性看起来时间苦差事,这件必须要做的工作并不能带来太多的乐趣,但是为了回避尴尬的安全漏洞问题,程序的安全性通常还是不得不做的?

1.ASP.NETWebForms开发人员(1)因为ASP.NETMVC不像ASP.NETWebForms那样提供了很多自动保护机制来保护页面不受恶意用户的攻击,所以阅读本博客来了解这方面的问题,更明确的说法是:ASP.NETWebForms致力于使应用程序免受攻击!

例如:1)服务器组件对显示的值和特性进行HTML编码,以帮助阻止XSS攻击?

2)加密和验证试图状态,从而帮助阻止篡改提交的表单;

3)请求验证(%@pagevalidaterequest=”true”%)截获看起来是恶意的数据并提出警告(这是MVC框架默认开启的保护)。

4)事件验证帮助组织注入攻击和提交无效值?

(2)转向ASP.NETMVC意味着这些问题的处理将落到程序员的肩上—对于某些人来说可能会引起恐慌,而对另一些人来说可能是一件好事。

(3)如果认为框架”就应该处理这种事情”的话,那么确实有一种框架可以处理这一类事情,而且处理的很好,它就是asp.netwebforms。

然而,其代价就是失去了对asp.netwebfroms引入的抽象层次的一些控制。

(4)ASP.NETMVC提供了对标记更多的控制,这意味着程序员要承担更多的责任,要明确的是,ASP.NETMVC提供了许多内置的保护机制(例如:默认利用HTML的辅助方法和Razor语法进行HTML编码以及请求验证等功能特性)。

2.ASP.NETMVC开发人员(1)对于存在安全风险的应用程序,主要的借口是开发人员缺乏足够的信息或者理解,我们想要改变这一局面,但是我们也意识到人无完人,总会有疏忽的时候;

鉴于此,请记住下面的锦囊妙计。

1)永远都不要相信用户提供的任何数据2)每当渲染作为用户输入而引入的数据时,请对其进行HTML编码(如果数据作为特性值显示,就应对其进行HTML特性编码)3)考虑好网站的那些部分允许匿名访问,那些部分要求认证访问?

4)不要试图自己净化用户的HTML输入—否则将遭遇失败?

5)在不需要通过客户端脚本访问cookie时,使用HTTP-onlycookie?

6)强烈建议使用AntiXss库(www.codeplex.com/AntiXSS)!

(2)同时,应用程序的构建基于这样一个假设,即只有特定的用户才能执行某些操作,其他用户则不能执行这些操作?

注解:后面将陆续介绍如何使用ASP.NETMVC中的安全特性来执行向授权这样的应用功能,然后介绍如何处理常见的安全威胁;

1、httponlysession一定要用httponly的否则可能被xxs攻击,利用js获取cookie的session_id!

要用框架的ci_session,更长的位数,httponly,这些默认都配好了?

不要用原生的phpsession,而要用ci_session;

ci_session位数更长!

如果要用原生的session,应该这样设置(php.ini):session.sid_length//sid的长度,这里要加长,默认的太短了session.cookie_httponly=1原生的session就会变成httponly了。

2、phpinfo一定要关闭phpinfo页面,dump的请求信息可能会被攻击者利用?

比如cookie信息?

3、强制全站https通过cdn跳转,本地开发环境也要配https?

如果有的环节不能使用https,比如消息推送,那么可以新建一个站点?

4、Strictmodesession.use_strict_mode=1只使用服务端自己生成的sessionid,不使用用户客户端生成的sessionid?

5、CSRF跨站请求伪造A的cookie里有站点example.com的sessionid,并且未过期,B通过放一个图片在论坛上,引诱A去点击这个图片,这个图片会发起一个请求,请求伪装成example.com,A的浏览器信以为真,将example.com的cookie附加到了这个请求上面,这个请求信息被B的代码截获并且通过异步请求发送给了B,B通过这个cookie登录了A在example.com的账户?

CI有防CSRF机制,即他会在表单里面自动的插入一个隐藏的CSRF字段!

需要进行如下设置:application/config/config.php:$config[csrf_protection]=TRUE?

注意,这个开了以后,所有的向外站进行的请求都被阻止了!

如果我们网站有向其他网站获取数据的行为,比如说调用api,那就不可以启用这个开关;

6、xss攻击CI会对post数据进行xss过滤,只要这样调用:$this->;

只要加一个参数true,就可以对post的数据进行xss过滤。

7、重放你把用户名密码加密了,传到服务器进行登录验证,攻击者并不需要解密你这些用户名密码,他只要把截获的这些数据包,重新再操作一次,就可以实现登录,这就是重放。

5、6的防御措施:每个表单包含一个隐藏的只能用一次的随机码token。

只用一次的token实现:redis到期失效使用后直接删掉8、总结:用户安全登录流程<?

session基本策略:(1)session仅作会话session,关闭浏览器即失效?

(2)session的有效期设置得越短越安全,比如说60秒。

(3)相应的需要修改session的刷新时间,比如说30秒?

(4)设置用redis存储session;

配置如下:在php.ini:session.gc_maxlifetime=60这个是session的有效期,默认是1440秒,即24分钟,改为比如说60秒?

当60秒后,客户端跟服务端这个sid对得上的话,也是无效的,应该在60秒之前刷新一次页面更新sid,怎么更新下面有说。

在application/config/config.php:$config[sess_driver]=redis?

//设为用redis存储session$config[sess_cookie_name]=ci_session;

//设为会话session,关闭浏览器,客户端cookie即失效$config[sess_save_path]=tcp://127.0.0.1:端口号;

//redis地址$config[sess_match_ip]=FALSE!

//要不要验证ip是否一致$config[sess_time_to_update]=30。

//超30秒即刷新sid$config[sess_regenerate_destroy]=TRUE;

//重新生成sid的时候删除旧sid<!

sessionid的刷新及session的过期时间区分:注意:这些设置跟安全关系非常大,应该注意区分及使用。

上面说的session.gc_maxlifetime是什么意思?

即一个session从产生,到过期不能用的时间?

其实如果使用redis就清楚了,这个值就是使用redis保存sid的时候,设定的一个存续时间,这就很清楚了,当一个sid产生的时候就会把这个时间写进去,那么到了这个时间,这个key-value就会被删掉?

那么这个sess_time_to_update呢,这个顾名思义是刷新时间,这个时间是一个阈值,是指超过这个时间即刷新。

并不是自动刷新,而是访问session的时候刷新?

当我们在使用session的时候,他会去判断上次使用session跟这次使用session的间隔,如果间隔大于这个值,即刷新sid。

这个使用,通常的表现就是我们在刷新页面,需要读取session以鉴权,那么就是在刷新页面的时候,两次间隔有超过这个时间,即刷新sid,那么结合上面的maxlifetime呢,就是刷新完之后session重新续命了,一个新的session写进去,连带一个重新开始的计时?

就是说呢,如果我们一会刷一下页面一会刷一下页面,那么必然会在必要的时候触发我们的刷新机制,那么我们的session就不会过期了,永远不会,如果经常性的在那里刷的话;

如果两次刷新的时间间隔超过maxlifetime呢,这时会显示登录超时了,session已经没了,因为在过期了之后你去update,显然是不行了,update失败;

那么总结就是,这个maxlifetime决定了我们两次刷新之间不能超过多长时间,否则登录超时?

而update呢肯定要小于maxlifetime,这是必然的,因为如果大于就无效了,因为过期了刷新没用。

并且最好我觉得这个update最好是maxlifetime的一半以下。

如果maxlifetime很长的话(希望改善用户体验,让用户老是登录超时总是不大好),那么这个update设的比较短也没关系,因为设的比较短的话,假设这个session被偷了那么有比较大的可能这个贼去使用的时候已经过期,安全性会比较高。

one-times-tokens:一次性的token参考这个文章:CSRF的攻击方式详解黑客必备知识老生常谈重放攻击的概念(必看篇)在食品包装无尘车间,需要达到一定的洁净要求,那么具体食品包装无尘车间有那些要求呢。

1、食品包装无尘车间的送风量充足,足以稀释或消除室内产生的污染;

2、食品包装无尘车间内的空气是从洁净区向非洁净区流动的,受污染的空气流动达到极低程度,空气在门口处和室内建筑中的流动方向正确。

3、食品包装无尘车间的送风不会显著增加室内的污染;

4、食品包装无尘车间室内空气的运动状态可保证密室内没有高浓度聚集区域!

如果食品包装无尘车间达到了上面所说的这些标准要求,就可以测量其尘埃粒子的浓度和微生物浓度(需要时),以确定其达到了所无尘车间所规定的标准。

在放假之初,我抽时间看了《白帽子讲web安全》,吴翰清基本上把web安全中所有能够遇到的问题、解决思路归纳总结得很清晰,也是我这一次整体代码安全性的基石。

我希望能分如下几个方面来分享自己的经验把握整站的结构,避免泄露站点敏感目录在写代码之初,我也是像很多老源码一样,在根目录下放上index.php、register.php、login.php,用户点击注册页面,就跳转到!

并没有太多的结构的思想,像这样的代码结构,最大的问题倒不是安全性问题,而是代码扩展与移植问题。

在写代码的过程中,我们常要对代码进行修改,这时候如果代码没有统一的一个入口点,我们可能要改很多地方。

后来我读了一点emlog的代码,发现网站真正的前端代码都在模板目录里,而根目录下就只有入口点文件和配置文件。

这才顿悟,对整个网站的结构进行了修改?

网站根目录下放上一个入口点文件,让它来对整个网站所有页面进行管理,这个时候注册页面变成了?!

act=register,任何页面只是act的一个参数,在得到这个参数后,再用一个switch来选择要包含的文件内容。

在这个入口点文件中,还可以包含一些常量的定义,比如网站的绝对路径、网站的地址、数据库用户密码。

以后我们在脚本的编写中,尽量使用绝对路径而不要使用相对路径(否则脚本如果改变位置,代码也要变),而这个绝对路径就来自入口点文件中的定义!

当然,在安全性上,一个入口点文件也能隐藏后台地址;

像这样的地址??

act=xxx不会暴露后台绝对路径,甚至可以经常更改,不用改变太多代码?

一个入口点文件也可以验证访问者的身份,比如一个网站后台,不是管理员就不允许查看任何页面;

在入口点文件中就可以验证身份,如果没有登录,就输出404页面。

有了入口点文件,我就把所有非入口点文件前面加上了这句话:<。

WWW_ROOT是我在入口点中定义的一个常量,如果用户是通过这个页面的绝对路径访问(),我就输出404错误。

只有通过入口点访问(?;

act=register),才能执行后面的代码!

使用预编译语句,避免sql注入注入是早前很大的一个问题,不过近些年因为大家比较重视这个问题,所以慢慢变得好了很多!

吴翰清在web白帽子里说的很好,其实很多漏洞,像sql注入或xss,都是将“数据”和“代码”没有区分开!

“代码”是程序员写的内容,“数据”是用户可以改变的内容?

如果我们写一个sql语句select*fromadminwhereusername=adminpassword=xxxxx,admin和xxxxx就是数据,是用户输入的用户名和密码,但如果没有任何处理,用户输入的就可能是“代码”,比如or=,这样就造成了漏洞。

“代码”是绝对不能让用户接触的?

在php中,对于mysql数据库有两个模块,mysql和mysqli,mysqli的意思就是mysqlimprove。

mysql的改进版,这个模块中就含有“预编译”这个概念?

像上面那个sql语句,改一改:select*fromadminwhereusername=?

,它就不是一个sql语句了,但是可以通过mysqli的预编译功能先把他编译成stmt对象,在后期用户输入账号密码后,用stmt->。

bind_param将用户输入的“数据”绑定到这两个问号的位置!

这样,用户输入的内容就只能是“数据”,而不可能变成“代码”!

这两个问号限定了“数据”的位置,以及sql语句的结构。

我们可以把我们所有的数据库操作都封装到一个类中,所有sql语句的执行都进行预编译?

这样就完全避免了sql注入,这也是吴翰清最推荐的解决方案?

下面是使用mysqli的一些代码部分(所有的判断函数运行成功或失败的代码我都省略了,但不代表不重要):<。

php//用户输入的数据$name=admin;

//首先新建mysqli对象,构造函数参数中包含了数据库相关内容;

//设置sql语句默认编码$this->?

//创建一个使用通配符的sql语句$sql=SELECTuser_idFROMadminWHEREusername=?!

//编译该语句,得到一个stmt对象.$stmt=$conn->。

/********************之后的内容就能重复利用,不用再次编译*************************///用bind_param方法绑定数据//大家可以看出来,因为我留了两个?!

也就是要向其中绑定两个数据,所以第一个参数是绑定的数据的类型(s=string,i=integer),第二个以后的参数是要绑定的数据$stmt->;

//调用bind_param方法绑定结果(如果只是检查该用户与密码是否存在,或只是一个DML语句的时候,不用绑定结果)//这个结果就是我select到的字段,有几个就要绑定几个$stmt->。

//执行该语句$stmt->!

//得到结果if($stmt->。

fetch()){echo登陆成功!

//一定要注意释放结果资源,否则后面会出错$stmt->。

//返回刚才select到的内容}else{echo登录失败。

预防XSS代码,如果不需要使用cookie就不使用在我的网站中并没有使用cookie,更因为我对权限限制的很死,所以对于xss来说危险性比较小。

对于xss的防御,也是一个道理,处理好“代码”和“数据”的关系;

当然,这里的代码指的就是javascript代码或html代码。

用户能控制的内容,我们一定要使用htmlspecialchars等函数来处理用户输入的数据,并且在javascript中要谨慎把内容输出到页面中!

限制用户权限,预防CSRF现在脚本漏洞比较火的就是越权行为,很多重要操作使用GET方式执行,或使用POST方式执行而没有核实执行者是否知情;

CSRF很多同学可能比较陌生,其实举一个小例子就行了:A、B都是某论坛用户,该论坛允许用户“赞”某篇文章,用户点“赞”其实是访问了这个页面:?!

这个时候,B如果把这个URL发送给A,A在不知情的情况下打开了它,等于说给articleid=12的文章赞了一次;

所以该论坛换了种方式,通过POST方式来赞某篇文章。

inputtype=submitvalue=赞>。

可以看到一个隐藏的input框里含有该文章的ID,这样就不能通过一个URL让A点击了。

但是B可以做一个“极具诱惑力”的页面,其中某个按钮就写成这样一个表单,来诱惑A点击。

A一点击,依旧还是赞了这篇文章!

最后,该论坛只好把表单中增加了一个验证码。

只有A输入验证码才能点赞;

这样,彻底死了B的心。

但是,你见过哪个论坛点“赞”也要输入验证码!

所以吴翰清在白帽子里也推荐了最好的方式,就是在表单中加入一个随机字符串token(由php生成,并保存在SESSION中),如果用户提交的这个随机字符串和SESSION中保存的字符串一致,才能赞!

在B不知道A的随机字符串时,就不能越权操作了!

我在网站中也多次使用了TOKEN,不管是GET方式还是POST方式,通常就能抵御99%的CSRF估计了;

严格控制上传文件类型上传漏洞是很致命的漏洞,只要存在任意文件上传漏洞,就能执行任意代码,拿到webshell?

我在上传这部分,写了一个php类,通过白名单验证,来控制用户上传恶意文件。

在客户端,我通过javascript先验证了用户选择的文件的类型,但这只是善意地提醒用户,最终验证部分,还是在服务端!

白名单是必要的,你如果只允许上传图片,就设置成array(jpg,gif,png,bmp),当用户上传来文件后,取它的文件名的后缀,用in_array验证是否在白名单中?

在上传文件数组中,会有一个MIME类型,告诉服务端上传的文件类型是什么,但是它是不可靠的,是可以被修改的。

在很多存在上传漏洞的网站中,都是只验证了MIME类型,而没有取文件名的后缀验证,导致上传任意文件?

所以我们在类中完全可以忽略这个MIME类型,而只取文件名的后缀,如果在白名单中,才允许上传。

当然,服务器的解析漏洞也是很多上传漏洞的突破点,所以我们尽量把上传的文件重命名,以“日期时间+随机数+白名单中后缀”的方式对上传的文件进行重命名,避免因为解析漏洞而造成任意代码执行!

加密混淆javascript代码,提高攻击门槛很多xss漏洞,都是黑客通过阅读javascript代码发现的,如果我们能把所有javascript代码混淆以及加密,让代码就算解密后也是混乱的(比如把所有变量名替换成其MD5hash值),提高阅读的难度?

使用更高级的hash算法保存数据库中重要信息在这个硬盘容量大增的时期,很多人拥有很大的彩虹表,再加上类似于cmd5这样的网站的大行其道,单纯的md5已经等同于无物,所以我们迫切的需要更高级的hash算法,来保存我们数据库中的密码!

所以后来出现了加salt的md5,比如discuz的密码就是加了salt?

其实salt就是一个密码的“附加值”,比如A的密码是123456,而我们设置的salt是abc,这样保存到数据库的可能就是md5(123456abc),增加了破解的难度;

但是黑客只要得知了该用户的salt也能跑md5跑出来。

因为现在的计算机的计算速度已经非常快了,一秒可以计算10亿次md5值,弱一点的密码分把钟就能跑出来!

所以后来密码学上改进了hash,引进了一个概念:密钥延伸?

说简单点就是增加计算hash的难度(比如把密码用md5()函数循环计算1000次),故意减慢计算hash所用的时间,以前一秒可以计算10亿次,改进后1秒只能计算100万次,速度慢了1000倍,这样,所需的时间也就增加了1000倍。

那么对于我们,怎么使用一个安全的hash计算方法!

大家可以翻阅emlog的源码,可以在include目录里面找到一个HashPaaword.php的文件,其实这就是个类,emlog用它来计算密码的hash;

这个类有一个特点,每次计算出的hash值都不一样,所以黑客不能通过彩虹表等方式破解密码,只能用这个类中一个checkpassword方法来返回用户输入密码的正确性。

而该函数又特意增加了计算hash的时间,所以黑客很难破解他们拿到的hash值?

在最新的php5.5中,这种hash算法成为了一个正式的函数,以后就能使用该函数来hash我们的密码了!

验证码安全性这是我刚想到的一点,来补充一下;

验证码通常是由php脚本生成的随机字符串,通过GD库的处理,制作成图片。

真正的验证码字符串保存在SESSION中,然后把生成的图片展示给用户!

用户填写了验证码提交后,在服务端上SESSION中的验证码进行比对;

由此想到了我之前犯过的一个错误。

验证码比对完成之后,不管是正确还是错误,我都没有清理SESSION。

这样产生了一个问题,一旦一个用户第一次提交验证码成功,第二次以后不再访问生成验证码的脚本,这时候SESSION中的验证码并没有更新,也没有删除,导致验证码重复使用,起不到验证的作用;

再就说到了验证码被识别的问题,wordpress包括emlog的程序我经常会借鉴,但他们所使用的验证码我却不敢恭维!

很多垃圾评论都是验证码被机器识别后产生的,所以我后来也使用了一个复杂一点的验证码,据说是w3c推荐使用的?

如果大家需要,可以到这里下载//www.gxlcms.com/codes/191862.html好了,我能想到的,也是在实际运用中用到的东西也就这么多了。

这也仅仅是我自己写代码中积累的一些对代码安全性的一个见解,如果大家还有更好的想法,可以和我交流。

希望大家也能写出更安全的代码;