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

Форум PHP

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

 

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

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

тема: почему не работает пример

Сообщения:  [1-9] 

 
 автор: mindless   (16.12.2006 в 20:03)   письмо автору
 
   для: Trianon   (16.12.2006 в 19:45)
 

:))))))))))))))))))))))))))))))))))))))))))))))))))))))

admin' or 1 or 1 <> ' - это работает!

скажите а как видоизменить запрос в БД?

   
 
 автор: Trianon   (16.12.2006 в 19:45)   письмо автору
 
   для: mindless   (16.12.2006 в 19:29)
 

тогда (при выключенных magic quotes) в поле логина можно набрать например

admin' or 1 <> '

или даже

admin' or 1 or 1 <> '

Городить два запроса для проверки - излишне.
Вполне можно обойтись одним SELECT COUNT(*)
Нужно лишь корректно (mysql_escape_string) включить в него литеральные параметры.

   
 
 автор: mindless   (16.12.2006 в 19:29)   письмо автору
 
   для: Trianon   (16.12.2006 в 19:22)
 

это же форма:))

$u = $_POST['user'];
$p= $_POST['pass'];

при отправке символа ' - выдает мсою строку - что не может сверить

вот весть код

<? session_start();

$u=$HTTP_POST_VARS["log_in"];
$p=$HTTP_POST_VARS["pass"];

if(!
$u && !$p){$otvet"<strong>ERROR: Fill in all fields!</strong>";  include 'clear.htm'; exit;}

include 
'conf.php';
//$connection = mysql_connect("localhost", "", "") or die("cant connect...");
@mysql_select_db($db_name) or die("cant select data base...");

$quary="select count(*) from members where user_login ='$u' and user_pass='$p'";

$result=mysql_query($quary) or die ("cant compare login and password...");

$count=mysql_result($result00);


if(
$count>0
{
$quary="select user_name, user_famila,id from members where user_login='$u'";
$res=mysql_query($quary) or die("cant select data...");
//$num=mysql_num_rows($res);
$row=mysql_fetch_array($res);


$_SESSION["valid_user"]=$row["id"];

$ima=htmlspecialchars(stripslashes($row["user_name"]));
$ima2=htmlspecialchars(stripslashes($row["user_famila"]));

}

else {
$otvet"<strong>ERROR: Wrong login or password!</strong>"; include 'clear.htm'; exit;  }

if(
$_SESSION["valid_user"])
{
$otvet="<b>Welcome $ima $ima2! You have entered sucesseful!<b>"; include 'clear.htm';
}
?>

   
 
 автор: Trianon   (16.12.2006 в 19:22)   письмо автору
 
   для: mindless   (16.12.2006 в 19:10)
 

>как насчет моего примера?
В Вашем примере не видно, откуда взялись $u и $p, поэтому сказать о нем ничего нельзя.

   
 
 автор: mindless   (16.12.2006 в 19:10)   письмо автору
 
   для: Trianon   (16.12.2006 в 15:25)
 

так мне никто и не ответил- почему первый пример с авторизацией работает?
и почему не рекомендовано использовать mysql_num_rows- как насчет моего примера?

   
 
 автор: Trianon   (16.12.2006 в 15:25)   письмо автору
 
   для: cheops   (16.12.2006 в 13:28)
 

Всё бы ничего, но цитируемый фрагмент был под заголовком:

Теперь несколько рекомендаций по защите сайта.
1. Не используйте проверку на возращение строки (mysql_num_rows()), а применяйте следующий подход

Это уже не учебные рекомендации, а практические, не так ли?

Кстати, я попытался найти раскрытие природы инъекции и методов борьбы с ней в этой статье. Не преуспел.

   
 
 автор: cheops   (16.12.2006 в 13:28)   письмо автору
 
   для: Trianon   (16.12.2006 в 09:10)
 

Конечно, по такой классической схеме строятся большинство методических текстов, если инъекцию предотвратить сразу, читатель может в конце концов не понять против чего идёт борьба.

   
 
 автор: Trianon   (16.12.2006 в 09:10)   письмо автору
 
   для: mindless   (16.12.2006 в 04:14)
 

> if ( $pass != $m_pass or // даст TRUE, если пароли не равны
> $user != $m_user // данная проверка даст TRUE, если была sql инъекция

Отсюда видно, что автор статьи допускает SQL-инъекцию, и лишь потом начинает бороться с её последствиями.

   
 
 автор: mindless   (16.12.2006 в 04:14)   письмо автору
 
 

http://www.softtime.ru/info/articlephp.php?id_article=35

самый первый где проверка из базы логин/пароль
admin'/* - все нормально не происходит свободного доступа


<?php 
  
  
include "config.php"


  
$query "SELECT * FROM users 
            WHERE name = '
$_POST[name]' AND 
                  pass = '
$_POST[pass]'"
  
$usr mysql_query($query); 
  if(!
$usr) exit("ошибка в  SQL-запросе"); 
  if(
mysql_num_rows($usr)>0
  { 
    echo 
"fefe";
  } 
  else {echo 
"fu";}
?> 

// магические кавыки отключил в php/ini


и еще
сказано Не используйте проверку на возращение строки (mysql_num_rows()), а применяйте следующий подход:
<?php  
  $user 
$_POST['user'];  
  
$pass $_POST['pass'];  
  
$sql "SELECT user, pass FROM users WHERE user = '$user'";  
  list(
$m_user$m_pass) = mysql_fetch_rowmysql_query($sql) );  
  if ( 
$pass != $m_pass or  // даст TRUE, если пароли не равны  
     
$user != $m_user // данная проверка даст TRUE, если была sql инъекция  
  
)  
  {  
        die(
"die");  
  }  
?> 


е асли так:

<?
$quary
="select count(*) from members where user_login ='$u' and user_pass='$p'";

$result=mysql_query($quary) or die ("cant compare login and password...");
$count=mysql_result($result00);

if(
$count>0
{...........................

?>

   

Сообщения:  [1-9] 

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

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