Larawa 4年前

修改理由:

标题谬误

此投稿已在 4年前 合并。

标题修改:

- 2019 PHP 安全指南
+ 2018 PHP 安全指南

内容修改:

红色背景 为原始内容

绿色背景 为新增或者修改的内容

OldNewDifferences
1  
21![PHP](https://cdn.learnku.com/uploads/images/201904/10/1/Nus8RLi3He.png!large)
32
432019 年, 大多数的科技工作者—尤其是 Web 开发者—必须摈弃掉关于开发安全 PHP 应用的老一套. 这对那些不相信能够开发出安全的 PHP 应用的人来说尤其重要.
54
65这篇指南应该作为 [PHP: The Right Way](https://laravel-china.github.io/php-the-right-way/) 这本电子书强调安全部分的补充, 而不是作为代码风格一样的普通主题.
76
8 
 7
98
109## PHP 版本
1110
 
1918
2019综上,无论其他供应商做出什么样的承诺,只要你能够做到,都应该在任何时间内[只运行**获得积极支持**](http://php.net/supported-versions.php)的PHP版本。这样,即使使用了一段时间的安全版本,持续不断的升级工作也会让你的生活免于不愉快的意外。
2120
22 
 21
2322
2423## 依赖管理
2524
 
3736
3837如果你正在做一些特别需要使用PHP扩展(用C语言编写)的东西, 你就不能用 Composer 安装它们. 您还需要 PECL.
3938
40 
 39
4140
4241### 推荐的包
4342
 
5554
5655或者,你可以 [上传你的 `composer.lock` 文件到Sensio Labs](https://github.com/FriendsOfPHP/security-advisories#checking-for-vulnerabilities) 作为常规自动漏洞评估工作的一部分,它会把所有使用的过期的包告知你。
5756
58 
 57
5958
6059#### vimeo/psalm
6160[Psalm](https://github.com/vimeo/psalm)是一个静态分析工具,可以帮助识别你代码中的bug。虽然还有其他很好的静态分析工具(例如: [Phan](https://github.com/phan/phan) and [PHPStan](https://github.com/phpstan/phpstan) ,它们都很好),如果您发现自己需要支持php 5,没问题,psalm是支持php 5.4+的。
 
7574如果你是第一次在现有的代码库上运行,可能会看到很多红色提示。这是正常的,除非你创造了一个如同Wordpress一样强大的应用程序,否则不太可能使全部测试通过以满足符合Herculean的要求。
7675
7776无论您使用哪种静态分析工具,我们建议您将运用到持续集成工作流(如果适用),以便在每次代码更改后运行它。
78 
 77
7978
8079## HTTPS和浏览器安全
8180
 
9594
9695*HTTPS (HTTP over TLS) 是[绝对不可协商](https://stackoverflow.com/a/2336738/2224584)*如果您希望您的网站是安全的。使用HTTPS可以立即消除对用户的几类攻击(中间建注入、窃听、重复攻击和多种形式的会话操作,否则将允许用户模拟)。
9796
98 
 97
9998### 安全Headers
10099
101100虽然将HTTPS连接到服务器上确实为用户增加了安全性和性能优势,但你可以通过利用其他浏览器安全功能更进一步的扩大这些优势。其中大多数都涉及在内容里发送HTTP响应头。
 
138137这会强制你的应用在发送会话标识符cookie时使用仅HTTP和安全标记,阻止成功的XSS攻击窃取用户的cookie并强制它们分别仅通过HTTPS发送。我们之前已经在2015年的博文中介绍了[安全PHP会话](https://paragonie.com/blog/2015/04/fast-track-safe-and-secure-php-sessions)
139138
140139
141 
 140
142141### 子资源一致性攻击(Subresource Integrity)
143142
144143在将来的某个时候,你可能会使用CDN将常用的Javascript / CSS框架和库放到一个集中的地方。
 
166165></script>
167166```
168167
169 
 168
170169
171170### 文档关联
172171
 
192191
193192[延伸阅读](https://www.jitbit.com/alexblog/256-targetblank---the-most-underestimated-vulnerability-ever)。
194193
195 
 194
196195## 开发安全的PHP软件
197196
198197如果应用程序安全性是一个新主题,请从[*应用安全性详解*](https://paragonie.com/blog/2015/08/gentle-introduction-application-security)开始.
 
205204
206205因此, [我们只推荐类前10名或前25名安全检查清单](https://paragonie.com/blog/2017/04/checklist-driven-security-considered-harmful).
207206
208 
 207
209208
210209### 数据库交互
211210
 
233232
234233还有其他一些数据库抽象层提供了同等的安全性(EasyDB实际上在底层使用PDO,但是为了防止安全隐患,它特意禁用准备好的语句模拟,而使用实际的准备好的语句)。只要用户输入不能影响查询的结构,您就是安全的。(这包括存储过程。)
235234
236 
 235
237236## 文件上传
238237
239238> 深入了解: [如何安全地允许用户上传文件](https://paragonie.com/blog/2015/10/how-securely-allow-users-upload-files)
 
254253-  MIME类型嗅探可能导致类型混淆攻击。详情见前文[安全Headers](#安全Headers)对`X-Content-Type-Options`响应头的介绍。
255254-  如果你不采纳前面关于如何安全存贮上传文件的建议,攻击者可能设法上传`.php`或者`.phtml`的文件, 通过直接在浏览器中访问上传文件执行任意代码, 从而获得对服务器的完全控制。请安全地玩你的服务器。
256255
257 
 256
258257## 跨站脚本 ( XSS )
259258
260259> 深入阅读: [关于防止 PHP 中的跨站点脚本漏洞,您需要了解的所有内容](https://paragonie.com/blog/2015/06/preventing-xss-vulnerabilities-in-php-everything-you-need-know)
 
2712704. 如果你的需求是允许你使用 Markdown 替代 HTML,[不要使用 HTML ](https://paragonie.com/blog/2015/06/preventing-xss-vulnerabilities-in-php-everything-you-need-know#avoid-html) 。
2722715. 如果你需要允许一些 HTML 并且没有使用模板引擎(请参见#1),那么就使用[ HTML 净化器](http://htmlpurifier.org/)。 HTML 净化器不适用于将内容转义成 HTML 标签属性的场景。
2732726. 对于用户提供的 URLs ,你应该[只允许使用 `http:` 和 `https:` 协议模式](https://paragonie.com/blog/2015/06/preventing-xss-vulnerabilities-in-php-everything-you-need-know#url-escaping);不要用 `javascript:` 。此外,使用 URL 编码方式编码用户的所有输入。
274 
 273
275274## 跨站请求伪造 (CSRF)
276275
277276跨站请求伪造是一种混乱的代理攻击,通过这种攻击,你可以利用用户的权限,欺骗用户的浏览器执行恶意的 HTTP 请求来实现攻击者的目的。
 
300299
301300> 译者注:截至2016年4月,Chrome 51、Opera 39、火狐60已实现了cookie 的 Same-Site 属性。
302301
303 
 302
304303
305304## XML 攻击 (XML外部实体注入, XPath 注入)
306305
 
362361
363362这里我们采用白名单的策略比黑名单策略安全。
364363
365 
 364
366365## 反序列化和PHP对象注入
367366
368367> 深度阅读: [php反序列化安全的实现](https://paragonie.com/blog/2016/04/securely-implementing-de-serialization-in-php)
 
387386   -  如果你需要对传输的签名进行十六进制或 Base64 位编码,也可以使用分离的签名 API 。
388387-  如果你无法确保 参数中JSON 字符串的安全性,请严格限制单个IP访问频率以避免高频的攻击。(laravel 框架可以采用Throttle配置)
389388
390 
 389
391390
392391## 密码哈希
393392
 
412411
413412如果您以前没有在API中使用加密,同时需要迁移旧散列,[请使用这种方法](https://paragonie.com/blog/2016/02/how-safely-store-password-in-2016#legacy-hashes). 很多公司在这方面做了错误的操作,其中典型就的公司有,雅虎。, [Yahoo](https://www.theregister.co.uk/2016/12/15/yahoos_password_hash/). 最近,错误地实现旧哈希升级似乎已经导致了苹果最近的 `iamroot` bug [caused Apple's recent `iamroot` bug](https://objective-see.com/blog/blog_0x24.html).
414413
415 
 414
416415## 一般用途的加密
417416
418417这是我们之前已经详细讨论过的话题:
 
429428
430429如果你直接使用密码/模式, [请参考关于加密最佳实践的简要指南](https://gist.github.com/atoponce/07d8d4c833873be2f68c34f9afc5a78a)。
431430
432 
 431
433432
434433## 随机数
435434
 
450449$int = $rng->getInt(1, 100);
451450```
452451
453 
 452
454453
455454## 服务器端 HTTPS 请求
456455
 
492491
493492这将保护你免受Web服务器与你集成的任何第三方API之间的中间人攻击(man-in-the-middle attacks)。
494493
495 
 494
496495
497496#### 我们*真的* 需要 Certainty 库吗?
498497
 
504503
505504Certainty 库通过使 CACert 捆绑包位于最新的和可预测的位置来消除这种激励。Certainty 库还为许多希望[运行他们自己内部 CA](https://github.com/paragonie/certainty/blob/master/docs/features/LocalCACertBuilder.md) 的企业提供了许多工具。
506505
507 
 506
508507
509508#### 谁来禁用证书验证?
510509
511510常见的内容管理系统(WordPress,Magento等)的插件/扩展开发人员可以做到! 这是我们在生态系统层面试图解决的一个巨大问题。 它不是孤立于任何特定的CMS,你会发现插件等。 因为所有这些都是不安全的。
512511
513 如果您正在使用这样的CMS,请在插件中搜索`CURLOPT_SSL_VERIFYPEER`和`CURLOPT_SSL_VERIFYHOST` ,您可能会发现有几个将这些值设置为`FALSE`。
 512如果您正在使用这样的CMS,请在插件中搜索`CURLOPT_SSL_VERIFYPEER`和`CURLOPT_SSL_VERIFYHOST` ,您可能会发现有几个将这些值设置为`FALSE`。
514513
515514## 应该避免的事情
516515
 
540539
541540如果你专注于使用 PKCS#1 v1.5 进行填补,无论你集成了什么,几乎都会很容易被 [机器人](https://robotattack.org/)攻击,所以将其作为一个允许明文公开和伪造签名的漏洞报告给合适的供应商(或US-CERT)。
542541
543 
 542
544543## 专业使用案例
545544
546545既然你已经掌握了在2018年及以后构建安全PHP应用程序的基础知识,现在让我们来看一些更专业的使用案例。
 
560559
561560在这个过程中的任何步骤,你都可以根据你的实际情况来做调整。
562561
563 
 562
564563## 无边信道的基于令牌的身份认证
565564
566565> 深入阅读: [拆分令牌:无边信道的基于令牌的身份验证协议](https://paragonie.com/blog/2017/02/split-tokens-token-based-authentication-protocols-without-side-channels)
 
575574   -  您可以选择将后半部分的哈希存储在数据库中,而不是它本身。这对于只使用一次的令牌是有意义的,如用在“密码重置”或“在这台计算机上记住我”等地方的令牌。
576575
577576这样即使你可能会因为定时泄漏被别人窃取到一半的令牌,剩下的一半也需要暴力破解才能成功。
578 
 577
579578
580579## 开发安全的API
581580
 
599598
600599Paragon Initiative Enterprises 已经在其许多产品(包括许多开源软件项目)中使用了 Sapient,并将继续将软件项目添加到 Sapient 产品组合中。
601600
602 
 601
603602## 使用Chronicle记录安全事件日志
604603
605604> 深入阅读: [Chronicle 会让你质疑区块链技术的需求](https://paragonie.com/blog/2017/07/chronicle-will-make-you-question-need-for-blockchain-technology)
 
614613
615614要将数据发布到本地 Chronicle,您可以使用任何[与 Sapient 兼容的 API](https://paragonie.com/blog/2017/12/2018-guide-building-secure-php-software#secure-api-sapient),最简单的方式是 [Quill](https://github.com/paragonie/quill)。
616615
617 
 616
618617## 作者的一些话
619618
620619很多聪明的读者应该注意到了我们参考了很多我们自己的工作内容(包括了一些之前发的博文和我们的开源项目),但其实我们并**不仅仅**参考我们自己的内容。
 
627626
628627然而,我们也不可能成为所有方面的先驱,所以我们会尽可能地与一些符合公共利益而不是自私自利的专家们公事。这就是为什么在浏览器安全性的部分引用了 [Scott Helme](https://scotthelme.co.uk/)  和他的公司的工作内容,他们在使开发人员能够接触和理解这些新的安全特性方面做了大量的工作。
629628
630 本篇指南也不是完全详尽的。写不安全的代码的方法几乎和写安全的代码的方法一样多。安全不仅仅是目的,更是一种心态。有了上面所写的内容,以及接下来的资源,我们希望这能帮助全世界的开发人员从今天起用 PHP 编写安全的软件。
 629本篇指南也不是完全详尽的。写不安全的代码的方法几乎和写安全的代码的方法一样多。安全不仅仅是目的,更是一种心态。有了上面所写的内容,以及接下来的资源,我们希望这能帮助全世界的开发人员从今天起用 PHP 编写安全的软件。
631630## 资源
632631
633632如果您已经阅读的本篇的所有内容,并且还想了解更多的知识,那么您可能会对我们[针对学习应用程序安全而制定的阅读列表](https://github.com/paragonie/awesome-appsec)感兴趣。