每个优秀的PHP开发人员都应该能够回答的问题

每个优秀的PHP开发人员都应该能够回答的问题,php,Php,我经历了这个问题,对这个问题的内容和方法印象深刻,所以本着同样的精神,我向PHP开发者提出这个问题 你认为一个好的PHP程序员应该回答哪些问题? 编辑:我将这个问题标记为社区维基,因为它不是特定于用户的,它旨在为整个编程社区服务 期待一些令人惊讶的回应 注意:请按照评论中的建议回答问题,这样人们也可以学习有关该语言的新知识 转义用户输入的最佳实践是什么?(这个问题似乎经常出现)为什么不应该直接输出用户输入 直接从GET打印数据等内容可能会导致漏洞。 这就是为什么您应该始终首先通过htmlspec

我经历了这个问题,对这个问题的内容和方法印象深刻,所以本着同样的精神,我向PHP开发者提出这个问题

你认为一个好的PHP程序员应该回答哪些问题?

编辑:我将这个问题标记为社区维基,因为它不是特定于用户的,它旨在为整个编程社区服务

期待一些令人惊讶的回应


注意:请按照评论中的建议回答问题,这样人们也可以学习有关该语言的新知识

转义用户输入的最佳实践是什么?(这个问题似乎经常出现)

为什么不应该直接输出用户输入

直接从GET打印数据等内容可能会导致漏洞。
这就是为什么您应该始终首先通过htmlspecialchars()从客户端发送输入。

我认为一个好问题是:HTTP是如何工作的?在PHP开发中,使用
GET
POST
数据以及其他HTTP通信是固有的。了解HTTP如何在更广泛的环境中工作以及PHP如何实现这一点有很大的帮助。

PHP是跨浏览器的吗


(我知道,这会让很多人发笑,但这是php论坛上问得最多的问题!)

绝对是安全问题

(这篇文章的答案很简单,当然保护php web应用程序要复杂得多)

  • 如何处理SQL注入
mysql\u real\u escape\u string()作为mysql的开始。然后尝试学习PDO,以利用准备好的语句和跨数据库供应商的可移植性

  • 如何处理CSRF(跨站点请求伪造)
在每个重要请求上添加一个令牌,以确保重要操作的安全(用户必须在发送重要请求之前查看表单)

  • 如何处理反射和存储的XSS(跨站点脚本)
htmlentities()是一个好的开始

  • XXX注入的变体:LDAP注入、XPath注入等
您需要知道XXX使用的“词汇”是什么,然后扣除您需要消毒和/或“检查和拒绝”的内容

  • 什么是合理的功能列表
解释PHP代码(可能包含在远程文件中)或在系统上执行命令的函数。简短且不完整的列表可能是:exec()、passthru()、system()、popen()、eval()、preg_replace()

  • 如何处理文件包含危险
  • 什么是路径横截
  • 与文件上载相关的风险有哪些
需要仔细检查打开文件或远程资源时使用的参数

  • 如何强制您的PHP配置的配置(即,您知道PHP.ini的用途吗)
这将是很长的,所以我跳过了答案,请阅读PHP手册

  • 关于过滤用户数据:消毒与检查和拒绝之间有什么区别

第一种方法将条目转换为不那么敌对的内容。第二个检查条目是否正确,如果不正确,则拒绝它。

当使用php开发站点时,它完全是垃圾,它是:

a) PHPs断层


b) 程序员错误

无可否认,我从其他地方偷了这个问题(不记得我在哪里读过了),但觉得很有趣:

Q:什么是
T\PAAMAYIM\u NEKUDOTAYIM

A:其作用域解析运算符(双冒号)

一个有经验的PHP程序员马上就知道它的意思。 经验较少(不是希伯来语)的开发人员可能希望阅读

但现在更严重的问题是:


Q:此警告的原因是什么:“警告:无法修改标题信息-标题已发送”,防止此警告的最佳做法是什么?
A:原因:发送了正文数据,导致也发送了标题。
预防:在输出任何正文数据之前,请确保首先执行特定于标题的代码。确保没有意外地发送空白或任何其他字符


Q:此查询有什么问题:
“从id=$\u POST['id']的表中选择*”

A:1。它是SQL注入的漏洞。切勿在查询中直接使用用户输入。先消毒。最好使用准备好的语句()2。不要选择所有列(*),而是指定每一列。这主要是为了防止查询占用内存,例如在将来某个时候添加BLOB列


Q:这个if语句有什么问题:
if(!strpos(!haystack,$needle).

A:
strpos
返回它第一次找到$pinder的索引位置,可能是
0
。由于
0
也会解析为
false
所以解决方案是使用严格的比较:
if(false!==strpos($haystack,$pinder).


Q:编写此if语句的首选方式是什么,为什么?
if(5==$someVar)
if($someVar==5)

A:前者,因为它可以防止在忘记使用2个等号(
$someVar=5
)时意外将5分配给$someVar,并且会导致错误,后者不会


Q:给定以下代码:

function doSomething( &$arg )
{
    $return = $arg;
    $arg += 1;
    return $return;
}

$a = 3;
$b = doSomething( $a );
class SomeClass
{
    protected $_someMember;

    public function __construct()
    {
        $this->_someMember = 1;
    }

    public static function getSomethingStatic()
    {
        return $this->_someMember * 5; // here's the catch
    }
}
…函数调用后,
$a
$b
的值是多少?为什么?
A:
$A
4
$b
3
。前者是因为$arg是通过引用传递的,后者是因为函数的返回值
$a = 2;
function foo()
{
    $a = 3;
}
foo();
echo $a;
$a = 012;
echo $a / 4;