我经常在 PHP 代码中看到一个处理所有传入数据的函数。例如这个
function postCliner($data) {
$data = trim($data);
$data = strip_tags($data);
$data = stripslashes($data);
return $data;
}
这段代码是什么以及它有什么作用?你能逐行评论一下吗?
我经常在 PHP 代码中看到一个处理所有传入数据的函数。例如这个
function postCliner($data) {
$data = trim($data);
$data = strip_tags($data);
$data = stripslashes($data);
return $data;
}
这段代码是什么以及它有什么作用?你能逐行评论一下吗?
这是一套毫无意义的功能,自古以来腿就在长。
PHP 语言有很多缺点,但最大的缺点是它的简单性。让任何学生在两天内掌握基本语法并立即开始编写网站。因此,大多数 PHP 编写者并不了解编程和 Web 开发的基本原理。而这种文盲总是成为无数迷信和误解的根源。
这个函数正是这种误解的一个例子,不幸的是,这种误解已经进入了一堆低质量的来源,从臭名昭著的 w3schools 网站开始,到书籍结束,特别是罗宾·尼克松或威灵/汤普森夫妇的书籍(当然,在任何情况下都不推荐阅读这些书,即使它们可以从互联网上免费下载。阅读达克特,或者最坏的情况下,阅读科特罗夫)
这种情况下的误解是,传入的数据可以在输入时以某种方式“中和”,然后不再担心安全性。这种想法是极其愚蠢的。原因很简单,因为所有的危险都是非常不同的,保护应该始终有针对性,针对每种具体情况。而且不要把所有事情都做一次。
通常,在这样的清洁过程中,会以不同的组合发现以下功能
哇,这是一个动物园,对吧?
想象一下,一个人24小时都穿着防弹背心、救生圈、灭火器和安全套。毕竟,所有这些东西都可以保护!如果大多数时候不需要它们怎么办?别理他们!正是这种逻辑导致了此类功能的创建。
但事实上,没有人这样做。每个人都根据需要使用它。当他去火场时,他会带上灭火器。他穿上防弹背心继续进攻。等等。
在编程时必须遵守同样的原则:每项安全措施都必须在其适当的位置应用,不是提前应用,而是在使用时应用。如果我们将数据传输到 SQL 查询,我们会通过占位符来完成。如果我们以 html 形式输出它,那么我们使用 htmlspecialchars 对其进行转义。如果我们将其输出到 JavaScript,那么我们使用 json_encode 对其进行转义。如果我们输出到 shell,那么我们使用 escapeshellarg 进行转义。等等。
因此,可以制定两个简单的保护规则:
如果您想以某种方式处理传入的数据,那么这种处理称为验证。它包括检查数据并在数据不合适时向客户端发出错误。