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

Форум MySQL

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

 

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

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

тема: Защита от взлома в скрипте подсчета кликов

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

 
 автор: Zew   (05.01.2006 в 18:07)   письмо автору
 
   для: Евгений Петров   (05.01.2006 в 17:44)
 

Ок, теперь вроде все понятно. Большое спасибо за помощь. ;)

   
 
 автор: Евгений Петров   (05.01.2006 в 17:44)   письмо автору
 
   для: Zew   (05.01.2006 в 02:55)
 

Как сказал Cheops функция COUNT(*) возращает количество непустых значений удовлетворяющих условию WHERE а так как я ограничил запрос LIMIT 1 то функция возратит не больше единицы т.е. 0 или 1 можно было вместо == 1 написать != 0

   
 
 автор: cheops   (05.01.2006 в 13:29)   письмо автору
 
   для: Zew   (05.01.2006 в 02:55)
 

Здесь имеет ввиду значение, возвращаемое функцией COUNT(), поэтому если число строк может быть больше 1, равенство == следует исправить на знак >=

   
 
 автор: Zew   (05.01.2006 в 02:55)   письмо автору
 
   для: Евгений Петров   (05.01.2006 в 02:48)
 

Ок, понятно. Хм, последний маленький вопрос, просто чтоб мне потом этот способ спокойно использовать в других подобных ситуациях: почему в строчке if(mysql_result(mysql_query("SELECT COUNT(*) FROM click WHERE target = '$file' LIMIT 1"),0)==1) mysql_result приравнивается именно к единице? И что именно он приравнивает к единице - значение поля count (которое может быть как 1, так и 2,5,10 и т.д.) или собстно факт наличия результата, как такогого? о_О Исходя из чего, будет ли оно считать скачивания дальше первого? =)))

   
 
 автор: Евгений Петров   (05.01.2006 в 02:48)   письмо автору
 
   для: Zew   (05.01.2006 в 01:59)
 

Первая строчка не помешает, тем более что я приписал if(!get_magic_quotes_gpc()) т.е. если кавычки не включены...
А LIMIT 1 нужен для того, чтобы при нахождении первого совпадения MySQL закончила поиск, таким образом очень снижается нагрузка на сервер.

   
 
 автор: Zew   (05.01.2006 в 01:59)   письмо автору
 
   для: Евгений Петров   (05.01.2006 в 00:29)
 

Пасибо. =) Хм, ну кавычки кажись у меня сами всегда экранировались - уже подметила по предидущим скриптам. А если они сами экранируются, нужна ли вообще первая строчка?

Да, и еще, зачем вообще прописывать LIMIT 1 в запросе, если там даже в теории больше одной соотв. записи быть не может?

   
 
 автор: Евгений Петров   (05.01.2006 в 00:29)   письмо автору
 
   для: Zew   (04.01.2006 в 23:13)
 

Да вы правы дырявый он как дуршлаг :)))
HtmlScpecialChars как раз применять и не надо было. Эта функци лиш производит преобразование спецсимволов в их HTML эквиваленты. Для SQL запросов нужно экранировать одинарные кавычки. Делается это при помощи функции mysql_escape_string() или add_slashes(). Однако если в настройках php стоит magic_quotes_gpc = On то экранировать кавычки не надо т.к. они будут экранироваться сами. Из всего выше сказанного можно сделать следующий вывод:
<?
  $file 
htmlspecialchars($file);
?>

меняем на
<?
  
if(!get_magic_qoutes_gpc())
    
$file mysql_escape_string($file);
?>

Остальной код я бы поменял примерно на такой:
<?
  
if(mysql_result(mysql_query("SELECT COUNT(*) FROM click WHERE target = '$file' LIMIT 1"),0) == 1)
    
mysql_query("UPDATE click SET count = count + 1 WHERE target = '$file' LIMIT 1");
  else
    
mysql_query("INSERT INTO click(target,count) VALUES('$file','1')");
?>

работать будет на порядок быстрее и надежнее
В последней строчке вроде замечаний нет. :)

   
 
 автор: Zew   (04.01.2006 в 23:13)   письмо автору
 
 

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


<?
include('db_main.php');
$file htmlspecialchars($file);
$query mysql_fetch_array(mysql_query("select count from click where target='".$file."'"));
if(!empty(
$query)){
$count $query['count']+1;
mysql_query("update click set count='".$count."' where target='".$file."'");
}else{
mysql_query("insert into click('target', 'count') values('".$file."', '1');");
}
header("Location: $file");
?>


Ссылки на сами файлы выглядят примерно таким образом: http://www.hellsinguniverse.ru/click.php?file=hellsing/manga/Hellsing/Volume_03/Hellsing_Vol03_Ch02_[14].zip

   

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

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

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