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

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

 

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

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

тема: Ответ на задачу №21

Сообщения:  [1-10]    [11-20]   [21-30]  [31-37] 

 
 автор: Николай2357   (21.08.2008 в 16:43)   письмо автору
 
   для: GeorgeIV   (21.08.2008 в 16:38)
 

Почувствовал, спасибо.
А главного я так и не понял. Мне в PHP еще пахать и пахать, куда уж хакерские методы изучить... Только видел я примеры иньекций, где нет ни одной кавычки. От них это тоже спасает? И с сессией не понятно. Как то раз выключил интернет не закрыв страницу, а на следующий день включил - сессия живая. Это как так?

  Ответить  
 
 автор: GeorgeIV   (21.08.2008 в 16:38)   письмо автору
 
   для: Николай2357   (21.08.2008 в 15:48)
 

$a=false;
$b=0;
$a==$b будет истина
$a===$b будет ложь
почувствуй разницу

  Ответить  
 
 автор: Николай2357   (21.08.2008 в 15:48)   письмо автору
 
   для: Trianon   (21.08.2008 в 15:27)
 

Спасибо. Подскажите еще, пожалуйста,
1)Когда использовать === (строго равно)?
2)Нужно ли в конце подобных скриптов session_destroy ?
3) И самый главный вопрос, из за которого я старался: теперь можно спать спокойно на счет иньекций?
Спасибо.

  Ответить  
 
 автор: Trianon   (21.08.2008 в 15:27)   письмо автору
 
   для: Николай2357   (21.08.2008 в 13:36)
 

по-моему, во всех сравнениях, подобных этому
$go != null
Вы имели в виду на самом деле
$go !== null


В остальном таки да. Прогресс имеет место быть.

  Ответить  
 
 автор: Николай2357   (21.08.2008 в 13:36)   письмо автору
 
   для: Николай2357   (20.08.2008 в 03:10)
 

Ну вот, так вроде бы работает. Правда через сессию, но мне это тоже нужно знать. Посмотрите пожалуйста.
<?
include "dbconnect.php"
session_start();
function 
rec_stripslashes($mixed

    if( 
is_array($mixed) ) 
    { 
        return 
array_map('rec_stripslashes'$mixed); 
    } 
    else 
    { 
        return 
stripslashes($mixed); 
    } 

if( 
get_magic_quotes_gpc() ) 

    
$_GET rec_stripslashes$_GET ); 
    
$_POST rec_stripslashes$_POST ); 

           
$post_name = @$_POST['name'];
            
$in = @$_POST['in'];
            
$go = @$_GET['go'];
            
$new = @$_GET['new'];
            
$sel = @$_GET['sel'];
            
$hello = @$_GET['hello'];
            
$get_name_sel = @$_GET['getname'];
            
$tabsel = @$_GET['tabsel'];
            
$del = @$_GET['delete'];
            
$id intval(@$_GET['id']);
            
$get_name 0;
            
$get_val = @$_GET['name'];
    if(    
$get_val != null )
           {
           
$get_name = @$_GET['name'];
           }
           else
           {
           
$get_name null;
           }
            
$host $_SERVER['HTTP_HOST']; 
            
$self $_SERVER['PHP_SELF'];

    if( 
$go != null && $post_name != null )
     {
     
   
$_SESSION['name'] = $post_name;
 
header("Location: http://".$host.$self."?go=1&new=1");
 exit;  
     }
    elseif( 
$go != null && $get_name != null)
     {
   
$_SESSION['name'] = $get_name;
 
header("Location: http://".$host.$self."?go=1&tabsel=".$tabsel);
 exit; 
     }
         elseif( 
$get_name_sel != null )
     {
   
$_SESSION['name'] = $get_name_sel;
 
header("Location: http://".$host.$self."?go=1&sel=".$sel);
 exit; 
     }    
    
