【问题标题】:YII sanitize input by get parameterYII 通过获取参数清理输入
【发布时间】:2016-11-23 17:28:28
【问题描述】:



我在yii1工作。我想根据 id(主键)编辑记录,并将 id 以查询字符串的形式从一个页面传递到另一个页面。现在我想在收到 ID 的控制器上清理该 ID。
我使用filter_input(),但它无法工作。

public function actionEditStudentById()
{
    try
    {
        $id = filter_input(INPUT_GET, 'id', FILTER_SANITIZE_NUMBER_INT);
        echo $id;
        die();

        $id = $_GET['id'];
        $model = StudentDetail::getStudentById($id);

        if (!$model) throw new Exception;

        if(isset($_POST['StudentDetail']))
        {
            $model->attributes = $_POST['StudentDetail'];
            if($model->validate())
            {
                $model->save(FALSE);
                Yii::app()->user->setFlash('update', "Record updated successfully!");
                $this->redirect(['student/list']);
            }
        }
        $this->render('_form',array('model'=>$model));
    }
    catch(Exception $e)
    {
        echo 'Invalid user id: user not available';
    }
}

这里die()只是用来停止代码。就在die() 之前,id 始终为空。我希望 id 始终是一个数字,而不是 url 中允许的任何符号

【问题讨论】:

  • 你的getStudentById() 方法是什么样的?

标签: php validation yii


【解决方案1】:

嗨,你为什么不在你的 id 之前使用 int

将您的字符串显式转换为integer

 $id = (int)$_GET['id'];

【讨论】:

  • 耶!这也有效,谢谢!如果还有与此相关的其他问题,那我稍后再问您
  • @PalashGupta 如果确实如此,则将其标记为您的答案:)
【解决方案2】:

我今天在工作中一直在努力解决类似的问题,并认为我会添加我的发现。我正在更新一个使用 Yii 1.1 的应用程序,我试图检查一个标志,但 filter_input 总是失败。我最终将以下内容添加到程序中以尝试弄清楚发生了什么。

if(isset($_GET['m']))
{
    error_log("GET['m'] = " . var_export($_GET['m'], true));
}

$bFiltered = filter_input(INPUT_GET, 'm', FILTER_VALIDATE_BOOLEAN);
error_log('Filtered = ' . var_export($filtered, true));

错误日志的输出如下:

GET['m'] = 'true'
Filtered = NULL

根据filter_input的PHP手册条目,如果命名值不存在则返回null。

我无法确认这一点,但我认为 Yii 正在操纵 $_GET$_POST 全局变量,这破坏了 PHP 中过滤器函数使用的内部指针。您可以通过执行以下操作在不使用 Yii 的情况下复制问题:

$_GET['test'] = "true";
echo 'Raw value = ' . var_export($_GET['test'], true) . '<br>';

$bFiltered = filter_input(INPUT_GET, 'test', FILTER_VALIDATE_BOOLEAN);
echo 'Filtered value = ' . var_export($bFiltered, true) . '<br>';

这会产生以下输出:

Raw value = 'true'
Filtered value = NULL

一个潜在的解决方案是直接在 $_GET 变量上使用filter_var,这使您可以访问与filter_input 相同的功能,并且不会遇到与filter_input 相同的问题。有关详细信息,请参阅filter_var 的 PHP 手册条目。

使用上面的简单示例:

$_GET['test'] = "true";
echo 'Raw value = ' . var_export($_GET['test'], true) . '<br>';

$bFiltered = filter_var($_GET['test'], FILTER_VALIDATE_BOOLEAN);
echo 'Filtered value = ' . var_export($bFiltered, true) . '<br>';

产生以下输出:

Raw value = 'true'
Filtered value = true

这样做的缺点是您必须记住将其包装在 isset() 测试中,以防万一该值不可用。

例如:

if (isset($_GET['test']))
{
   $bFiltered = filter_var($_GET['test'],
                           FILTER_VALIDATE_BOOLEAN,
                           array('options' => array('default' => false)));
}
else
{
    $bFiltered = false;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-18
    • 2016-11-02
    相关资源
    最近更新 更多