Автор Тема: Достатъчно сигурен ли е този php скрипт ?  (Прочетена 5182 пъти)

toti84

  • Напреднали
  • *****
  • Публикации: 115
    • Профил
Здравейте колеги,
Ще ви помоля за мемието ви дали тези два скрипта са достатъчно сигурни за което за предазначени.
Доста търсих из интернета, а и книги четох и това успях да измисля:

Целта ми в пръвия е да почисти входните данни от пост масива, като в същото верме, като и
прекрати автоматизирани ботове.

Код
GeSHi (PHP):
  1. <?php
  2. if ((isset($_POST['add']) && $_POST['add']=='1'))
  3.      { if (isset($_SESSION['token']) && $_POST['token'] == $_SESSION['token'])
  4.            {
  5.   $token_age = time() - $_SESSION['token_time'];
  6. if (($token_age < $maxTime) && ($token_age > $minTime ))
  7. {
  8. $valueTitle=array('Господин','Госпожа','Госпожица');text
  9. if(in_array($_POST['title'],$valueTitle)) {$clean['title']=$_POST['title'];}
  10. if(preg_match("/^[a-zA-ZА]{3,32}$/",$_POST['name'])) {$clean['name']=$_POST['name'];}
  11. }}}
  12. echo clean ['name'];
  13.  
  14.  
  15. $token = md5(uniqid(rand(), true)); $_SESSION['token'] = $token;
  16. $_SESSION['token_timestamp'] = time();
  17. echo "<form action='' method='POST'>
  18. Username: <input type='text' name='username' />    
  19. <input type='hidden' value=".$token." name='token' />  
  20. <input type='submit' />                            
  21. </form>";      
  22.  
  23. ?>
  24.  
  25.  
  26.  


А врория от тях е създаването на сесия, за оторизиран потребител, до ограничена част на сайта.

Код
GeSHi (PHP):
  1. //someWhereInSite.php
  2. <?php
  3. if (isset($_SESSION['HTTP_USER_AGENT']))
  4. {                                      
  5.    if ($_SESSION['HTTP_USER_AGENT'] != md5($_SERVER['HTTP_USER_AGENT']))
  6.    {                                                                    
  7. echo "<form action='login_check.php' method='POST'>                      
  8. Username: <input type='text' name='username' />                          
  9. <input type='submit' />                                                  
  10. </form>";                                                                
  11.  
  12.        /* Prompt for password */
  13.        exit;                    
  14.    }                            
  15.  
  16.    else
  17.        { echo "Inside security zone";
  18.  
  19.        exit;                                          
  20.        }                                              
  21.  
  22. }
  23.  
  24. if (!isset($_SESSION['HTTP_USER_AGENT']))
  25. {                                        
  26. echo "<form action='login_check.php' method='POST'>
  27. Username: <input type='text' name='username' />    
  28. <input type='submit' />                            
  29. </form>";                                          
  30. }                                                  
  31. ?>
  32.  
  33.  
  34.  
  35.  
  36. //login_check.php
  37. <?php
  38. if (!isset($_SESSION['HTTP_USER_AGENT']) && isset($_POST['username']))
  39. {                                                                    
  40.  if ($_POST['username'] == 1)                                        
  41.    {                                                                
  42.    $_SESSION['HTTP_USER_AGENT'] = md5($_SERVER['HTTP_USER_AGENT']);  
  43.    echo "Inside security zone<br>";
  44.    }                                                                            
  45.  else {echo "greshna parola";exit;}  
  46.  
  47. ?>
  48.  

Моля дайте ваште мнения, изказвания и препръки.


Активен

go_fire

  • Global Moderator
  • Напреднали
  • *****
  • Публикации: 8792
  • Distribution: Дебиан Сид
  • Window Manager: ROX-Desktop / е17
  • кашик с гранатомет в танково поделение
    • Профил
    • WWW
Поне аз не забелязах частта, където обработваш постъпилата от формата информация и я вкарваш в базата. Тук са повечето пробойни. И там са задължителни неща от сорта на trim и addslashes.


Иначе кода поне на мен (но аз съм ламер) ми изглежда добре.
Активен

В $por4e2 e истината  ;)

***

Aко даваха стипендия за най-глупави, щях да съм човека с най-много Mини Kупъри

***

Reborn since 1998 || 15.09.2007 totally М$ free && conscience clear

toti84

  • Напреднали
  • *****
  • Публикации: 115
    • Профил
В горния случай според мен променливата $clean['name'] е достатъчно почистена да се вкара директно в базата данни. Или греша ?
Активен

