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

Форум MySQL

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

 

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

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

тема: защита всего.
 
 автор: afdm   (19.01.2008 в 22:10)   письмо автору
 
 

Здравствуйте
прочитал тут вот эту статейку и задумался....
http://old.antichat.ru/sql/
был у меня такой запрос: (в одинарных кавычках)

  $query = mysql_query("SELECT pass FROM users WHERE name='".$_POST['Username']."'");

преобразовал в вот в такой вот:

  $query = mysql_query("SELECT pass FROM users WHERE name=\"".$_POST['Username']."\"");  

спасает?

или как-то вот так надо?

<?php

  
// преобразование ' в `
  
if (!get_magic_quotes_gpc()) {
          
$_POST['Username'] = mysql_escape_string($_POST['Username']);
          
$_POST['Password'] = mysql_escape_string($_POST['Password']);
  }

?>

   
 
 автор: cheops   (20.01.2008 в 01:19)   письмо автору
 
   для: afdm   (19.01.2008 в 22:10)
 

Для текстовых полей лучше использовать последний вариант.

   
 
 автор: а-я   (20.01.2008 в 01:50)   письмо автору
 
   для: afdm   (19.01.2008 в 22:10)
 


  if (!get_magic_quotes_gpc()) { 
          $_POST['Username'] = mysql_escape_string($_POST['Username']); 
          $_POST['Password'] = mysql_escape_string($_POST['Password']); 
  }


если я не ошибаюсь, тут вы обезопасите только данные,
пришедшие методом POST|GET|COOKIE

остальные же данные, например то же ЮЗЕР_АГЕНТ,
если записываете данные в БД, нужно по любому обработать...

   
 
 автор: Trianon   (20.01.2008 в 02:36)   письмо автору
 
   для: а-я   (20.01.2008 в 01:50)
 

Совершенно верно.
Вообще, get_magic_quotes имеет весьма и весьма слабое отношение к БД.

   
 
 автор: afdm   (20.01.2008 в 11:17)   письмо автору
 
   для: afdm   (19.01.2008 в 22:10)
 

значит всё-таки второй запрос лучше? или первый? или и то (get_magic_quotes_gpc), и то нужно???

   
 
 автор: Trianon   (20.01.2008 в 11:28)   письмо автору
 
   для: afdm   (20.01.2008 в 11:17)
 

if(get_magic_quotes_gpc() ) $_XXX['xxx'] = stripslashes($_XXX['xxx']); нужно применять при получении данных из входных параметров get post cookie request массивов.

$escaped_val = "'".mysql_escape_string($val)."'"; нужно при формировании литеральных констант в SQL запросе.

В общем случае эти данные и эти процессы никак не связаны между собой.
Например, USER_AGENT , упоминавшийся выше, берется совсем не из get post cookie, и для него первая фаза будет только мешать.

   
 
 автор: afdm   (20.01.2008 в 12:14)   письмо автору
 
   для: Trianon   (20.01.2008 в 11:28)
 

вот всё понял. пожалуй так и буду делать))) спасибо! теперь всё вроде понятно.

   
 
 автор: afdm   (20.01.2008 в 12:56)   письмо автору
 
   для: Trianon   (20.01.2008 в 11:28)
 

укажите пожалуйста на ошибки... буду очень вам благодарен!!!

<?php

// соединение с базой данных
include "config.php";

if (
get_magic_quotes_gpc()) {
        
$_POST['login'] = stripslashes($_POST['login']);
        
$_POST['passw'] = stripslashes($_POST['passw']);
}


if(!
preg_match("|^[\d]*$|",$_POST['dd_date_rogd'])
    || !
preg_match("|^[\d]*$|",$_POST['mm_date_rogd'])
    || !
preg_match("|^[\d]*$|",$_POST['yyyy_date_rogd'])) echo "Неверный формат даты<br>";

if (empty(
$login)) echo "Не заполненно поле логин<br>";
elseif(!
preg_match("|[0-9a-z_\. ]{3,16}|i"$_POST['login'])) echo "Неверно введён логин<br>";

elseif (empty(
$passw)) echo "Не заполненно поле пароль<br>";
elseif(!
preg_match("|[0-9a-z_]{6,20}|i"$_POST['passw'])) echo "Неверно введён пароль<br>";

elseif (
$passw != $_POST['confirm_passw']) echo "Пароли не совпадают<br>";

elseif (empty(
$_POST['email'])) echo "Не заполненно поле e-mail<br>";
elseif (!
preg_match("|[0-9a-z_]+@[0-9a-z_^\.]+\.[a-z]{2,3}|i"$_POST['email'])) echo "Неверно введён e-mail<br>";
else {
        
// экранирование одинарных кавычек \'
        
$_POST['login'] = mysql_escape_string($_POST['login']);
        
$_POST['passw'] = mysql_escape_string($_POST['passw']);

        
$query = @mysql_query("SELECT * FROM users WHERE name='$login'");
        if (!
$queryputerror("Ошибка выполнения запроса");

        if(
mysql_num_rows($query)>0) echo "Логин уже занят<br>";
        else {
                
$query = @mysql_query("INSERT INTO users (name, pass) VALUES ('$login',MD5('$passw'))");
                if (!
$queryputerror("Ошибка при добавлении нового пользователя");
                else echo 
"Пользователь $login зарегистрирован";
        }
}

?>

Заранее огромное вам всем спасибо!

   
 
 автор: afdm   (20.01.2008 в 14:25)   письмо автору
 
   для: afdm   (20.01.2008 в 12:56)
 

ап

   
 
 автор: cheops   (20.01.2008 в 14:34)   письмо автору
 
   для: afdm   (20.01.2008 в 14:25)
 

А они в скрипте имеются? :)))

   
 
 автор: afdm   (20.01.2008 в 14:41)   письмо автору
 
   для: cheops   (20.01.2008 в 14:34)
 

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

   
 
 автор: Unkind   (20.01.2008 в 14:42)   письмо автору
 
   для: afdm   (20.01.2008 в 12:56)
 

