Проверка данных получаемых от пользователей. Все что я узнал + несколько вопросов.

Гриша К.

Новичок
Проверка данных получаемых от пользователей. Все что я узнал + несколько вопросов.

Здравствуйте.
Ниже я опишу, все что я узнал и разобрал, о проверке, записи и выводе данных принимаемых от пользователей.
Тему я создал для того, чтобы убедиться с вашей помощью в том, что я правильно усвоил основы проверки, вывода и записи данных принимаемых от пользователей. И задать несколько неясных мне вопросов.
Содержание примеров краткое, просто я его растянул на блоки, чтобы яснее было читать.

[1] Создаю короткие имена переменных, перед этим удаляю в них пробелы слева и справа используяю trim()

[2] Осуществляю проверку полей формы (используя функции filled_out() - на наличие пустых полей, eregi() - проверяю e-mail по шаблону, использую strlen($var) для проверки длины полей).
> При правильном заполнении полей и успешной записи данных в БД, перенаправляю пользователя на страницу с сообщением об успешной регистрации (используя header('location: http://').
> Если при заполнении есть ошибки, вывожу об этом сообщение над формой, а в полях формы вывожу вводимые пользователем данные используя htmlspecialchars($var1, ENT_QUOTES);

[3] Осуществляю запись данных в базу данных, ставя перед символами одинарными и двойными ковычками слэши, при помощи функции mysql_real_escape_string();

// Мне хотелось бы узнать, уяснил ли я верно основы этой темы? //

Cписок страниц на которых я читал информацию по этой теме:
- http://phpclub.ru/talk/showthread.php?s=&threadid=43521
- http://phpfaq.ru/slashes
- http://ru2.php.net/mysql_real_escape_string
- http://ru2.php.net/htmlspecialchars


-[Вопросы]------------

Я немного запутался c прослэшиванием оператора like

Правильно ли я понял, что сначало мне нужно применить такую функцию?:
$var=str_replace('\\','\\\\',$var);
Т.е. перед каждым слэшом он ставит по слэшу

А только потом вот-так?:
$var=mysql_real_escape_string($var);

Если я хочу, чтобы символ '_', прослэшивался, то я делаю так?:
$var=addCslashes($var, '_');


И получается, что если я использую такой запрос, where = '\\';
То после обработки функцией mysql_real_escape_string, их будет '\\\\' ?

Все Фанат я удалил примеры, теперь коротко.
 

SelenIT

IT-лунатик :)
Гриша К.

Пока была простыня кода, мне бросился в глаза комментарий "в оригинале было так... и т.д.". в ф-ции smart_quote. Чем тебя не устроило то, что было "в оригинале"?
 

Гриша К.

Новичок
SelenIT, спасибо за ответ.
В шутку: всетаки при втрязивании простыни, что-то удалось засветить : )

Функция, отсюда http://ru2.php.net/mysql_real_escape_string

PHP:
function quote_smart($value)
{
   // если magic_quotes_gpc включена - используем stripslashes
   if (get_magic_quotes_gpc()) {
       $value = stripslashes($value);
   }

   // Если переменная - число, то экранировать её не нужно
   // если нет - то окружем её кавычками, и экранируем  
if (!is_numeric($value)) {
       $value = mysql_real_escape_string($value); 
	// В оригинале было так $value = "'".mysql_real_escape_string($value)."'";
   }
   return $value;
?>

//Если использовать как в оригинале, то данные нужно вставлять так:
$query = sprintf("SELECT * FROM users WHERE user=%s ",
           quote_smart($_POST['username']));
//или получается так:
$query = "SELECT * FROM users WHERE user=quote_smart($_POST['username']) ";

//А мне вот так как-то привычней и удобней:
$query = "SELECT * FROM users WHERE user='".quote_smart($_POST['username'])."' ";
Если это не влияет на безопасность, а только для удобства, то хорошо. А если нет, то придется сделать как в оригинале.
Разницы ведь не какой?
 

Фанат

oncle terrible
Команда форума
функция smart_quote написана неправильно.
никакого отношения к волшебным кавычкам там не должно быть.
функции filled_out надо передавать вторым параметром массив - список обязательных полей.
перевеодить переменные в короткий вид не нужно. Запрос вставки или апдейта проще составлять автоматом, функцией, которой передаётся массив - список полей в запросе

функции работы с БД очень странные.
непонятно, зачем нужна функция регистер и почему она относится к функциям баз данных.
непонятно, почему у неё там внутри идёт коннект к бд!
 

SelenIT

IT-лунатик :)
Разницы никакой (в случае MySQL), но если ты все равно берешь в кавычки все данные, зачем вообще проверять их на is_numeric?
 

