这类谬论看多了也就觉得见怪不怪。
※ 引述《red0whale (red whale)》之铭言:
: 昨天我的数据库老师说
: PHP是一个漏洞相当多、非常不安全
其实不否认在某些“历史共业”的情况下,PHP 常常会写出有漏洞的程式码。
例如我在之前文章提过的一个例子:
<?php
if (!session_id()) session_start();
extract($_GET);
var_dump($_SESSION);
如果 /?_SESSION['login']=true 会发生什么事?
虽然在近几年 Modern PHP 越来越普及的今天,已经罕有人会写出这种程式(如果有,请打爆他)
但是维护多年以前的程式,确实还是有机会看到各种漏洞满天飞。
: 而且是外面业界鲜少在使用的后端程式语言
: 他还说PHP只是给学生在用的程式语言
: 而他建议我们做网页后端最好使用像C#或Java之类的需要编译过后才能使用的“编译语言
: ”
: 而非使用像PHP这种“直译语言”
: 原因之一在于PHP是以明文储存程式码
: 在外面业界如果使用明文丢后端程式语言给其他人,早就造成安全上的漏洞了
其实我不知道为什么你的老师要用 C# 或 Java 这种有 bytecode 语言来举例。
因为在没有特别处理的情况下,C# IR 跟 Java bytecode 几乎可以很完美地转回原始程式码。
注:以前某国立大学的学生资讯系统前端就是用 Java Applet 写的,把东西载下来逆向甚至看得到他们 DB 的密码。
注2:曾经有一款用 Unity 写的手游,因为把 AES Key 直接写在程式码里,所以载下来之后拖进 ILSpy 就可以直接写出脱机外挂
所以一般在发布 APP 时还是会注意要做混淆,或是直接依赖 LLVM 这种编译器会优化到他妈都不认得也是一种方法。
注:其实混淆、加壳之类的都有机会可以解,不过如果破解成本远高于获益的话就很少有人会干这种苦差事。
注2:我 FB 上的好友看到这篇文章之后就呛说“当我们逆向狗吃素的?”
然后其实 PHP 也是可以编译的,你可以在发布前把 PHP Code 编成 Zend VM Opcode,一般人是不会这么干就是了。
或是也可以依赖 inocube 之类的 obfuscator 把 PHP 混到一个很恐怖的境界。
注:PHP 的混淆如果没有 extension 支持的话,基本上就只是演演戏罢了。
: 所以非常不建议使用PHP作为网页后端的程式语言
: 另外,他也提及
: 用PHP连后端数据库是非常危险的
: 原因也是因为直译式的关系
: 如果用PHP的话,数据库的帐号密码之类的也很容易外露造成资安漏洞
一般来说,“正常的”PHP 应用程式不应该把 secret data(如 DB Password)写在程式里,而是应该利用 environment variable 去处理
或是一些比较先进的会用 Docker secret、k8s secret 之类的 Tools。
: 所以他说在外面业界几乎很少有人会使用像PHP这种直译式程式语言作为网页后端的程式
: 语言
: 也非常不建议使用PHP,因为它本身的漏洞实在太多,且相当不安全
: 不晓得各位有什么看法?
: 对于PHP不安全、漏洞多有没有什么能够补救的办法?
: 顺带一提,我也有想过,像Facebook、Wikipedia 之类的大网站不也是使用PHP作为其中
: 一种程式语言吗?
这边点一个问题,很多 PHP 的拥护者在 PHP 受到批评的时候常常会拿 Facebook 出来嘴。
不过还是要认清一个现实:Facebook 虽然草创初期是使用 PHP,但是他们也嫌它的效能不足所以开发 Hack 与 HHVM。
目前 Facebook 还停留在“我们一般所认知的”PHP 的程式码应该是少之又少的(应该都已经重构并用其它语言取而代之)
大部份 PHP 应用程式的漏洞都是起因于工程师观念不足,还有许许多多错误的范例在网络上流窜的结果。
当然,PHP 语言本身允许这样的错误存在也是责无旁贷,如果它的设计可以再严谨一些,有很多问题都可以不存在。
我非常推荐任何一个 PHP 工程师都应该要读过 Modern PHP(中译:现代 PHP),它为一个充满历史的语言提供未来的可能性。
然后遵守 PSR 标准,可以让 PHP 的生涯过得更加愉快(不过后面的标准越出越杂,Laravel 的作者就有在推特上批评过)
顺带一提,其实 PHP 核心也是存在漏洞的,例如 PHP 7.4.5 就才刚刚修复了 CVE-2020-7067。
不过就这语言核心漏洞来说,就算是很现代的 Golang 或 Rust 也存在这样的问题。
然而,正因为这些东西是 Open Source,在大多数人的检视及贡献下才能够发掘这些问题,这也是为什么“OpenSource 不等于 有安全风险”的理由。
: 虽然昨天也有跟老师讨论到这个
: 不过老师是跟我说,那些大网站使用PHP也只是用来做显示前端的一些部分
事实上也还真的有不少公司把 PHP 当前端,然后去接后端 API(Java)的。
不过我思考了 Hen 久,到底为什么不用更方便、社群更庞大的 React, Vue 或 Angular 呢…
虽然 PHP 之父自己说过,他创造这个语言只是想当 template engine,但随着时代的不同它早就拥有不同的定位。
我常常说“每个语言都有它的特性存在,使用不同的语言只是为了不同的场景需求罢了。”
PHP 可不可以写 GUI?可以啊,PHP-GTK,只是没有人会这么干。
PHP 可不可以实现 Websocket Server?可以啊,Swoole PHP 跟 React PHP,只是也不是主流用法。
对我来说,PHP 就是一个快速开发 Prototype 并且写超来很快很爽的语言,但在追求高效能或是一些特定场景(例如 IoT 之类的)我不会优先选择它
: 真正使用后端像是连数据库之类的根本不可能使用PHP来写
: 他说如果他们用PHP做后端的话是相当不安全、风险很高的作法
: 然而,我已经使用PHP做为后端语言已经好几年了
: 听到老师这番话要我全部改学另一种语言而且又要把先前已写好好几万行的PHP码全部都
: 改写
: 我认为这是个相当相当浩大的工程
: 希望各位可以给些建议和看法
: 谢谢
以我个人的角度,你可以先思考这“几万行”程式是不是都适合 PHP 实现?
如果都适合,那就放手去做。在大多数的情况,“有成果”远比“没有成果”来得有说服力。
举例来说,你今天把你的程式通通砍掉,然后改成 Rust 好了。
但是这份作业你要花比原本多 20 倍的时间才能完成,而且可能因为不熟悉而无法完成。
你的老师会因为你用了 Rust 好棒棒,给你比有成果的 PHP 程式更高分吗?
如果会的话,那就放手去改吧。
当然,如果站在学习的角度,其实也没什么不可。
你可以尝试着把某些比较常使用到的功能改成其它语言实现:
1. 假设原本有 Polling, Long-Polling 实作的聊天室就改成 Websocket + Nodejs 实作看看
2. 假设原本有需要“排程”的功能,可以导入 Message Queue 去改善看看
3. 假设原本有需要影像处理,可以试试看 golang 实作会不会效能更高
终归一句话,程式语言是个工具,端看你怎么应用它。