По-моему, не стоит тратить время на такие проверки. Проще привести число к integer (если оно должно быть целым), чем делать проверку являются ли все символы цифрами. Одно отличие, которое может нарушить логику скрипта - возможность передавать отрицательные значения.
В любом случае, вместо проверки соответсвия паттерну /^[\d]*$/ (кстати, такой паттерн пропускает пустую строку, что может вызвать ошибку в SQL-запросе) лучше использовать ctype_digit().

Идет обращение к неопределенным переменным $login, $passw. Вообще в скрипте удаляете слеши и эскейпируете символы в $_POST['var'], а добавляете и проверяете $var.

Паттерн для e-mail ущемляет права владельцев ящиков на, допустим, доменах в зонах info, travel и т.д.

Если храните хеш, то не стоит, наверное, выдавать ошибку, если пароль длиннее 20 символов. И почему-то Вы так ограничиваете пользователя в наборе символов для пароля...На радость взломщикам.

   
 
 автор: afdm   (20.01.2008 в 15:44)   письмо автору
 
   для: Unkind   (20.01.2008 в 14:42)
 

спасибо Unkind за советы...
пожалуй, действительно не буду вводить ограничения на длину пароля. кстати, а какое самое длинное название зоны? travel, 6 знаков? или ещё есть какие-то?

> В любом случае, вместо проверки соответсвия паттерну /^[\d]*$/ (кстати, такой паттерн пропускает пустую строку, что может вызвать ошибку в SQL-запросе) лучше использовать ctype_digit().
можно поподробнее? а такой паттерн специально должен пропускать пустую строку, т.к. поле не явл. обязательным.
> Идет обращение к неопределенным переменным $login, $passw.
да простите, не заметил... просто раньше они были, а сейчас нет. исправлено...

PS какие ещё есть замечания??? особенно в плане проверки и вывода ошибок?!

   
 
 автор: afdm   (20.01.2008 в 16:39)   письмо автору
 
   для: afdm   (20.01.2008 в 15:44)
 

да и ещё! можно ли форму и обработчик запихать в один скрипт? не в смысле как, а в смысле правильно ли это будет? или всё-таки в разных оставить... спасибо!

   
 
 автор: afdm   (20.01.2008 в 19:49)   письмо автору
 
   для: afdm   (20.01.2008 в 16:39)
 

up!

   
 
 автор: afdm   (20.01.2008 в 23:33)   письмо автору
 
   для: afdm   (20.01.2008 в 16:39)
 

Ну неужели я написал что-то и вправду без ошибок? :)))

PS все предыдущие замечания учтены и исправлены.

   
 
 автор: Loki   (21.01.2008 в 11:14)   письмо автору
 
   для: afdm   (20.01.2008 в 23:33)
 

<?
$query 
= @mysql_query("SELECT * FROM users WHERE name='$login'"); 

Переменная $login у вас берется из воздуха.

   
 
 автор: afdm   (21.01.2008 в 13:21)   письмо автору
 
   для: Loki   (21.01.2008 в 11:14)
 

процитирую сам себя: :))
>PS все предыдущие замечания учтены и исправлены.
всё уже исправил... :))
ну раз вроде бы уже нет ошибок, думаю тему можно и закрыть :)))

   
 
 автор: afdm   (21.01.2008 в 13:26)   письмо автору
 
   для: afdm   (21.01.2008 в 13:21)
 

ещё два вопросика:

первый к Unkind'у: почему нужно использовать ctype_digit(), а не is_int(). Или не принципиально? в чём отличие этих двух функций? (может быть в том, что ctype_digit не пропускает отриц. значения???)

а второй такой: форму и обработчик вообще культурно делать в одном скрипте вместе? или лучше в двух разных? или тоже не принципиально?
спасибо!!!

   
 
 автор: Unkind   (21.01.2008 в 13:34)   письмо автору
 
   для: afdm   (21.01.2008 в 13:26)
 

> почему нужно использовать ctype_digit(), а не is_int(). Или не принципиально? в чём отличие этих двух функций? (может быть в том, что ctype_digit не пропускает отриц. значения???)
a) ctype_digit() проверяет является ли каждый символ цифрами 0-9.
b) is_int() проверяет тип переменной.

<?php
var_dump
(ctype_digit('123')); // bool(true)
var_dump(is_int('123')); // bool(false)

var_dump(ctype_digit('-123')); // bool(false)
var_dump(is_int(-123)); // bool(true)
?>


на "123" is_int() выдаст false , потому что это не integer, а string

   
 
 автор: afdm   (21.01.2008 в 15:08)   письмо автору
 
   для: Unkind   (21.01.2008 в 13:34)
 

да. спасибо!!! уже разобрался :)))

   
Rambler's Top100
вверх

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