PHP有多安全?

31

我对PHP编程有些新,知道如果你没有对你的PHP代码进行过滤,恶意用户可以通过黑客手段攻击你的网站。我想知道的是,他们是否需要一个数据输入框(如文件提交或用户名/密码输入字段)。

类似"include (header.php)"这样的命令是否也需要某种安全性,或者它们天生就是安全的?


你可能想要将标题更具体一些。我认为标题对于你所提出的问题来说太模糊或太笼统了。 - codingbear
8个回答

58

与其他编程语言一样,PHP代码的安全性取决于程序员编写的安全性。

同样像其他语言一样,个人(甚至是常见的)安全风险太多且细节繁多,无法在StackOverflow答案中进行详细说明。

找一本覆盖安全PHP编码的书籍。


31
很多人认为 PHP 是一种不安全的编程语言,因为很多使用 PHP 编写的代码都存在安全隐患。这是因为 PHP 具有相对较低的学习门槛,导致一些不安全的程序员能够编写出一些不安全的代码。此外,PHP 的应用范围比较广泛,这也让不安全的程序员更有可能选择使用它来开发项目,进而增加了其存在安全隐患的统计概率。 - snicker
8
我会尽量简明扼要地翻译以下内容,以便易于理解: 对于一本关于PHP安全的书籍,我推荐克里斯·希夫莱特(Chris Shiflett)的《Essential PHP Security》(http://oreilly.com/catalog/9780596006563/)。它非常全面,展示了遵循良好、安全的编码实践并不是一件困难的事情。 - HorusKol

22

不要相信用户。

include "a/literal/file.php";

非常安全

include $someFile;

这意味着你需要考虑如何设置$someFile。如果您使用任何来自用户的数据来设置$someFile的值,最好对其进行净化。


5
如果您需要根据用户输入选择一个包含文件,请始终创建一个包含您知道是有效且安全的列表,然后将用户输入与该列表中的值进行匹配 - 并且仅使用安全列表值本身作为包含文件。 - Ilari Kajaste
我在这里撰写了一份完整的关于这些安全问题的指南:https://www.cloudways.com/blog/php-security/ - Shahroze Nawaz

9
引用2006年Rsnake在sla.ckers.org上的一篇文章:
“我认为有趣的是,Stefan Esser退出了PHP事件响应团队。并不是要在论坛上引发宗教战争,但有趣的是,PHP安全响应团队的创始人对PHP缺乏安全性感到厌倦,并因此辞职。他的网站目前已经挂掉了(流量泛滥?):[blog.php-security.org] 。这里是缓存的剪贴板:”
“周六,2006年12月9日 昨晚,我终于从PHP安全响应团队退休了,这最初是我的想法几年前。 原因很多,但最重要的一个是,我意识到从内部改善PHP的安全性的任何尝试都是徒劳的。PHP小组会跳进你的船里,只要你试图将PHP的安全问题归咎于用户,但一旦你批评PHP本身的安全性,你就成为不受欢迎的人。我停止计算我因披露PHP中的安全漏洞或开发Suhosin而被称为不道德的叛徒的次数。 对于普通的PHP用户来说,这意味着我将不再隐瞒我的建议中对安全漏洞的缓慢响应时间。这也意味着我的一些建议将不提供可用的修补程序,因为PHP安全响应团队拒绝修复它们数月之久。这还意味着会有更多关于PHP安全漏洞的建议。”
“好吧,虽然听起来很可怕,但我真的很兴奋终于能够了解PHP安全性的“真实情况”。我一直对它有点谨慎,看看Stefan有什么要说的将是有趣的。”
来源:http://sla.ckers.org/forum/read.php?2,3976 这很好地介绍了Hardened PHP项目、Suhosin http://www.hardened-php.net/suhosin/和Esser的PHP漏洞月计划http://www.php-security.org/

6

PHP本身是安全的,但默认情况下需要程序员具备相关技能来保证安全性。与.NET不同,.NET默认情况下更倾向于通过安全性来帮助开发者。

包含文件是安全的,只需注意路径是否被动态生成即可。

以下代码是无害的(取决于myfile.php中的代码)。

include("mypath/myfile.php");

这在很久以前可能是真的,但现在我们在PHP中有安全的MVC框架,它们默认情况下有助于安全 http://framework.zend.com/。 - Jaskaran Singh

5

关于数据输入框,我们需要注意SQL注入攻击、溢出、不良字符等问题。首先可以查看filter_var()mysql_real_escape_string()pg_escape_string()等函数。


1
并且在将数据回显到网页时使用 htmlentities - DisgruntledGoat

4

我同意这里所有人的观点 - PHP 本身并不比其他语言更安全或更危险。

但你应该深入了解你的 php.ini 文件。你可能需要学习所有指令。这是很多人在早期犯错误的地方。


1

你的问题比较宽泛和笼统,但是针对你提出的一个具体点:

include (header.php);

相对而言是比较安全的,但是

include ($header);

根据$header的赋值方式以及是否经过消毒,这可能是一个危险的安全漏洞。


前者的更大优势是您不必再寻找 - 它在本地安全。(作为一个需要对相当大的代码库进行审计的人,这对我来说非常重要。) - Tom Hawtin - tackline

1
具体来说,PHP作为一种语言非常安全。对于语言本身,建议您使用最新的稳定版本以保持语言安全性。PHP维护人员是创建和修复错误的人;)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接