if( 
$go != null || $sel != null )
     {
    
$name = @$_SESSION['name']; 
    
          if( 
$tabsel != null ||  $hello != null  )
              {
            
$name html_entity_decode($name);
              }  
            
$count_name=strlen($name);
            
$count=strlen($count_name)-1;  
            
$count_var=substr($count_name$count);  
                     if(
$count_var==1)
                     {  
                 
$varsh="символ";  
                     }  
                     if(
$count_var==|| $count_var==3||$count_var==4)
                     {  
                 
$varsh="символа";  
                     } 
                     if(
$count_var==|| preg_match("/[5-9]/",$count_name) || preg_match("/[1][\d]/",$count_name))
                     {  
                 
$varsh="символов";  
                     }    
    
$name_db mysql_real_escape_string($name);
    
$name htmlspecialchars($name);
    
$query mysql_query("SELECT visits FROM guests WHERE guestname='".$name_db."'")
          or die (
'Error: 1' mysql_error());  
$userdata mysql_fetch_assoc($query);  
$visits $userdata['visits'];
               if( 
$visits != null )
                { 
          
$count=strlen($visits)-1
          
$count_var=substr($visits$count);  
                   if(
$count_var==2||$count_var==3||$count_var==4){  
                       
$varsh_c="раза";  
                           }
                          else
                           {  
                       
$varsh_c="раз";
                           } 
                   if(
preg_match("/[1][\d]/",$visits)) 
                           {  
                       
$varsh_c="раз";  
                           }
                    
                 }
          if( 
$new != null )
                 {
                 if( 
$visits == null  )
                      {  
                 
$visits=1
 
        
mysql_query("INSERT INTO guests SET guestname='".$name_db."', visits='".$visits."'")
                        or die (
'Error: 2' mysql_error());  
                      }  
                      else  
                      {   
                 
$visits++;  
        
mysql_query("UPDATE guests SET visits ='".$visits."' WHERE guestname='".$name_db."'")
                        or die (
'Error: 3' mysql_error());    
                      } 
 
header("Location: http://".$host.$self."?go=1&hello=1");
 exit;                  
                      
                  }
     
        if( 
$hello != null )
            {
$mess=$mess_d."Таки здрасти <b>".$name."</b>!<br>
 Мы знаем, что в Вашем имени "
.$count_name." ".$varsh.", и Вы у нас  ".$visits."-й раз";
            }
                if( 
$visits == null )
                    {  
$mess="Не, <b>".$name."</b> пока не числится, зайдите позже!
 Хотя мы знаем, что в его имени "
.$count_name."  ".$varsh ;  
                    }  
                elseif( 
$hello == null )
                    {  
$mess="Гражданин <b>".$name."</b><br> побывал у нас ".$visits." ".$varsh_c.".
 Поэтому мы знаем, что в его имени "
.$count_name."  ".$varsh;   
$mysql=" WHERE guestname='".$name_db."'";  
$all="<a href='".$self."'>Показать всех</a>";  
                    }
     }
     elseif( 
$del != null )
     {
       
mysql_query("DELETE FROM guests WHERE id = '".$id."'")
                 or die (
'Error: 4' mysql_error());  
 
header("Location: http://".$host.$self);
 exit; 
     }
     
$query mysql_query("SELECT guestname, visits, id FROM guests $mysql  ORDER BY id DESC ")
              or die (
'Error: 5' mysql_error());  
         
$count=mysql_num_rows($query);  
          if(
$count==0)
              {
              
$mess="Пусто.";
              }  
                      for(
$i=0;$i<$count$i++)
                      {   
                             
$link mysql_result($query$i"guestname");
                             
$link htmlspecialchars($link);  
                             
$link_name preg_replace("#[\s]{1}#","&nbsp;",$link);
                             
$link_del addslashes($link);   
                             
$href_name rawurlencode($link);
                             
$id mysql_result($query$i"id");  
                             
$tr.="<tr><td style='width:20px'>".($i+1)."</td>
                     <td><a href='"
.$self."?name=".$href_name."&go=1&tabsel=1'>".$link_name."</a></td>  
                     <td>"
.mysql_result($query$i"visits")."</td>  
                     <td><a href='#' onclick=\"javascript:Delete('"
.$id."','".$link_del."')\">
                     dell</a></td></tr>"
;   
                      }
                 
    
$table="<table>
<tr>
  <td style='width:20px'><b>№</b> 
    </td>
    <td style='width:400px'><b>Имя</b>
    </td>
    <td><b>Визиты</b></td>
    <td><b>Удалить</b></td>
    </tr>"
.$tr."</table>"
       
 
$form="<form action=".$self."?go=1 method=post ><input type=text size=80 name=name >
<input type=submit name=in value=Войти ></form>  
<form action="
.$self." method=get ><input size=80 type=text name=getname >
<input name=sel type=submit value=Найти ></form>"
;  
?>  
<html>  
<head>  
<style>  
body{  
background-color:#FFFFCC;  
}   
table {  
border-collapse: collapse;  
}  
td{  
border: 1px solid;  
width:100px;  
text-align:center;  
color:#666699;  
background-color:#e6e6e6;  
}  
</style>  
<script type="text/javascript">  
function Delete(id, name){  
confirm("Вы действительно хотите навсегда удалить "+name+"?")?  
location.href="<? echo $PHP_SELF ?>?delete=1&id="+id : alert("А зря.");  
}  
</script>  
<meta http-equiv="Выберите расширение для паковки" content="text/html; charset=windows-1251"></head>  
<body>  
<?  
echo "<span style='color:red'>".$mess."</span>";  
?>  
<hr>  
<?  
echo $all.$form.$table
echo 
get_magic_quotes_gpc() ? "MQ Включено" "MQ Отключено<br>"
?> 
I 100% know why O"Relly &amp partners doesn''t eat Mc''donalds Gamburgers\\Cheeseburgers<br /> 
Mc''robbins'<br />
O"Relly <br />
Jensen & partners<br />
total %25 of sales <br />
&amp;amp; <br />
&amp;<br />
characterictics of volt&amp;amp; any other graphs <br />
Guest004
</body>  
</html> 


