Автор Тема: Защита от недоразумений с выбором из таблички  (Прочитано 4192 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн DDHR

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 28
  • +0/-0
  • 0
    • Просмотр профиля
    • http://hopper.ru
я собираюсь для прочтения подробностей новости сделать скрипт, который бы выводил по id колонку details, НО если я буду писать ссылку на скрипт, который их будит выводить, например:

... news/details.pl?id=id_новости


то в скрипте я не могу ведь делать:

$id=param(\'id\');
$sth = $dbh->prepare("SELECT * FROM news where id = $id")|| die "$DBI::errstr";
$sth->execute;

а ведь могут написать в URL что-то вроде:
DROP TABLE ...

и скрипт, не расчитыая такого поворота событий  будет делать, то что ему будут говорить злоумышленники
ведь может такое быть, если ДА, то как в моём примере этого избежать?

Оффлайн Макс

  • vir magni ingenii
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 3534
  • +0/-0
  • 2
    • Просмотр профиля
проверяй, чтобы там число было. Например так:
unless ($id =~ /^[0-9]+$/) {
   print "wrong news ID";
   exit;
}
First learn computer science and all the theory. Next develop a programming style. Then forget all that and just hack. ( George Carrette )

Оффлайн DDHR

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 28
  • +0/-0
  • 0
    • Просмотр профиля
    • http://hopper.ru
а если я например захочу выводить сведения профиля по логину, то там будит обращение вида:

?user=login

$user=param(\'user\');
$sth = $dbh->prepare("SELECT * FROM users where user = $user")|| die "$DBI::errstr";
$sth->execute;


как проверять тогда?

Оффлайн Chs

  • Perl программер
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 1108
  • +0/-0
  • 2
    • Просмотр профиля
    • http://chs.now.at/
perldoc DBI в части placeholders
2B OR NOT 2B = FF

Оффлайн DDHR

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 28
  • +0/-0
  • 0
    • Просмотр профиля
    • http://hopper.ru
А вы не скажете по подробнее? Я не понял где и что смотреть, а лучше если не трудно, то опишите ситуацию прямо здесь.

Спасибо за ранее.

Оффлайн Chs

  • Perl программер
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 1108
  • +0/-0
  • 2
    • Просмотр профиля
    • http://chs.now.at/
Англицким по бэкграунду же написано:

       Placeholders and Bind Values

       Some drivers support placeholders and bind values.  Placeholders, also
       called parameter markers, are used to indicate values in a database
       statement that will be supplied later, before the prepared statement is
       executed.  For example, an application might use the following to
       insert a row of data into the SALES table:

         INSERT INTO sales (product_code, qty, price) VALUES (?, ?, ?)

       or the following, to select the description for a product:

         SELECT description FROM products WHERE product_code = ?

       The "?" characters are the placeholders.  The association of actual
       values with placeholders is known as binding, and the values are
       referred to as bind values.

       When using placeholders with the SQL "LIKE" qualifier, you must remem-
       ber that the placeholder substitutes for the whole string.  So you
       should use ""... LIKE ? ..."" and include any wildcard characters in
       the value that you bind to the placeholder.

Соответственно никакие :DROP TABLE .... не пройдут.
2B OR NOT 2B = FF

Оффлайн DDHR

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 28
  • +0/-0
  • 0
    • Просмотр профиля
    • http://hopper.ru
Конечно Спасибо Вам, но я всё-таки и не понял как должен тогда выглядеть запрос к таблице? Я только на этой недели начал MySQL изучать...


?user=login

$user=param(\'user\');
$sth = $dbh->prepare("SELECT * FROM users where user = ?",$user)|| die "$DBI::errstr";
$sth->execute;


вот что по поводу LIKE:
... LIKE ...
Вернет TRUE (1) или FALSE (0)

???
Помогите запрос оформить правильно плз.

Оффлайн DDHR

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 28
  • +0/-0
  • 0
    • Просмотр профиля
    • http://hopper.ru
Всё, я понял!!!

Мне кажется, надо оформить так:

?user=login

$user=param(\'user\');
$sth = $dbh->prepare("SELECT * FROM users where user = ?")|| die "$DBI::errstr";
$sth->execute($user);

да/нет ?

Оффлайн commander

  • Developer
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 1298
  • +0/-0
  • 2
    • Просмотр профиля
    • http://www.webtips.ru
-----------------------------------------------------------------------------------------
$user=param(\'user\');
$sth = $dbh->prepare("SELECT * FROM users where user = ?")|| die "$DBI::errstr";
$sth->execute($user);
-----------------------------------------------------------------------------------------
And no religion too...

 

Sitemap 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28