go_fire

  • Global Moderator
  • Напреднали
  • *****
  • Публикации: 8792
  • Distribution: Дебиан Сид
  • Window Manager: ROX-Desktop / е17
  • кашик с гранатомет в танково поделение
    • Профил
    • WWW
както казах, не съм баш най-напред, но на доста места, съветват в конфига да имаш нещо такова:

Код
GeSHi (PHP):
  1. {
  2. $_GET = array_map('mysql_real_escape_string', $_GET);
  3. $_POST = array_map('mysql_real_escape_string', $_POST);
  4. $_COOKIE = array_map('mysql_real_escape_string', $_COOKIE);
  5. }
  6. else
  7. {
  8. $_GET = array_map('stripslashes', $_GET);
  9. $_POST = array_map('stripslashes', $_POST);
  10. $_COOKIE = array_map('stripslashes', $_COOKIE);
  11. $_GET = array_map('mysql_real_escape_string', $_GET);
  12. $_POST = array_map('mysql_real_escape_string', $_POST);
  13. $_COOKIE = array_map('mysql_real_escape_string', $_COOKIE);
  14. }

Хора дето много уважавам и знаят много, съветват всичко, което влиза в базата да минава през трим и адслашес, за да няма инжекции. Първото по-скоро за удобство на потребителя, отколкото за сигурност, но усигурява и такава. И съответно, когато излиза да има пък htmlspecialchars, за да не чупи html и js. Има и други функции, но тези са най-препоръчвани.
Активен

В $por4e2 e истината  ;)

***

Aко даваха стипендия за най-глупави, щях да съм човека с най-много Mини Kупъри

***

Reborn since 1998 || 15.09.2007 totally М$ free && conscience clear

VladSun

  • Moderator
  • Напреднали
  • *****
  • Публикации: 2166
    • Профил
За ДБ данни, *трябва* се ползва *sql_real_escape_string() - няма нужда от add/stripslashes и други такива.

Trim не би трябвало да се прилага върху входните данни.

Този скрипт, който "чисти" всички входни данни може да доведе до неприятности - прилага се mysql_real_escape_string върху данни, които може изобщо да не са предназначени за ДБ.

Активен

KISS Principle ( Keep-It-Short-and-Simple )
http://openfmi.net/projects/flattc/
Има 10 вида хора на този свят - разбиращи двоичния код и тези, които не го разбират :P

lkr

  • Напреднали
  • *****
  • Публикации: 81
    • Профил
Най-добре е да ползваш mysqli или ADO.
Активен

d0ni

  • Напреднали
  • *****
  • Публикации: 183
    • Профил
Автоматичното escape-ването на всички входни данни е грешен подход. Аз предпочитам да се грижа за всяка стойност, която влиза в базата, да е от правилния тип и ако е нужно - да е escape-ната.

Ако не мислите така си пуснете magic_quotes и си карайте както знаете :-)
Активен

Warstomp

  • Напреднали
  • *****
  • Публикации: 344
  • Distribution: Debian, Ubuntu
    • Профил
Сигурен бях че ще се появят поне 5 различни мнения :)
Всеки си го прави както си знае.
Активен

VladSun

  • Moderator
  • Напреднали
  • *****
  • Публикации: 2166
    • Профил
Сигурен бях че ще се появят поне 5 различни мнения :)
Всеки си го прави както си знае.

А не трябва да е така... Има си утвърдени от опита правила, които трябва да се спазват.

Автоматичното escape-ването на всички входни данни е грешен подход. Аз предпочитам да се грижа за всяка стойност, която влиза в базата, да е от правилния тип и ако е нужно - да е escape-ната.

Ако не мислите така си пуснете magic_quotes и си карайте както знаете :-)

Съгласен, magic_quotes внесе повече проблеми отколкото успя да реши :)
Активен

KISS Principle ( Keep-It-Short-and-Simple )
http://openfmi.net/projects/flattc/
Има 10 вида хора на този свят - разбиращи двоичния код и тези, които не го разбират :P

VladSun

  • Moderator
  • Напреднали
  • *****
  • Публикации: 2166
    • Профил
@toti84
Мисля си, че ако искаш повече помощ, ще трябва да форматираш кода в някой от по-общовъзприетите стандарти... За мен е абсолютно нечетлив - напр. идея си нямам къде свършват if блоковете.
« Последна редакция: Mar 15, 2010, 15:06 от VladSun »
Активен

KISS Principle ( Keep-It-Short-and-Simple )
http://openfmi.net/projects/flattc/
Има 10 вида хора на този свят - разбиращи двоичния код и тези, които не го разбират :P

VladSun

  • Moderator
  • Напреднали
  • *****
  • Публикации: 2166
    • Профил
