在哪里验证变量(使其成为一个设计良好的模式)?

时间:2013-06-10 15:47:14

标签: php design-patterns design-principles

假设我有index.php个文件和一些$_GET个变量。在几百行代码之后,我调用一个方法,将变量作为参数。

我应该在所有内容之上验证变量,还是应该在我调用的类/方法中验证它们?

记住两件事:

  1. 避免多次验证变量,无处不在..

  2. 拥有多个来源,不仅是$_GET,而且还可以从不同的文件中多次调用此类方法。

  3. 部分代码:

    <?php
    function do_something($string) {
        // Validate $string here?
    }
    
    // ...or here, before using it?
    $result = do_something($_GET['some_string']);
    

4 个答案:

答案 0 :(得分:1)

这是一个没有标准解决方案的问题。 您可以自己编写一个帮助类(我推荐这个,因为这是一个具有较少维护和最佳灵活性的解决方案),它在index.php文件的第一个开头调用,作为某种类型的“合同”,如:

<?
require_once "validator.php";

$validator = new Validator();
$validated = $validator->validateGet($_GET);

// all the remaining site's php code goes here

?>

这个类可以返回你想要的任何内容,比如指示每个变量是否正常的布尔值,或者包含带有删除标签的值的数组等。

跨站点脚本和/或SQL注入的另一个障碍应该是准备语句:http://php.net/manual/de/pdo.prepared-statements.php 所有SQL查询也应包含在名为ProductDataAccessObject(ProductDAO)或ProductQuerier等的外部实用程序类中,这也是出于结构/维护原因。 但是没有规则说“你必须在开始或使用时验证你的变量”

答案 1 :(得分:0)

在入门级别收到$_GET时的第一点验证,以便您在以后的阶段确定以下代码 -

// Validate $_GET['some_string'] HERE
$result = do_something($_GET['some_string']);

如果您在此处验证 -

function do_something($string) {
    // Validate $string here?
}

然后有可能你错过了验证,它会在代码中打开一个循环漏洞,因为此次验证仅适用于该方法。

如果要为数据库设置一些值,最好仔细检查数据并使其免于代码注入。

答案 2 :(得分:0)

您可以在页面顶部使用一行验证每个变量

$_GET = array_map("mysqli_real_escape_string",$_GET);

Array_map对数组的每个值应用一个函数,在我们的例子中将 mysqli_real_escape_string 应用于数组 $ _ GET

重要:

请注意,这仅用于清理而非验证

您需要自己验证每个变量,例如,如果以整数形式发送什么,请确保使用 intval 来验证它

有关详细信息,请参阅此问题:Sanitization and Validation

答案 3 :(得分:0)

我对你的答案不满意,我没有问如何验证,我确实问过要做什么。

以下是我自己的建议:

我认为在PHP中进行程序编码的时间终于结束了(!!),我的index.php中没有任何逻辑,所有逻辑都进入控制器类。

因此,您有数据Sender和数据Reciever

作为Reciever (不仅在PHP中,它在realife中也很常见),我必须验证Sender发送的信息。 Reciever不信任任何人(例如,这在API中很重要)。因此,验证必须在您创建的方法内部,而不是在index.php文件的顶部或类外部。想象一下其他人使用你的方法,他是要验证参数,还是你的任务?我认为这取决于你,所以你(Reciever!)可以抛出Exceptions。 我还希望将我的数据($_GET$_POST,...)尽可能地保留在控制器之外。想象一下,您有一个方法需要第100行的验证数据,以及第200行需要原始数据的方法。现在,在5上,你将生改变为消毒。 =&GT;您必须保留两个变量$data$data_raw,这是不必要的开销。

想一想