PS Комментировать не стал, и так бумаги попортил.
Спасибо.

  Ответить  
 
 автор: BinLaden   (21.08.2008 в 02:00)   письмо автору
 
   для: Николай2357   (21.08.2008 в 01:07)
 

А это все едино: есть текст и мы должны его обработать так, чтобы с ним ничего не произошло в результате: не добавилось лишнего и наоборот - ничего не потерялось. Ведь htmlspecialchars() и mysql_escape_string() по сути делают одно и то же: экранируют спец. символы для правильной вставки текста на страницу/в запрос Все "гениально и просто": и не требует иных подходов, которые могут допустить взлом

  Ответить  
 
 автор: Николай2357   (21.08.2008 в 01:07)   письмо автору
 
   для: BinLaden   (21.08.2008 в 00:24)
 

>Про пробелы спросили Вы - я Вам ответил, но Вы почему-то этим раздражены.

Да нет, что Вы, я злюсь на себя, что объяснить не могу.

>От них надо избавляться.
Вот опять к примеру. Я про подход к постановке вопроса, а не к решению задачи. Вообще то, если вспомните, вся эта эпопея началась из-за MySQL иньекций. Мне нужно эту проблему решить раз и навсегда. А не то, как амперсанд лучше вытащить, GET запросом или из базы. Это не принципиально. Задачу эту можно решить, только зачем? Ведь важен не результат, он практического применения вряд ли найдет. А вот передача данных - это важно.
За ноль спасибо, гениальное - как просто! И еще про кавычки функция мне очень понравилась. А скрипт я заставлю работать, дело принципа. Не сегодня, конечно, и так второй день на смарку.

  Ответить  
 
 автор: BinLaden   (21.08.2008 в 00:24)   письмо автору
 
   для: Николай2357   (20.08.2008 в 23:59)
 

Давайте постараемся убрать лишнии эмоции.
Про пробелы спросили Вы - я Вам ответил, но Вы почему-то этим раздражены.

> Сделал это не для решения задачи, а просто показать, что подходы бывают разными
Спасибо, но, мягко говоря, это не говорит о том, что раз такие подходы существуют, то их надо показывать :) От них надо избавляться.

> Я хочу выяснить то, чего до сих пор не знал.
Как это не покажется странным, но для того, чтобы что-то новое выяснить придётся решить задачу. Правильно решить. А не пытаться обмануть себя.

> Лучше расскажите, как из GET прочитать 0. Спать не буду, пока не придумаю.

<?php
$val 
0;
if( 
$val != '' )
{
      
# ....
}
?>

  Ответить  
 
 автор: Николай2357   (20.08.2008 в 23:59)   письмо автору
 
   для: BinLaden   (20.08.2008 в 23:10)
 

Ну вот, и Вы туда же. Не умею я наверное грамотно изъясняться.

>На деле покажите? Имею ввиду запихните это в скрипт, который по
Да пожалуйста, смотрите. Там далеко не все работает, но это работает точно. Кроме того, если уж пошла такая пьянка, в условиях четко сказано, использовать абсолютно любые символы. То есть и пробел. Как я понимаю, юзер по имени "два пробела амперсанд", это не юзер "один пробел амперсанд". У меня это тоже работает. Сделал это не для решения задачи, а просто показать, что подходы бывают разными.

>Но сам факт того, что Вы предлагаете такое решение только говорит о том, что Вы еще ничего не поняли...:(

Я не пытаюсь решить эту задачу на 100%!!!!! Я хочу выяснить то, чего до сих пор не знал.
Не знал и не знаю очень многого, и это проблема. А не то, что у меня подход другой. Лучше расскажите, как из GET прочитать 0. Спать не буду, пока не придумаю.
Спасибо.

  Ответить  
 
 автор: BinLaden   (20.08.2008 в 23:10)   письмо автору
 
   для: Николай2357   (20.08.2008 в 22:44)
 

> Да это то просто:

На деле покажите? Имею ввиду запихните это в скрипт, который по ссылке http://test.inkz.ru/, чтобы все убедились, что это "просто".

Но сам факт того, что Вы предлагаете такое решение только говорит о том, что Вы еще ничего не поняли...:(

> Попробуйте набрать тот же пресловутый амперсанд с пробелом впереди. И где же тот пробел?
Он никуда не девался. Разве MySQL в конце строки при поиске пробелы подчищает и если в базе данных строка

"&   "
, то её можно будет найти хоть по запросу
"&"
, хоть по
"&       "

Хотя тип поля и TINYTEXT, а не (VAR)CHAR какой-нибудь.

  Ответить  

Сообщения:  [1-10]    [11-20]   [21-30]  [31-37] 

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

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