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

Форум MySQL

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

 

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

вид форума:
Линейный форум (новые сообщения вниз) Структурный форум

тема: Проверка на безопасность данных

Сообщения:  [1-10]   [11-15] 

 
 автор: cheops   (20.12.2011 в 14:03)   письмо автору
 
   для: Slo_Nik   (20.12.2011 в 12:30)
 

Близкий к тому, что предложен выше (если требования действительно такие жесткие и есть необходимость использовать регулярные выражения), за минусом функции htmlspecialchars(), которую бы использовал при выводе информации из базы данных. В противном случае при редактировании данных можно получить множество проблем (причем практически неразрешимых).
Такую избыточную конструкцию
    if(get_magic_quotes_gpc() == '1') { 
        $str = stripslashes(trim($str)); 
    } else    { 
        $str = trim($str); 
    } 
    $str = mysql_real_escape_string($str);
обычно не используют, когда режутся слеши и тут же вставляются. В этом теряется преимущество позднего экранирования. Когда слеши режут, то экранирование производят уже не посредственно около SQL-запроса (всех данных без разбора откуда они поступили). Если экранирование переносится к получению внешних данных, то применяют конструкцию вида
if(!get_magic_quotes_gpc()) { 
    $str = mysql_real_escape_string($str);
}

  Ответить  
 
 автор: Slo_Nik   (20.12.2011 в 12:30)   письмо автору
 
   для: cheops   (19.12.2011 в 17:30)
 

а какой бы вариант решения задачи Вы предложили бы?

  Ответить  
 
 автор: tima2010   (19.12.2011 в 21:17)   письмо автору
 
   для: cheops   (19.12.2011 в 21:12)
 

Большое спасибо! обезопасился :)

  Ответить  
 
 автор: cheops   (19.12.2011 в 21:12)   письмо автору
 
   для: tima2010   (19.12.2011 в 21:06)
 

>При таком условии возвращает OK
Да, я ошибся положением символа ^ (отладить не было возможности), вместо
[^а-яA-Яa-zA-Z0-9\s-]+$

нужно писать
^[а-яA-Яa-zA-Z0-9\s-]+$

  Ответить  
 
 автор: tima2010   (19.12.2011 в 21:06)   письмо автору
 
   для: cheops   (19.12.2011 в 16:19)
 

cheops:
Наоборот, если все эти символы существуют от начала строки до конца и никаких других нет - 
это то, что нам нужно, двигаемся вперед. А вот если регулярное выражение возвращает false - 
значит среди них затесался какой-то символ им не удовлетворяющий, нужно превратить false в 
true при помощи отрицания, чтобы сообщить об ошибке.


По счет РВ, я все понимаю, но с какого то перепугу происходит следующие...

При таком условии возвращает OK

<?php
$test 
"аАaZ0- Ё@"// присутствует недопустимый символ @
if(!preg_match ("/[^а-яA-Яa-zA-Z0-9\s-]+$/"$test)) { // с !
    
echo "Не соответствует шаблону.";
} else {
    echo 
"ok";
}
?>


При таком условии возвращает Не соответствует шаблону...


<?php
$test 
"аАaZ0- Ё@"// присутствует недопустимый символ @
if(preg_match ("/[^а-яA-Яa-zA-Z0-9\s-]+$/"$test)) { // без !
    
echo "Не соответствует шаблону.";
} else {
    echo 
"ok";
}
?>


Но опираясь на Ваши слова выше должно же быть наоборот? Почему так?

  Ответить  
 
 автор: cheops   (19.12.2011 в 17:30)   письмо автору
 
   для: tima2010   (19.12.2011 в 16:54)
 

Все хорошо.

PS Единственное, что я бы не стал использовать htmlspecialchars() до вставки в базу данных, только при выводе на страницу. Если будете использовать эту функцию до вставки - рано или поздно пожалеете об этом решении. Ну и скажем так, ваш код не будет считать профессиональным. Любой профессионал читая его, будет морщиться и думать примерно так: ну вот человек не был уверен в своих силах в области безопасности и перестраховывался, а мне теперь что с его кодом делать (теперь придется иметь в виду целый дополнительный класс ошибок)?

  Ответить  
 
 автор: cheops   (19.12.2011 в 17:26)   письмо автору
 
   для: tima2010   (19.12.2011 в 16:24)
 

Вы знаете, лучше не использовать ==1, просто пишите get_magic_quotes_gpc() - так универсальнее будет. Нет, все что у вас написано, все правильно, это чисто стилистическая правка - короче и более универсально, в том числе и для будущих изменений в языке.

  Ответить  
 
 автор: tima2010   (19.12.2011 в 16:54)   письмо автору
 
   для: cheops   (19.12.2011 в 16:19)
 

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


<?php
function security_Check($str=''$number=''$type='') {

    if(
get_magic_quotes_gpc() == '1') {
        
$str stripslashes(trim($str));
    } else    {
        
$str trim($str);
    }
    
$str mysql_real_escape_string($str);
    
$stt htmlspecialchars($stt);

    if(isset(
$number)) {
        
$strlen strlen($str);
        if (
$strlen $number) {
            
$error .= "Слишком много букв.";
        }
    }
    
    if(!isset(
$str)) {
        
$error .= "Поле не должно быть пустым<br>";
    }
    
    if(
$type == 'text') {
        if(!
preg_match ("/[^а-яA-Яa-zA-Z0-9\s-]+$/"$str) {
            
$error .= "Использовать можно только: Русские буквы, Английские буквы, Цифры, Пробел и Тере.<br>";
        }
    }
    
    if(
$type == 'email') {
        if(!
preg_match ("/^[-0-9a-z_\.]+@[-0-9a-z_^\.]+\.[-0-9a-z_]{2,6}$/i"$str) {
            
$error .= "Неверный E-Mail<br>";
        }
    }
    
    if(
$type == 'number') {
        if(!
preg_match ("/[^0-9-+\s()]+$/"$str) {
            
$error .= "Использовать можно только: Цифры, Пробел, Тере и Скобки.<br>";
        }
    }
    return 
$error;
}
?>

  Ответить  
 
 автор: tima2010   (19.12.2011 в 16:24)   письмо автору
 
   для: cheops   (19.12.2011 в 16:19)
 

Спасибо! А по счет кавычек, так буде лучше и безопаснее?

<?php
if(get_magic_quotes_gpc()==1)
{
$text=stripslashes(trim($_POST["text"]));
}
else
{
$text=trim($_POST["text"]);
}

$text=mysql_real_escape_string($text);
?>

  Ответить  
 
 автор: cheops   (19.12.2011 в 16:19)   письмо автору
 
   для: tima2010   (19.12.2011 в 15:18)
 

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

  Ответить  

Сообщения:  [1-10]   [11-15] 

Форум разработан IT-студией SoftTime
Rambler's Top100
вверх

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