Гриша К.

Новичок
Фанат, спасибо за ответ.

функция smart_quote написана неправильно.
никакого отношения к волшебным кавычкам там не должно быть.
Т.е. стоит просто использовать $value = mysql_real_escape_string($value); перед записью в БД и так корректно?
А функцию взял из phpnet.ru, вот и запутываешся со всем правильно ли там пишут или нет.

функции filled_out надо передавать вторым параметром массив - список обязательных полей.
Например вот так?
filled_out($_POST, array($email, $name, $passw, $passw2))



перевеодить переменные в короткий вид не нужно.
Если я не буду объявлять короткие имена переменных, то вот например в таком случае
<input type="text" name="email" value="'.$_POST['var'].'" maxlength="100">
Ведь будет сообщение об ошибке: Notice: Undefined index: email in e:\home\megapolis\www\register.php on line 81

функции работы с БД очень странные.
непонятно, зачем нужна функция регистер и почему она относится к функциям баз данных.
непонятно, почему у неё там внутри идёт коннект к бд!
[/php]
Если все поля заполнены правильно:
else {
$reg_result = register($username, $email, $passwd);
if ($reg_result === true) {
session_start();
$_SESSION['valid_user'] = $username;
header('Location: http://'.$_SERVER['HTTP_HOST'].'/register.php?result=true');
exit;
}

А вот функция
function register($username, $email, $password)
{
$conn = db_connect();
if (!$conn) return 'Соеденение не устанавливается.';

$result = mysql_query("select * from customers where username='".quote_smart($username)."'");

if (!$result) return 'Неудается извлеч данные';
if (mysql_num_rows($result)>0) return 'Это имя уже есть.';

$result = mysql_query("insert into customers values
('', '".quote_smart($username)."', MD5('".quote_smart($password)."'), '".quote_smart($email)."', '0')");

if (!$result) return 'Невозможно установить соединение.';
return true;
}
[/php]

Запрос вставки или апдейта проще составлять автоматом, функцией, которой передаётся массив - список полей в запросе
Вы имеете в виду так?

function register($_POST)
{
extract($_POST);
//...
}

-~{}~ 10.03.06 22:36:


SelenIT, да, точноЮ, в таком случае проверять не нужно. Ну Фанат говорит, что функция составлена неправильно, я даже не знаю стоит ли ее использовать.
 

Фанат

oncle terrible
Команда форума
вот и запутываешся со всем правильно ли там пишут или нет.
там пишут ПРИМЕР!
у тебя, разве не пострипаны слеши в самом начале скрипта?
как об этом написано в факе?

-~{}~ 10.03.06 22:48:

Например вот так?
filled_out($_POST, array($email, $name, $passw, $passw2))
доллары тут зачем?
Если я не буду объявлять короткие имена переменных, то вот например в таком случае
<input type="text" name="email" value="'.$_POST['var'].'" maxlength="100">
Ведь будет сообщение об ошибке: Notice: Undefined index: email in e:\home\megapolis\www\register.php on line 81
боже, какая каша.
у тебя ДВА РАЗНЫХ скрипта.
один выводит форму, другой её обрабатывает.
сделать пустой массив для формы - одна строчка!
специально для формы!
там, где это нужно!

Ну сам подумай - ты делаешь эти "короткие" на все скрипты, когда оно тебе нужно только в одном.

-~{}~ 10.03.06 22:51:

зачем код функции register
1. оформлять в виде функци?
2. записывать в раздел функций для работы с мускулем?
 

Гриша К.

Новичок
Фанат,
Забыл про это спросить, надо ли так делать.
Т.е. я делаю как написано в факе, а потом, просто mysql_real_escape_string($value);

Да с $ это я намудрил.


Короткие переменные $_POST['var'] я делаю только на одной странице register.php, но я вот запутался, щас сежу и никак непойму что-то по поводу пустого массива для формы.
Т.е. к примеру так:
$register= array();

if ($_SERVER['REQUEST_METHOD']=='POST') {
foreach($_POST as $key => $value) {
$value = trim($value);
$_POST[$key] = $value;
$register[$key] = $value;
}
}

А нет это ерунда какая-то, я уже проверил, просто тоже самое сделал.
Фанат, немогли бы вы мне разъяснить этот момент с массивом.


Функция registr находится в отдельном файле, user_auth_fns.php, там находятся функции связанные с записью и выводон данных из базы данных для авторизации пользователей, регистрации, напоминании и изменении пароля.
Значение слова мускуль не знаю, хотя на форуме уже встречал.
 

Фанат

oncle terrible
Команда форума
спать ложись.

-~{}~ 11.03.06 14:46:

Функция registr находится в отдельном файле, user_auth_fns.php, там находятся функции связанные с записью и выводон данных из базы данных для авторизации пользователей, регистрации, напоминании и изменении пароля.
Значение слова мускуль не знаю, хотя на форуме уже встречал.
вот это показывает, что ты совершенно не понимаешь, что делаешь
зачем выносить функцию рекистрации из файла, который занимается РЕГИСТРАЦИЕЙ, в отдельный файл?
про значение слова мускуль я тебя не спрашивал.
 

Гриша К.

Новичок
Фанат, спасибо, что открыли тему, вчера вы вовремя ее закрыли, я уже несоображал конечно, как всегда перед сном хотелось получить готовый результат. И спасибо большое за все разъяснения.

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

Т.е. функцию registr, я не смысла выносить в отдельный файл, а стоит использовать в том же файл registr.php?

записывать в раздел функций для работы с мускулем?
Мне вот это ваше сообщение было непонятно, я поэтому по поводу мускуля и написал вам.

Поповоду того, что ненужно делать короткие имена переменных я вас сегодня понял.
И скажите пожалуйста по поводу массива с имена полей функции и их значениями я сделал верно?
PHP:
        $form = array('mail' => '', ...)

if ($_SERVER['REQUEST_METHOD']=='POST')

                //$form = array('mail' => '$_POST['mail']', ...);    
 
                //Вместо строчки выше, наверное проще сделать так? Сразу пробелы удалить.
	foreach($_POST as $key => $value) {
                        $form[$key] = trim($value);
	} 
                //Затем обращаюсь к $form['email'] и т.д.
 

Фанат

oncle terrible
Команда форума
когда ты выводишь форму первый раз, никакого поста у тебя нет.
 

Гриша К.

Новичок
Фанат, ну да я так и делаю. В остальном я значит правильно вас понял.
PHP:
//сам код формы у меня ниже, после этого условия
if ($_SERVER['REQUEST_METHOD']=='POST') {
        if (!filled_out($_POST, $form)) {
         // Идут условия проверки, elseif(...
        }
        else { //Если все верно     
        /* Проверяю уникальность имени пользователя в БД, записываю, 
при удачной записи при помощи header() перенаправляю на эту же страницу со значение ?registr=true и вывожу сообщение */
}

/Форму к примеру вывожу так:
echo '<input type="text" name="username" value="'.$form['username'].'" maxlength="25">'
// ...
И Фанат, вот зачем нужна вот эта функция, из faq для удаления обратных слэшей, если php их ставил автоматически, я понял. Мне непонятны две строчки:
PHP:
if (isset($_SERVER['PHP_AUTH_USER'])) strips($_SERVER['PHP_AUTH_USER']); 
  if (isset($_SERVER['PHP_AUTH_PW']))   strips($_SERVER['PHP_AUTH_PW']);
Что это за переменные $_SERVER['PHP_AUTH_USER'],
я пробовал их выводить и искал в массиве $_SERVER, там их нету.
 

Гриша К.

Новичок
SiMM, спасибо за ссылки.
Я начал смотреть ссылки, и еще до этого в книге нашел кое-какой материал, и нахостинге у меня есть папка, для которой использована базовая аутентификация с применением .htaccess, я там посмотрел, эти переменные отображаются.
И по первой приведенной вами ссылки, я так понимаю, что эти переменные отображаются только в том случае, если я использую базовую аутентификацию, если я зашел под каким-то именем и паролем?

-~{}~ 11.03.06 20:43:

----------------------------
----------------------------
Да точно так и есть. Удалоьс создать файл .htcasses и .htpass (командой htpasswd -bc e:/home/book/.htpass user5 pass5), когда авторизовался все получилось, переменные вывелись.
 
Сверху