0

Здравствуйте! Есть такой код:

$val = $_GET['val'];
$val_query = $pdo->Query("SELECT * from users WHERE name = '" . $val. "'")->fetch(PDO::FETCH_BOTH);

И таких обращений много по скрипту. Как защититься в этом случае от sql инъекций? Можно ли написать какую-то функцию, которая будет полностью защищать от этой уязвимости данный код?

Я знаю, что есть pdo::prepare и такое подобное, и зачем оно нужно. Мне попался движек, в котором все запросы идут через Query. Поэтому и спрашиваю, есть ли возможность устранить sql инъекции не прибегая к редактированию всего движка, изменяя pdo::Query на pdo::prepare и так далее?

FJack
  • 1
  • 2
    Вы используете PDO и даже не удосужились прочитать документацию к нему. – Alexander Semikashev Mar 07 '18 at 18:44
  • https://ru.stackoverflow.com/questions/393450/%d0%93%d1%80%d0%b0%d0%bc%d0%be%d1%82%d0%bd%d0%b0%d1%8f-%d0%b7%d0%b0%d1%89%d0%b8%d1%82%d0%b0-%d0%be%d1%82-sql-injection?rq=1 – u_mulder Mar 07 '18 at 18:45
  • 1
    Возможный дубликат вопроса: Грамотная защита от SQL-Injection – entithat Mar 07 '18 at 18:46
  • Я знаю, что есть pdo::prepare и такое подобное, и зачем оно нужно. Мне попался движек, в котором все запросы идут через Query. Поэтому и спрашиваю, есть ли возможность устранить sql инъекции не прибегая к редактированию всего движка, не изменяя pdo::Query на pdo::prepare и так далее? – FJack Mar 07 '18 at 19:04
  • Если в движке подставляют таким образом переменные, то его необходимо выбросить, потому что всех ситуаций, без глубокого изучения его кода вы не предусмотрите. А если глубоко изучать его код, то проще переписать начисто – Mike Mar 07 '18 at 23:04
  • Если же он все таки нужен, то я бы предложил написать класс наследник pdo и в нем бы реализовал функцию Query2, которая бы первым аргументом принимала текст запроса, вторым - массив значений и выполняла бы prepare и execute с массивом. После этого пробежаться по коду и все Query заменить на Query2('... where name=?',[$val])->fetch.... И код даже более читаемый выйдет. И такую замену можно по большому коду за несколько часов произвести – Mike Mar 07 '18 at 23:16

0 Answers0