Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Общие вопросы > sql injection ms sql


Автор: Bulat 29.4.2014, 15:00
Есть сиквел к mssql

Код

SELECT 
  q1.NUM_GR AS num_gr, 
  q1.NAME_GR AS name_gr 
FROM ( 
  SELECT 
    TOP 10 
    q.NUM_GR, 
    q.NAME_GR 
  FROM ( 
    SELECT 
      TOP 20 
      telescop.dbo.GROUP_NAMES.NUM_GR, 
      telescop.dbo.GROUP_NAMES.NAME_GR 
    FROM telescop.dbo.GROUP_NAMES 
    ORDER BY telescop.dbo.GROUP_NAMES.NUM_GR 
  ) q ORDER BY q.NUM_GR DESC 
) q1 ORDER BY q1.NUM_GR


работает хорошо:

Код

my $sth = $dbh -> prepare(
  "SELECT 
    q1.NUM_GR AS num_gr, 
    q1.NAME_GR AS name_gr 
  FROM ( 
    SELECT 
      TOP 10 
      q.NUM_GR, 
      q.NAME_GR 
    FROM ( 
      SELECT 
        TOP 20 
        telescop.dbo.GROUP_NAMES.NUM_GR, 
        telescop.dbo.GROUP_NAMES.NAME_GR 
      FROM telescop.dbo.GROUP_NAMES 
      ORDER BY telescop.dbo.GROUP_NAMES.NUM_GR 
    ) q 
    ORDER BY q.NUM_GR DESC 
  ) q1 
  ORDER BY q1.NUM_GR"
);

$sth -> execute();


работает плохо:

Код

my $sth = $dbh -> prepare(
  "SELECT 
    q1.NUM_GR AS num_gr, 
    q1.NAME_GR AS name_gr 
  FROM ( 
    SELECT 
      TOP ? 
      q.NUM_GR, 
      q.NAME_GR 
    FROM ( 
      SELECT 
        TOP 20 
        telescop.dbo.GROUP_NAMES.NUM_GR, 
        telescop.dbo.GROUP_NAMES.NAME_GR 
      FROM telescop.dbo.GROUP_NAMES 
      ORDER BY telescop.dbo.GROUP_NAMES.NUM_GR 
    ) q 
    ORDER BY q.NUM_GR DESC 
  ) q1 
  ORDER BY q1.NUM_GR"
);

$sth -> execute(10);


пишет
Код

DBD::Sybase::st execute failed: Server message number=170 severity=15 state=1 line=6 server=TELESCOP-PRCE1 text=Line 6: Incorrect syntax near '10'. 
Server message number=156 severity=15 state=1 line=15 server=TELESCOP-PRCE1 text=Incorrect syntax near the keyword 'ORDER'


c mssql работаю в первый раз.  smile 

Автор: BuKTaP 26.6.2014, 15:09
Код

TOP ?

из-за этого.
если хотите получить не первые 10 записей, а все - то пишите 
Код

TOP (100) PERCENT
 или вообще уберите

Этот ответ добавлен с нового Винграда - http://ru.vingrad.com/sql-injection-ms-sql-id535f94f7ae2015bb698b4567#findElement_E7045_53ac0d83ae20150113347ca7_0

Автор: Bulat 27.6.2014, 14:43
BuKTaP, спс, данная проблема решена, и немного по-другому. А суть TOP ? как раз в том и заключается, чтобы защититься от sql-инъекций

Автор: infarch 27.6.2014, 17:01
Плейсхолдеры используются только для передачи значений в поля. В качестве имен таблиц и полей, других параметров запроса, они не работают. Тут вам надо просто проверить или значение для TOP числовое, например $top = int($top);

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)