Re: Достатъчно сигурен ли е този php скрипт ?
« Отговор #10 -: Mar 15, 2010, 12:46 »
В горния случай според мен променливата $clean['name'] е достатъчно почистена да се вкара директно в базата данни. Или греша ?

Това което си направил е по-скоро проверка за "валидност въз основа на бизнес правила" - *ти* искаш *твоят* сайт да приема потребителски имена съставени само от a-z, A-Z символи. Но това няма нищо общо с ДБ. Утре можеш да решиш, че имена като Brent O'Connor са ОК за *твоя* сайт и да промениш regexp-a. Но това не би трябвало да влияе на съхраняването на данните и тяхното представяне.

Всеки път когато променяш дестинацията на данните, трябва да правиш подходящо трансформиране на данните.

Примери:

1) приемаш HTTP данни от потребителя, правиш им проверка за "бизнес" валидност, и искаш да ги съхраниш в ДБ - новата дестинация е ДБ контекстът. То тогава транформираш данните чрез инструмент предложен от дестинацията като "сигурен" - напр. *sql_real_escape_string.

2) приемаш HTTP данни от потребителя, правиш им проверка за "бизнес" валидност, и искаш да ги представиш обратно на потребителя - новата дестинация е HTML контекстът. То тогава транформираш данните чрез инструмент предложен от дестинацията като "сигурен" - напр. htmlspecialchars или strip_tags.

3) искаш да ги представиш на потребителя  данни прочетени от ДБ - новата дестинация е HTML контекстът. То тогава транформираш данните чрез инструмент предложен от дестинацията като "сигурен" - напр. htmlspecialchars или strip_tags.
Активен

KISS Principle ( Keep-It-Short-and-Simple )
http://openfmi.net/projects/flattc/
Има 10 вида хора на този свят - разбиращи двоичния код и тези, които не го разбират :P

toti84

  • Напреднали
  • *****
  • Публикации: 115
    • Профил
Re: Достатъчно сигурен ли е този php скрипт ?
« Отговор #11 -: Mar 15, 2010, 15:26 »
OK.
Благодаря на всички за интереса към моя въпрос.
Напълно разбрах смисъла на вашите отговори. т.е. аз правя доста строго филтриране на входящите
данни от потребителите.

Вие нищо не казахте за втория ми скрипт за отвариянето на сигурна сесия. Сигурен ли е ?
Активен

VladSun

  • Moderator
  • Напреднали
  • *****
  • Публикации: 2166
    • Профил
Re: Достатъчно сигурен ли е този php скрипт ?
« Отговор #12 -: Mar 15, 2010, 15:46 »
session_regenerate_id() се прави само при смяна на правата чрез успешна автентификация (т.е. успешен логин). Само тогава може да се осъществи session fixation атака. Във всички останали случаи, session_regenerate_id() е източник на проблеми при използването на Back бутона на браузера.
Активен

KISS Principle ( Keep-It-Short-and-Simple )
http://openfmi.net/projects/flattc/
Има 10 вида хора на този свят - разбиращи двоичния код и тези, които не го разбират :P

VladSun

  • Moderator
  • Напреднали
  • *****
  • Публикации: 2166
    • Профил
Re: Достатъчно сигурен ли е този php скрипт ?
« Отговор #13 -: Mar 15, 2010, 15:47 »
аз правя доста строго филтриране на входящите
данни от потребителите.

Ти или използваната от теб framework. Във всички случаи трябва да е прозрачно (и централизирано) за твоите скриптове-клиенти - примерно чрез използването на DAL в случая на ДБ. Така е сигурно, че всички данни подавани към ДБ ще бъдат правилно "изчистени".
Активен

KISS Principle ( Keep-It-Short-and-Simple )
http://openfmi.net/projects/flattc/
Има 10 вида хора на този свят - разбиращи двоичния код и тези, които не го разбират :P

go_fire

  • Global Moderator
  • Напреднали
  • *****
  • Публикации: 8792
  • Distribution: Дебиан Сид
  • Window Manager: ROX-Desktop / е17
  • кашик с гранатомет в танково поделение
    • Профил
    • WWW
Re: Достатъчно сигурен ли е този php скрипт ?
« Отговор #14 -: Mar 15, 2010, 18:57 »
@offfffff

Владсън, винаги съм знаел, че си голям, ама с тая тема направо ми скри топката, като Миньор на Левски ;)

Привети!
Активен

В $por4e2 e истината  ;)

***

Aко даваха стипендия за най-глупави, щях да съм човека с най-много Mини Kупъри

***

Reborn since 1998 || 15.09.2007 totally М$ free && conscience clear