В php я новичёк, на этом месте перестанем ныть и к делу. Написал <s>скрипт</s>.."скрипт", целью которого является авторизация пользователя. Метод передачи данных post. Выглядит обработчик следующим образом: PHP: <?php $db=mysql_connect("localhost","lynch","123") or die("Could not connect: ".mysql_error()); mysql_select_db("getskill",$db) or die ('Cant use foo : '.mysql_error()); $login=false; $name=''; $pass=''; session_start(); if ($_SESSION['login']==true) { $login=true; $name=$_SESSION['name']; $pass=$_SESSION['pass']; } else { $name=$_POST['name']; $pass=$_POST['pass']; $base=mysql_query("SELECT * FROM users WHERE name='$name' AND pass='$pass' ",$db) or die("Invalid query: ".mysql_error()); if (($numb=mysql_num_rows($base))>0) { $login=true; $_SESSION['login']=$login; $_SESSION['name']=$name; $_SESSION['pass']=$pass; } else { $login=false; } } echo "<html><head> <meta http-equiv='Refresh' content='0; URL=index.php'> </head></html>"; ?> login - булевая переменая, если 1 то залогинились успешно, если 0 то ошибка. Если нужно вот сама форма: HTML: <form action="login.php" method="post"> <input name="name" type="text" value="Введите логин" size="20" maxlength="20" align="center" /> <input name="pass" type="password" value="12345" size="20" maxlength="20" align="center" /> <div align="center"> <input type="submit" value="Войти" /> <a href="reg.php"><input type="button" value="Регистрация"/></a> </div> </form> Вопрос, можно ли (знаю можно точно)...тогда на сколько % эта штука уязвима и несёт опасность и деструктивное действие на планету?
Ничего не происходит Оо ставлю кавычку, нажимаю Войти, происходит редирект из скрипта на главную с неудачей авторизации...и всё ) А почему вы так решили? про кавычку
Дада...обнаружил что были волшебные кавычки, убрал, поставил кавычку, свой косяк понял, спасибо ) Поправил так: PHP: <?php if(empty($_POST['name']) || empty($_POST['pass'])) { echo "Вы должны заполнить все поля! Ждём 3 секунды..."; echo "<html><head> <meta http-equiv='Refresh' content='3; URL=index.php'> </head></html>"; exit; } $db=mysql_connect("localhost","lynch","123") or die("Could not connect: ".mysql_error()); mysql_select_db("getskill",$db) or die ('Cant use foo : '.mysql_error()); $login=false; $name=''; $pass=''; session_start(); if ($_SESSION['login']==true) { $login=true; $name=$_SESSION['name']; $pass=$_SESSION['pass']; } else { $name=$_POST['name']; $pass=$_POST['pass']; $name=trim(mysql_real_escape_string($name)); $pass=trim(mysql_real_escape_string($pass)); $base=mysql_query("SELECT * FROM `users` WHERE `name`='$name' AND `pass`='$pass' ",$db) or die("Invalid query: ".mysql_error()); if (($numb=mysql_num_rows($base))>0) { $login=true; $_SESSION['login']=$login; $_SESSION['name']=$name; $_SESSION['pass']=$pass; } else { $login=false; } } echo "<html><head> <meta http-equiv='Refresh' content='0; URL=index.php'> </head></html>"; ?> поставил проверку пустых полей, расстановку слэшей и название столбцов в кавычки взял. Что тут ещё нехорошего можно устроить? И ещё вопрос касательно логики этого всего: может быть можно как-нибудь без этого обработчика с постоянным редиректом на главную...там ajax может поможет или может есть ещё более простые варианты? Спасибо.[/php] А этого не понял...если не подскажите как такую строку сделать и что такое or 1= 1 # - пойду убьюсь...или читать ) А ещё лучше слэшировать или сразу "подготовленными выражениями" пользоваться? Второе я не пробовал...ещё
Этот запрос выполнится на сервере если в качестве пароля взять последовательность ' OR 1 = 1 # К чему это приведет: будут выбраны все записи из таблицы невзирая на проверки.
Спасибо огромное! Кстати зная логин можно было зайти без пароля так: brainiac'# , но уже не зайти ибо спец символы экранируются...Вопрос: одного экранирования данных перед sql запросом хватит? Или дополнительно проверять нужно ещё на специальные слова, используемые в sql ?
Теперь при включенном magic_quotes экранироваться будет дважды. Я бы сделал так: PHP: <?php $name = (isset($_POST['name'])) ? escapeStr(trim($_POST['name']), $db) : ''; // ... function escapeStr($str = '', $db = false) { if(get_magic_quotes_gpc()) $str = stripslashes($str); $str = ($db) ? mysql_real_escape_string($str, $db) : mysql_escape_string($str); return($str); } ?>
Код (Text): Если в ПОСТ есть name то присваиваем $name результат функции, если нет то присваимваем пустоту... Точно также для других.. Функция с 2-мя аргументами... Если волшебные включены то удаляем экранирование. Если соединение с базой есть то переменной $str присваиваем еёже с экранированными спец символами, если соединения нет то экранируем все спец символы. Возвращаем str. Я так перевёл? Только я не понял почему мы используем функцию до её определения...И ещё не понял последние строки где $db проверяем...Почему нельзя просто убрать всё экранирование если включено волшебство и заэкранировать поновой. И ещё момент: каков механизм присваивания аргументов в функции? (trim($_POST['name']) -> ($str='') $db -> ($db=false). Что происходит когда мы это всё так подставляем? Просто $str присваивается '' а потом trim($_POST['name'] ? И аналогично db.. PS просто в том языке который я знаю это дало бы ошибку ) впрочем т.к. он косячный. Спасибо за метод, интересно )
Можно. Просто функция написана так, чтобы корректно отработала если, например, по каким-то причинам её вызов будет до установления соединения с б.д. Ну или, например, забыли передать указатель на соединение с б.д. Если соединение с б.д. есть - экранирование происходит функцией mysql_real_escape_string(), которая учитывает кодировку соединения с б.д. Иначе - функцией mysql_escape_string(). Из описания функции mysql_escape_string(): По поводу передаваемых аргументов. Строка PHP: <?php $name = (isset($_POST['name'])) ? escapeStr(trim($_POST['name']), $db) : ''; идентична PHP: <?php if(isset($_POST['name'])) { $name = trim($_POST['name']); $name = escapeStr($name, $db); } else $name = ''; То есть $newVar = functionOne(functionTwo($var)); сделает следующее: сперва отработает функция functionTwo(), а потом результат её работы (то, что эта функция вернёт) передастся в качестве аргумента в функцию functionOne(). По поводу того, как функция принимает аргументы. Когда пишем: functionName($varOne = '', $varTwo = false) { ... } означает, что переменная $varOne "по умолчанию", так сказать, будет равна пустой строке, а $varTwo - false. То есть эти значения присвоятся переменным в функции, если вызвать функцию без аргументов: functionName(); Если вызвать с одним аргументом: functionName('строка'); то переменной $varOne будет присвоено значение 'строка', а у переменной $varTwo будет значение по умолчанию (false). В php это не важно, где определение функции, а где её вызов.
ожидал какой-нить маленький такой ответик, а тут прям разжевали всё ) Даже сказать нечего, все вопросы отпали ) Огромное (как моя улыбка) спасибо, вообще привык кнопочку нужную кликать...но тут жаль нет. Много нового и полезного узнал для себя, ещё узнал, что на форумах есть хорошие люди, спасибо вам, всем отписавшимся в этом топике. PS про логику тернарного оператора я знал, подсмотрел в гугле после того кода. ) Padaboo, не увидел, спасибо что поправили. Всё, это конец темы.