标题谬误
Larawa
4年前
修改理由:
此投稿已在 4年前 合并。
标题修改:
内容修改:
Old | New | Differences |
---|---|---|
1 | ||
2 | 1 | ![PHP](https://cdn.learnku.com/uploads/images/201904/10/1/Nus8RLi3He.png!large) |
3 | 2 | |
4 | 3 | 2019 年, 大多数的科技工作者—尤其是 Web 开发者—必须摈弃掉关于开发安全 PHP 应用的老一套. 这对那些不相信能够开发出安全的 PHP 应用的人来说尤其重要. |
5 | 4 | |
6 | 5 | 这篇指南应该作为 [PHP: The Right Way](https://laravel-china.github.io/php-the-right-way/) 这本电子书强调安全部分的补充, 而不是作为代码风格一样的普通主题. |
7 | 6 | |
8 | ||
7 | ||
9 | 8 | |
10 | 9 | ## PHP 版本 |
11 | 10 | … | … |
19 | 18 | |
20 | 19 | 综上,无论其他供应商做出什么样的承诺,只要你能够做到,都应该在任何时间内[只运行**获得积极支持**](http://php.net/supported-versions.php)的PHP版本。这样,即使使用了一段时间的安全版本,持续不断的升级工作也会让你的生活免于不愉快的意外。 |
21 | 20 | |
22 | ||
21 | ||
23 | 22 | |
24 | 23 | ## 依赖管理 |
25 | 24 | … | … |
37 | 36 | |
38 | 37 | 如果你正在做一些特别需要使用PHP扩展(用C语言编写)的东西, 你就不能用 Composer 安装它们. 您还需要 PECL. |
39 | 38 | |
40 | ||
39 | ||
41 | 40 | |
42 | 41 | ### 推荐的包 |
43 | 42 | … | … |
55 | 54 | |
56 | 55 | 或者,你可以 [上传你的 `composer.lock` 文件到Sensio Labs](https://github.com/FriendsOfPHP/security-advisories#checking-for-vulnerabilities) 作为常规自动漏洞评估工作的一部分,它会把所有使用的过期的包告知你。 |
57 | 56 | |
58 | ||
57 | ||
59 | 58 | |
60 | 59 | #### vimeo/psalm |
61 | 60 | [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+的。 | … | … |
75 | 74 | 如果你是第一次在现有的代码库上运行,可能会看到很多红色提示。这是正常的,除非你创造了一个如同Wordpress一样强大的应用程序,否则不太可能使全部测试通过以满足符合Herculean的要求。 |
76 | 75 | |
77 | 76 | 无论您使用哪种静态分析工具,我们建议您将运用到持续集成工作流(如果适用),以便在每次代码更改后运行它。 |
78 | ||
77 | ||
79 | 78 | |
80 | 79 | ## HTTPS和浏览器安全 |
81 | 80 | … | … |
95 | 94 | |
96 | 95 | *HTTPS (HTTP over TLS) 是[绝对不可协商](https://stackoverflow.com/a/2336738/2224584)*如果您希望您的网站是安全的。使用HTTPS可以立即消除对用户的几类攻击(中间建注入、窃听、重复攻击和多种形式的会话操作,否则将允许用户模拟)。 |
97 | 96 | |
98 | ||
97 | ||
99 | 98 | ### 安全Headers |
100 | 99 | |
101 | 100 | 虽然将HTTPS连接到服务器上确实为用户增加了安全性和性能优势,但你可以通过利用其他浏览器安全功能更进一步的扩大这些优势。其中大多数都涉及在内容里发送HTTP响应头。 | … | … |
138 | 137 | 这会强制你的应用在发送会话标识符cookie时使用仅HTTP和安全标记,阻止成功的XSS攻击窃取用户的cookie并强制它们分别仅通过HTTPS发送。我们之前已经在2015年的博文中介绍了[安全PHP会话](https://paragonie.com/blog/2015/04/fast-track-safe-and-secure-php-sessions) |
139 | 138 | |
140 | 139 | |
141 | ||
140 | ||
142 | 141 | ### 子资源一致性攻击(Subresource Integrity) |
143 | 142 | |
144 | 143 | 在将来的某个时候,你可能会使用CDN将常用的Javascript / CSS框架和库放到一个集中的地方。 | … | … |
166 | 165 | ></script> |
167 | 166 | ``` |
168 | 167 | |
169 | ||
168 | ||
170 | 169 | |
171 | 170 | ### 文档关联 |
172 | 171 | … | … |
192 | 191 | |
193 | 192 | [延伸阅读](https://www.jitbit.com/alexblog/256-targetblank---the-most-underestimated-vulnerability-ever)。 |
194 | 193 | |
195 | ||
194 | ||
196 | 195 | ## 开发安全的PHP软件 |
197 | 196 | |
198 | 197 | 如果应用程序安全性是一个新主题,请从[*应用安全性详解*](https://paragonie.com/blog/2015/08/gentle-introduction-application-security)开始. | … | … |
205 | 204 | |
206 | 205 | 因此, [我们只推荐类前10名或前25名安全检查清单](https://paragonie.com/blog/2017/04/checklist-driven-security-considered-harmful). |
207 | 206 | |
208 | ||
207 | ||
209 | 208 | |
210 | 209 | ### 数据库交互 |
211 | 210 | … | … |
233 | 232 | |
234 | 233 | 还有其他一些数据库抽象层提供了同等的安全性(EasyDB实际上在底层使用PDO,但是为了防止安全隐患,它特意禁用准备好的语句模拟,而使用实际的准备好的语句)。只要用户输入不能影响查询的结构,您就是安全的。(这包括存储过程。) |
235 | 234 | |
236 | ||
235 | ||
237 | 236 | ## 文件上传 |
238 | 237 | |
239 | 238 | > 深入了解: [如何安全地允许用户上传文件](https://paragonie.com/blog/2015/10/how-securely-allow-users-upload-files) | … | … |
254 | 253 | - MIME类型嗅探可能导致类型混淆攻击。详情见前文[安全Headers](#安全Headers)对`X-Content-Type-Options`响应头的介绍。 |
255 | 254 | - 如果你不采纳前面关于如何安全存贮上传文件的建议,攻击者可能设法上传`.php`或者`.phtml`的文件, 通过直接在浏览器中访问上传文件执行任意代码, 从而获得对服务器的完全控制。请安全地玩你的服务器。 |
256 | 255 | |
257 | ||
256 | ||
258 | 257 | ## 跨站脚本 ( XSS ) |
259 | 258 | |
260 | 259 | > 深入阅读: [关于防止 PHP 中的跨站点脚本漏洞,您需要了解的所有内容](https://paragonie.com/blog/2015/06/preventing-xss-vulnerabilities-in-php-everything-you-need-know) | … | … |
271 | 270 | 4. 如果你的需求是允许你使用 Markdown 替代 HTML,[不要使用 HTML ](https://paragonie.com/blog/2015/06/preventing-xss-vulnerabilities-in-php-everything-you-need-know#avoid-html) 。 |
272 | 271 | 5. 如果你需要允许一些 HTML 并且没有使用模板引擎(请参见#1),那么就使用[ HTML 净化器](http://htmlpurifier.org/)。 HTML 净化器不适用于将内容转义成 HTML 标签属性的场景。 |
273 | 272 | 6. 对于用户提供的 URLs ,你应该[只允许使用 `http:` 和 `https:` 协议模式](https://paragonie.com/blog/2015/06/preventing-xss-vulnerabilities-in-php-everything-you-need-know#url-escaping);不要用 `javascript:` 。此外,使用 URL 编码方式编码用户的所有输入。 |
274 | ||
273 | ||
275 | 274 | ## 跨站请求伪造 (CSRF) |
276 | 275 | |
277 | 276 | 跨站请求伪造是一种混乱的代理攻击,通过这种攻击,你可以利用用户的权限,欺骗用户的浏览器执行恶意的 HTTP 请求来实现攻击者的目的。 | … | … |
300 | 299 | |
301 | 300 | > 译者注:截至2016年4月,Chrome 51、Opera 39、火狐60已实现了cookie 的 Same-Site 属性。 |
302 | 301 | |
303 | ||
302 | ||
304 | 303 | |
305 | 304 | ## XML 攻击 (XML外部实体注入, XPath 注入) |
306 | 305 | … | … |
362 | 361 | |
363 | 362 | 这里我们采用白名单的策略比黑名单策略安全。 |
364 | 363 | |
365 | ||
364 | ||
366 | 365 | ## 反序列化和PHP对象注入 |
367 | 366 | |
368 | 367 | > 深度阅读: [php反序列化安全的实现](https://paragonie.com/blog/2016/04/securely-implementing-de-serialization-in-php) | … | … |
387 | 386 | - 如果你需要对传输的签名进行十六进制或 Base64 位编码,也可以使用分离的签名 API 。 |
388 | 387 | - 如果你无法确保 参数中JSON 字符串的安全性,请严格限制单个IP访问频率以避免高频的攻击。(laravel 框架可以采用Throttle配置) |
389 | 388 | |
390 | ||
389 | ||
391 | 390 | |
392 | 391 | ## 密码哈希 |
393 | 392 | … | … |
412 | 411 | |
413 | 412 | 如果您以前没有在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). |
414 | 413 | |
415 | ||
414 | ||
416 | 415 | ## 一般用途的加密 |
417 | 416 | |
418 | 417 | 这是我们之前已经详细讨论过的话题: | … | … |
429 | 428 | |
430 | 429 | 如果你直接使用密码/模式, [请参考关于加密最佳实践的简要指南](https://gist.github.com/atoponce/07d8d4c833873be2f68c34f9afc5a78a)。 |
431 | 430 | |
432 | ||
431 | ||
433 | 432 | |
434 | 433 | ## 随机数 |
435 | 434 | … | … |
450 | 449 | $int = $rng->getInt(1, 100); |
451 | 450 | ``` |
452 | 451 | |
453 | ||
452 | ||
454 | 453 | |
455 | 454 | ## 服务器端 HTTPS 请求 |
456 | 455 | … | … |
492 | 491 | |
493 | 492 | 这将保护你免受Web服务器与你集成的任何第三方API之间的中间人攻击(man-in-the-middle attacks)。 |
494 | 493 | |
495 | ||
494 | ||
496 | 495 | |
497 | 496 | #### 我们*真的* 需要 Certainty 库吗? |
498 | 497 | … | … |
504 | 503 | |
505 | 504 | Certainty 库通过使 CACert 捆绑包位于最新的和可预测的位置来消除这种激励。Certainty 库还为许多希望[运行他们自己内部 CA](https://github.com/paragonie/certainty/blob/master/docs/features/LocalCACertBuilder.md) 的企业提供了许多工具。 |
506 | 505 | |
507 | ||
506 | ||
508 | 507 | |
509 | 508 | #### 谁来禁用证书验证? |
510 | 509 | |
511 | 510 | 常见的内容管理系统(WordPress,Magento等)的插件/扩展开发人员可以做到! 这是我们在生态系统层面试图解决的一个巨大问题。 它不是孤立于任何特定的CMS,你会发现插件等。 因为所有这些都是不安全的。 |
512 | 511 | |
513 | 如果您正在使用这样的CMS,请在插件中搜索`CURLOPT_SSL_VERIFYPEER`和`CURLOPT_SSL_VERIFYHOST` ,您可能会发现有几个将这些值设置为`FALSE`。 | |
512 | 如果您正在使用这样的CMS,请在插件中搜索`CURLOPT_SSL_VERIFYPEER`和`CURLOPT_SSL_VERIFYHOST` ,您可能会发现有几个将这些值设置为`FALSE`。 | |
514 | 513 | |
515 | 514 | ## 应该避免的事情 |
516 | 515 | … | … |
540 | 539 | |
541 | 540 | 如果你专注于使用 PKCS#1 v1.5 进行填补,无论你集成了什么,几乎都会很容易被 [机器人](https://robotattack.org/)攻击,所以将其作为一个允许明文公开和伪造签名的漏洞报告给合适的供应商(或US-CERT)。 |
542 | 541 | |
543 | ||
542 | ||
544 | 543 | ## 专业使用案例 |
545 | 544 | |
546 | 545 | 既然你已经掌握了在2018年及以后构建安全PHP应用程序的基础知识,现在让我们来看一些更专业的使用案例。 | … | … |
560 | 559 | |
561 | 560 | 在这个过程中的任何步骤,你都可以根据你的实际情况来做调整。 |
562 | 561 | |
563 | ||
562 | ||
564 | 563 | ## 无边信道的基于令牌的身份认证 |
565 | 564 | |
566 | 565 | > 深入阅读: [拆分令牌:无边信道的基于令牌的身份验证协议](https://paragonie.com/blog/2017/02/split-tokens-token-based-authentication-protocols-without-side-channels) | … | … |
575 | 574 | - 您可以选择将后半部分的哈希存储在数据库中,而不是它本身。这对于只使用一次的令牌是有意义的,如用在“密码重置”或“在这台计算机上记住我”等地方的令牌。 |
576 | 575 | |
577 | 576 | 这样即使你可能会因为定时泄漏被别人窃取到一半的令牌,剩下的一半也需要暴力破解才能成功。 |
578 | ||
577 | ||
579 | 578 | |
580 | 579 | ## 开发安全的API |
581 | 580 | … | … |
599 | 598 | |
600 | 599 | Paragon Initiative Enterprises 已经在其许多产品(包括许多开源软件项目)中使用了 Sapient,并将继续将软件项目添加到 Sapient 产品组合中。 |
601 | 600 | |
602 | ||
601 | ||
603 | 602 | ## 使用Chronicle记录安全事件日志 |
604 | 603 | |
605 | 604 | > 深入阅读: [Chronicle 会让你质疑区块链技术的需求](https://paragonie.com/blog/2017/07/chronicle-will-make-you-question-need-for-blockchain-technology) | … | … |
614 | 613 | |
615 | 614 | 要将数据发布到本地 Chronicle,您可以使用任何[与 Sapient 兼容的 API](https://paragonie.com/blog/2017/12/2018-guide-building-secure-php-software#secure-api-sapient),最简单的方式是 [Quill](https://github.com/paragonie/quill)。 |
616 | 615 | |
617 | ||
616 | ||
618 | 617 | ## 作者的一些话 |
619 | 618 | |
620 | 619 | 很多聪明的读者应该注意到了我们参考了很多我们自己的工作内容(包括了一些之前发的博文和我们的开源项目),但其实我们并**不仅仅**参考我们自己的内容。 | … | … |
627 | 626 | |
628 | 627 | 然而,我们也不可能成为所有方面的先驱,所以我们会尽可能地与一些符合公共利益而不是自私自利的专家们公事。这就是为什么在浏览器安全性的部分引用了 [Scott Helme](https://scotthelme.co.uk/) 和他的公司的工作内容,他们在使开发人员能够接触和理解这些新的安全特性方面做了大量的工作。 |
629 | 628 | |
630 | 本篇指南也不是完全详尽的。写不安全的代码的方法几乎和写安全的代码的方法一样多。安全不仅仅是目的,更是一种心态。有了上面所写的内容,以及接下来的资源,我们希望这能帮助全世界的开发人员从今天起用 PHP 编写安全的软件。 | |
629 | 本篇指南也不是完全详尽的。写不安全的代码的方法几乎和写安全的代码的方法一样多。安全不仅仅是目的,更是一种心态。有了上面所写的内容,以及接下来的资源,我们希望这能帮助全世界的开发人员从今天起用 PHP 编写安全的软件。 | |
631 | 630 | ## 资源 |
632 | 631 | |
633 | 632 | 如果您已经阅读的本篇的所有内容,并且还想了解更多的知识,那么您可能会对我们[针对学习应用程序安全而制定的阅读列表](https://github.com/paragonie/awesome-appsec)感兴趣。 |