Защита базы данных Oracle от инъекций SQL - PullRequest
0 голосов
/ 20 января 2020

Я на Symfony и не знаю, как защитить мою базу данных от sql инъекции. Если у вас есть идея, я буду благодарен.

Моя функция с sql:

  public function getResult($$value)
    {
        $sql = "SELECT SOMETHING FROM SOMETHING smt
                WHERE smt.THING = '".$value."'";

        return $this->egee->executeQuery($sql);

    }

А вот моя функция executeQuery:

   public function executeQuery($sql) {

        $entityManager = $this->em->getConnection('xxx');

        $stmt = $entityManager->prepare($sql);

        $stmt->execute();

       return $stmt->fetch();
    }

I Уже попробуйте с BindParam, но он не работает с Oracle. С BindParam у меня есть такой ответ:

Ошибка 503: служба недоступна Сервер временно не может обслуживать ваш запрос из-за простоя обслуживания или проблем с емкостью. Пожалуйста, попробуйте позже.

Ответы [ 2 ]

2 голосов
/ 20 января 2020

Вот как вы это делаете ... с любой базой данных: параметризованных запросов.

Ваша строка SQL теперь становится:

SELECT SOMETHING FROM SOMETHING smt WHERE smt.THING = ?

Обратите внимание на ? (которого нет в кавычках ... это не односимвольная буквенная строка) Это указывает на параметр запроса.

Теперь каждый при выполнении запроса вы предоставляете array(), содержащий каждое из значений параметров, которые вы хотите заменить, в порядке слева направо. Каждый раз, когда запрос выполняется (без повторной подготовки), можно использовать разные значения , поскольку эти значения не являются «частью» запроса: они являются входными данными.

Независимо от того, что содержит значение параметра, ядро ​​СУБД никогда не увидит его как что-либо, кроме цифры c или строки значения . Он никогда не будет расценивать это как "часть SQL". Таким образом, SQL -инъекция становится невозможной.

Кроме того, значение [двоичное] используется напрямую, а не декодируется из строки символов. Так, скажем, если вы хотите использовать кавычки как часть вашего строкового параметра-значения, вы не «закодируете» их с помощью обратной косой черты. (Если вы укажете \", то «1045 *, за которым следует« обратная коса »sh, за которой следует кавычка», будет вполне приемлемым двухсимвольным значением.)

Вот хорошая запись: https://www.w3schools.com/php/php_mysql_prepared_statements.asp

0 голосов
/ 20 января 2020

В документации по Doctrine ORM в руководстве Symfony приведен пример использования параметра запроса:

https://symfony.com/doc/current/doctrine.html#querying -с- sql

$sql = '
    SELECT * FROM product p
    WHERE p.price > :price
    ORDER BY p.price ASC
    ';
$stmt = $conn->prepare($sql);
$stmt->execute(['price' => $price]);

Вам не нужно использовать BindParam. Просто передайте массив ha sh в execute(), где ключи ha sh являются именованными заполнителями параметров запроса, которые вы указали в запросе SQL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...