Php 带$的ORM规则获取变量和安全性?

Php 带$的ORM规则获取变量和安全性?,php,symfony,doctrine-orm,Php,Symfony,Doctrine Orm,我使用一些脚本来对字段进行排序 真的没什么特别的,但我想知道。我有以下代码: $data = $this->getDoctrine()->getRepository('MyBundle:Data')->findBy(array("id" => $id), array($_GET["sort"] => $_GET["direction"])); 如果我在“sort”中给出一个不存在的字段,则只会出现一个错误。 但这会被用来进行SQL注入吗 如果是这样,那么最好的避免

我使用一些脚本来对字段进行排序

真的没什么特别的,但我想知道。我有以下代码:

$data = $this->getDoctrine()->getRepository('MyBundle:Data')->findBy(array("id" => $id), array($_GET["sort"] => $_GET["direction"]));
如果我在
“sort”
中给出一个不存在的字段,则只会出现一个错误。 但这会被用来进行SQL注入吗


如果是这样,那么最好的避免方法是什么?

在请求中使用
$\u GET
之前,您需要清洁
$

例如,如果
$\u GET[“sort”]
仅为数字且介于0和50之间,请在该请求中使用之前检查它是否确实是介于0和50之间的数字


请不要在您的请求中使用未经保护的
$\u GET
,这很危险。

因为$\u GET[“sort”]将用于传入一个字段进行排序,每个人都可以填写他们想要排序的任何内容。。。我不认为会造成多大的伤害,因为教义会过滤掉不好的东西,但我仍然不建议这样做。尝试至少清理$\u GET[“sort”]和$\u GET[“direction”]字段。

是的,它将被分解为sql注入。因此,我更喜欢在传递任何用户输入sql时,在sql中使用之前应该对其进行转义


在您的查询原则中,就是处理所有这些事情,这样您就不必担心sql注入。

这是安全的,您可以这样做,但为什么不使用
请求
对象呢?为了更安全,您可以使用或更好的PHP函数来替换任何错误的符号或使用parameterBug方法。此外,我还建议对catch使用
try catch()
,并处理任何异常。例如:

try {
    $data = $this->getDoctrine()->getRepository('MyBundle:Data')->findBy(
        array("id" => $id),
        array($this->get('request')->query->getAlnum("sort") => $this->get('request')->query->get("direction"))
    );
} catch(\Exception $e) {
    // do something if exception occured
}

将我的评论转换为答案

请求抽象的使用 然而,您的代码有一个问题。您正在使用superglobal
$\u GET

Symfony通过
Symfony\Component\HttpFoundation\Request
对象提供输入的强大抽象。用它

// Acme/FooBundle/Controller/FooController

use Symfony\Component\HttpFoundation\Request;

public function fooAction(Request $request) // First way
{
    $request = $this->getRequest();   // Another way
    $request = $this->get('request'); // Another way
}
要获取“sort”参数,只需执行以下操作

$request->query->get('sort');
把所有的东西都列在白名单上 由于用户输入可能应该排序为
,因此您应该验证它可以在哪些字段上排序

$allowed = array('col1', 'col2', 'col3');
$sort    = $request->query->get('sort');

if (!in_array($input, $allowed)) {
    $sort = $allowed[0];
}

$by = $request->query->get('direction');

if (!in_array($by, array('asc', 'desc')) {
    $by = 'asc';
}

$emanager->findBy(array('id' => $request->query->get('id'), $sort => $by));

我们可以直接将用户数据输入ID,doctrine将使用参数化查询进行过滤。但是,
排序
列现在是安全的,因为即使该列不存在,它也会退回到另一个您知道存在的列(因为您将其列入了白名单)

但是,不要使用
$\u GET
。Symfony通过
Request->query
提供查询的抽象。其次,您应该将可以排序的字段列为白名单,并检查列表中是否有给定的输入。如果没有,则返回默认值是的,但是抽象本身并没有清理任何东西,它只是给了我一个我可以使用的类(顺便说一句,我所做的是,但我使用我自己的类)。这与问题无关,那又怎样?因为好的实践不能立即解决问题,所以您选择不使用它们?不,根本不需要让代码更复杂来回答我的问题。事实上,如果我使用另一个类来过滤GET变量中的恶意代码,我可能会得到错误的答案,因为每个人都认为我的代码是安全的,因为我选择了抽象类。如果我想建立一个表,我不需要知道如何构建一个房子。所以你建议通过等待条令的例外来处理糟糕的用户输入?如果给出了错误的
排序
字段,则条令将生成一个异常:
按不存在字段排序ASC
将触发一个错误。我不知道他这样做的目的是什么,因为他没有提到它。但是,由于het显式地插入了一个变量作为字段名进行排序,我想这是他所必需的,因此如果有一个字段异常,他应该捕获不存在的字段异常……简单明了的答案-非常感谢:)你是对的,我想捕获异常-只是想知道如果我不将所有内容都列为白名单(这在我的应用程序中会有点问题),是否可能存在安全风险。对于字段,不是转义,而是筛选!