|
|
|
| Я написала простенький счетчик скачиваний файлов, но он наверняка содержит в себе гиганские дыры в безопастности. Плз, подскажите, что еще надо добавить, чтобы хотя бы уменьшить количество и размеры этих дыр, т.к. я кроме 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 | |
|
|
|
|
|
|
|
для: 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')");
?>
|
работать будет на порядок быстрее и надежнее
В последней строчке вроде замечаний нет. :) | |
|
|
|
|
|
|
|
для: Евгений Петров
(05.01.2006 в 00:29)
| | Пасибо. =) Хм, ну кавычки кажись у меня сами всегда экранировались - уже подметила по предидущим скриптам. А если они сами экранируются, нужна ли вообще первая строчка?
Да, и еще, зачем вообще прописывать LIMIT 1 в запросе, если там даже в теории больше одной соотв. записи быть не может? | |
|
|
|
|
|
|
|
для: Zew
(05.01.2006 в 01:59)
| | Первая строчка не помешает, тем более что я приписал if(!get_magic_quotes_gpc()) т.е. если кавычки не включены...
А LIMIT 1 нужен для того, чтобы при нахождении первого совпадения MySQL закончила поиск, таким образом очень снижается нагрузка на сервер. | |
|
|
|
|
|
|
|
для: Евгений Петров
(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 и т.д.) или собстно факт наличия результата, как такогого? о_О Исходя из чего, будет ли оно считать скачивания дальше первого? =))) | |
|
|
|
|
|
|
|
для: Zew
(05.01.2006 в 02:55)
| | Здесь имеет ввиду значение, возвращаемое функцией COUNT(), поэтому если число строк может быть больше 1, равенство == следует исправить на знак >= | |
|
|
|
|
|
|
|
для: Zew
(05.01.2006 в 02:55)
| | Как сказал Cheops функция COUNT(*) возращает количество непустых значений удовлетворяющих условию WHERE а так как я ограничил запрос LIMIT 1 то функция возратит не больше единицы т.е. 0 или 1 можно было вместо == 1 написать != 0 | |
|
|
|
|
|
|
|
для: Евгений Петров
(05.01.2006 в 17:44)
| | Ок, теперь вроде все понятно. Большое спасибо за помощь. ;) | |
|
|
|