1

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

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

记住两件事:

  1. 避免在任何地方多次验证变量..

  2. 拥有多个来源,不仅如此$_GET,而且从不同的文件多次调用这种方法。

一些代码:

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

// ...or here, before using it?
$result = do_something($_GET['some_string']);
4

4 回答 4

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 等,这也是出于结构/维护原因。但是没有规则说“您必须在第一次开始或使用时验证您的变量”

于 2013-06-10T15:57:07.733 回答
0

当您在入门级收到时,请在第一点进行验证,$_GET以便您在后期也能确定以下代码 -

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

如果您在这里验证 -

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

那么您可能会错过验证,并且它会在代码中打开一个漏洞,因为这次验证仅适用于该方法。

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

于 2013-06-10T15:50:36.407 回答
0

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

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

Array_map 对数组的每个值应用一个函数,在我们的例子中,它是将mysqli_real_escape_string应用到数组$_GET

重要的:

请注意,这仅用于消毒而非验证

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

有关更多信息,请参阅此问题:消毒和验证

于 2013-06-10T15:51:26.853 回答
0

我对你的回答还不满意,我没有问如何验证,我确实问了在哪里做。

这是我自己的建议:

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

这样你就有了数据Sender,还有数据Reciever

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

想想看

于 2013-06-10T18:13:11.183 回答