Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Защита $_GET параметра
 
 автор: brys   (12.02.2008 в 18:51)   письмо автору
 
 

Достаточно такого кода для защиты?


<?php
if(empty($_GET['id']) or isset($_GET['id'])) {
        
$id $_GET['id'];
        }
        if(!
preg_match("|^[\d]+$|"$id)) {
        exit(
"<p>Не правильный формат запроса! Проверте URL!</p>");
        }
?>

   
 
 автор: mihdan   (12.02.2008 в 18:55)   письмо автору
 
   для: brys   (12.02.2008 в 18:51)
 


<?
if(empty($_GET['id']) or isset($_GET['id'])) {  ....
?>



<?
$id 
= ((isset($_GET['id'])) && ($_GET['id'] == (int)$_GET['id'])) ? (int)$_GET['id'] : null;
if (
$id === null) echo 'error';
?>

[поправлено модератором]

   
 
 автор: Петр   (12.02.2008 в 20:41)   письмо автору
 
   для: brys   (12.02.2008 в 18:51)
 

тогда уж
if(!empty($_GET['id']) or isset($_GET['id'])) { ... }

   
 
 автор: bronenos   (12.02.2008 в 21:08)   письмо автору
 
   для: Петр   (12.02.2008 в 20:41)
 

if (!isset($_GET['id']) || !is_int($_GET['id'])) error();

   
 
 автор: Unkind   (12.02.2008 в 22:46)   письмо автору
 
   для: bronenos   (12.02.2008 в 21:08)
 

bronenos, ну сколько можно?

   
 
 автор: bronenos   (13.02.2008 в 00:01)   письмо автору
 
   для: Unkind   (12.02.2008 в 22:46)
 

Тих-тих-тих O:-)
Я не сразу увидел тему пососедству, где было про ИНТ, и не думал что ИНТ подведет (казалось бы, для таких ситуация как раз), приношу извинения)

   
 
 автор: Freddie_X   (13.02.2008 в 00:37)   письмо автору
 
   для: bronenos   (13.02.2008 в 00:01)
 

Как думаете, достаточно ли передаваемые параметры проверять только на допустимые символы через регулярку?

   
 
 автор: kasmanaft   (13.02.2008 в 13:05)   письмо автору
 
   для: Freddie_X   (13.02.2008 в 00:37)
 

Какие такие допустимые символы?
Логин, email, наверное, стоит проверить перед помещением в БД, id привести к int.... В пароле, например, нет недопустимых символов...

Посмотрите задачу 21 из соответствующего раздела..

   
 
 автор: Unkind   (13.02.2008 в 00:38)   письмо автору
 
   для: bronenos   (13.02.2008 в 00:01)
 

> Я не сразу увидел тему пососедству
Я подобной темы тоже не видел. Просто я же Вам сравнительно недавно уже говорил про это.

   
 
 автор: DEM   (13.02.2008 в 13:09)   письмо автору
 
   для: brys   (12.02.2008 в 18:51)
 

Я лично всегда все переменные проверяю так:
Если число, то $var = intval($_GET['var']);
Если засунуть в MySQL, то $var = mysql_escape_string($_GET['var']);
Если вывести на экран, то $var = htmlspecialchars($_GET['var'], ENT_QUOTES);
Ну а остальное по потребностям...

   
 
 автор: Freddie_X   (13.02.2008 в 13:17)   письмо автору
 
   для: DEM   (13.02.2008 в 13:09)
 

А если кто-то захочет сделать sql-инъекцию, одного mysql_escape_string будет недостаточно, т.к. запрос может быть без кавычек. Не пойму я что-то....

   
 
 автор: kasmanaft   (13.02.2008 в 13:30)   письмо автору
 
   для: Freddie_X   (13.02.2008 в 13:17)
 

Какой запрос? Все строки в запросах нужно помещать в кавычки, без этого и работать не будет. А что там от пользователя пришло - если оно экранировано, без разницы.
SELECT * FROM `table` WHERE text = '$text'.

Для защиты от sql-инъекции mysql_escape_string() достаточно (только надо проверить magic_quotes - если они включены, mysql_escape_string() уже применять не нужно. get_magic_quotes_gpc() ).

   
 
 автор: Freddie_X   (13.02.2008 в 13:45)   письмо автору
 
   для: kasmanaft   (13.02.2008 в 13:30)
 

Ну, если переданные запросу данные - строковые, то с этим понятно!
А если Числовые данные? Их же не надо выделять кавычками. Получается, что можно сделать скл-инъекцию даже с mysql_escape_string()?
К примеру:
<?php
mysql_query
("SELECT * FROM table WHERE id = $id");
// если в $id вписать, к примеру,
// 1; UPDATE table SET id = 666 WHERE id = 1
// то можно изменить любые числовые данные в БД
?>

Разъясните, пожалуйста!

   
 
 автор: Thrasher   (13.02.2008 в 14:33)   письмо автору
 
   для: Freddie_X   (13.02.2008 в 13:45)
 

Когда ожидается прием числовых данных, то:
$id = (int)$_GET['id'];

и уязвимости нет.

   
 
 автор: Freddie_X   (13.02.2008 в 15:24)   письмо автору
 
   для: Thrasher   (13.02.2008 в 14:33)
 

Аааа, всё понял! Спасибо за разъяснение :)

   
 
 автор: bronenos   (13.02.2008 в 15:53)   письмо автору
 
   для: Freddie_X   (13.02.2008 в 15:24)
 

Я и числа в кавычки беру, все пашет у меня везде

   
 
 автор: Lstasss   (14.02.2008 в 02:35)   письмо автору
 
   для: bronenos   (13.02.2008 в 15:53)
 

а мне вот нравится работать с stmt в mysqli

$stmt = $mysqli->stmt_init();
$stmt->bind_param('ssi',$string_var_1, $string_var_2, $integer);
$stmt->execute();

зачем на уровне PHP делать то, что можно переложить на БД, притом что она это умеет делать лучше?

   
 
 автор: а-я   (14.02.2008 в 04:26)   письмо автору
 
   для: brys   (12.02.2008 в 18:51)
 

а что вы думаете на счет функции ctype_digit()
можно ли на нее положиться?

<?
 
if(ctype_digit($_GET['id']))
  echo 
'ГУД!!!';
 else
  echo 
'Не есть гуд!';
?>

   
 
 автор: moonfox   (14.02.2008 в 05:28)   письмо автору
 
   для: а-я   (14.02.2008 в 04:26)
 

а какая разница что будет добавленно в where id
текст или цифра - это всеравно строковое значение...
или нет?
в любом случае там нужна будет кавычка для обрыва запроса и подстановки union...
или?

   
 
 автор: GeorgeIV   (14.02.2008 в 10:15)   письмо автору
 
   для: moonfox   (14.02.2008 в 05:28)
 

Просто возьмите за правило никогда не подсовывать в запрос то, что пришло с инета. пропустите через какую то промежуточную функццию, и все лишние хвосты отвалятся или вызовут ошибку.

   
 
 автор: mihdan   (14.02.2008 в 10:55)   письмо автору
 
   для: moonfox   (14.02.2008 в 05:28)
 

Зачем мне в запросе строка, когда поле типа integer?

   
 
 автор: moonfox   (14.02.2008 в 13:14)   письмо автору
 
   для: mihdan   (14.02.2008 в 10:55)
 

вам не нужно
а взломщику всеравно что у вас int или char
вроде)

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования