|
|
|
| Недавно создавал тему по защите админке. По столь высокой критике понял, что сайт мой висит на... соплях.
Вот и хочу поделить методами защиты, которыми пользуюсь я, и узнать новые (и более действенны) методы, от более опытных людей, от вас.
1. Защита $_GET.
Ставим допустимые символы в названиях переменных адресной строки:
<? $cat = $_GET['cat'];
if ( $cat and !preg_match("/^[\d]+$/", $cat) and !preg_match("/\bmain\b/i", $cat) )
exit ();
|
Т.е. в адресной строке кроме как ?cat=[числа] и ?cat=main не сможет нечего находиться, т.к. будет exit.
2. Защита $_POST.
Защита комментариев от спама:
<? <script type="text/javascript">
// ставим обработчик формы ниже
function do_submit(form) {
// Полезная нагрузка - проверка заполнения имени пользователя
if (form.author.value=="" || form.text.value=="")
{
alert('Не все поля заполнены!');
}
else
{
// Установить правильное значение обработчика формы
form.action="<? echo "http://offcook.com/cook.php?rec=$rec&cat=$cat[cat]&add=ok" ?>";
// Отправить форму
form.submit();
}
}
</script>
// сама форма с комментами
<form action="about:blank" method="post" name="form_add_com" onsubmit="return false;">
<p>
<label>Ваше имя:</label> <br />
<input type="text" maxlength="25" name="author" value="" />
</p>
<p>
<label>Ваш комментарий:</label> <br />
<textarea name="text" maxlength="700" cols="70" rows="10"></textarea>
</p>
<input type="hidden" name="ip_user" value="<?php echo $ip_user_site ?>" />
<input type="hidden" name="nospam" value="random_text_anti_spam">
<p>
<input name="submit_add_com" type="button" value="Добавить комментарий" onclick="do_submit(this.form);">
</p>
</form>
<?
// проверяем, было ли передано значение, которое находиться в
// <input type="hidden" name="nospam" value="random_text_anti_spam">
// если да, то заменяем его на "ОК"
<script type="text/javascript">
document.form_add_com.nospam.value="OK";
</script>
<?
// дальше проверяем
if ( $add and $add == "ok" ) // вызвали ли переменную в адресной строке
{
if ( $_POST['nospam'] == "OK" ) // было ли передано value
{
if ( $author and $text ) // дополнительная проверка на заполненность полей
{
// Ограничиваем к-во вводимых символов
substr($_POST['author'], 0, 25);
substr($_POST['text'], 0, 700);
// убираем ненужные символы, которые могут навредить
$author = stripslashes ($author);
$author = htmlspecialchars ($author);
$text = stripslashes ($text);
$text = htmlspecialchars ($text);
|
Как обезопасить другими методами $_POST пока не знаю. Жду ваших соображений.
3. Защищать $_COOKIE еще не доводилось, так что (на будущие) послушаю ваши советы.
4. .htaccess В нее вписано такая строчка (для подавления "магических ковычек"):
php_flag magic_quotes_gpc Off
|
Вот собственно и все... знаю, этого ОЧЕНЬ мало для защиты сайта, поэтому и прошу помощи в этом деле :). | |
|
|
|
|
|
|
|
для: lElectroHardl
(16.08.2010 в 15:06)
| | Во-первых, ваш JavaScript грязноватый.
Зачем вручную делать сабмит и подстановку атрибута action? Если Вы думаете, что action таким образом "скрывается" от злоумышленника, то посмотрите внимательней HTML код этой страницы в браузере. Пишите так:
function do_submit(form) {
if (form.author.value=="" || form.text.value=="")
{
alert('Не все поля заполнены!');
return false;
}
return true;
}
<form onsubmit="return do_submit(this);" action="<? echo "http://offcook.com/cook.php?rec=$rec&cat=$cat[cat]&add=ok" ?>">
|
Во-торых, в Вашем скрипте допустима отправка данных, состоящих из пробелов. Не одного trim'a у Вас нет.
В-третьих, что за наивная проверка на спам?
document.form_add_com.nospam.value="OK";
|
Любой откроет fireBug, и исправит это значение на прежнее. Такие вещи надо фиксировать на сервере, например, используя CAPTCHA ну или хотя бы по IP + Cookies. | |
|
|
|
|
|
|
|
для: bishake
(16.08.2010 в 15:44)
| | 1. Толку? В коде и так, и так просвечивается action.
2. Трим писать не стал, но он есть. И проверка, на пустоту.
3. А какую посоветовали бы вы проверку? Каптчу взломать тоже возможно.
Не совсем понял, как через IP + Cookie защититься от спама? | |
|
|
|
|
|
|
|
для: lElectroHardl
(16.08.2010 в 16:05)
| | 1. А я что, сказал, что мой код скроет адрес? Я привёл пример более менее чистого кода вместо Ваших лишних команд.
3. Запоминайте IP, и сравнивайте... куки это в принципе, тоже защита на дурачка... капча тут лучше всего подойдёт. | |
|
|
|
|
|
|
|
для: bishake
(16.08.2010 в 16:41)
| | Вы имеете ввиду проверку по АйПи, что бы люди часто не комментировали? Это уже реализовано. | |
|
|
|
|
|
|
|
для: lElectroHardl
(16.08.2010 в 15:06)
| | Да никто тебе не говорил, что "сайт висит на... соплях", просто код грязный и, хммм, скажем так - говеный, не в обиду. Если ты читаешь сайт попова или учишься по его урокам - оставь это дело. Лучше например найди какую-нибудь хорошую cms, по-изучай ее, да - это сложно, не потому что ты новичек или что-то в этом роде, просто чужой код изучать всем довольно сложно. Возьми например LiveStreet или Cogear - в дальнейшем может понравится какой-нибудь фреймворк. В прошлом треде, где-то, ты сказал, что не пользуешься и не будешь пользоваться фреймворками, т.к. не умеешь. Ты конечно наверное не помнишь этого, но когда-то ведь тебе было, скажем пол года, тогда ты не умел ходить и разговаривать, но ведь начал? Если уж так увлекаешься вебом, то не поленись изучить что-нибудь кроме похапе. | |
|
|
|
|
|
|
|
для: nikita2206
(16.08.2010 в 16:33)
| | Прям-таки прописная истина :). Нет, правда, ценные советы.
Фреймворк это что-то типа Дримвивера? Тогда я примерно тем и пользуюсь.
Да, веб меня привлекает, правда изучать начал около 2-х месяцев назад и учить (сейчас) что-то кроме пхп времени нет, т.к. учусь на маркетолога. И времени крайне не хватает... | |
|
|
|
|
|
|
|
для: lElectroHardl
(16.08.2010 в 16:50)
| | Нет, фреймворк, это например Zend, CodeIgniter, CakePHP. | |
|
|
|
|
|
|
|
для: lElectroHardl
(16.08.2010 в 16:50)
| | Фреймворк - в информационных системах структура программной системы; программное обеспечение, облегчающее разработку и объединение разных компонентов большого программного проекта. В его состав могут входить вспомогательные программы, библиотеки кода, язык сценариев и прочее. (C) - Wiki
Больше ничего не могу сказать - там все сказано, он просто сильно облегчает разработку, вот например кусок кода без использования фреймворка и с ним(специально для тебя писал):
<?php
if(isset($_POST['id']) && is_numeric($_POST['id'])){
$result = mysql_query('SELECT * FROM `table` WHERE `id` = '.mysql_real_escape_string($_POST['id'])) or die(logAndDisplayError(mysql_error()));
while($row = mysql_fetch_array($result)) echo $row['something'];
}
|
CodeIgniter:
<?php
$query = $this->db->query('SELECT * FROM `table` WHERE `id` = ?', array($this->input->post('id')));
foreach($query->result() as $result) echo $result->something;
|
| |
|
|
|
|
|
|
|
для: nikita2206
(16.08.2010 в 17:23)
| | nikita2206, +1 за CI ;-) | |
|
|
|
|
|
|
|
для: nikita2206
(16.08.2010 в 17:23)
| | Ого, результат на лицо.
Верю, что Фреймворк это лучше чем все то, чем я пользуюсь, но на начальном уровне, я думаю, стоит пройти весь путь - от не самого лучшего до наилучшего. но все-равно спасибо, раз "ради меня старался" :). | |
|
|
|
|
|
|
|
для: nikita2206
(16.08.2010 в 17:23)
| | Еще одно.
Обязательно каждый раз писать При обращении к базе? Или это можно упростить? | |
|
|
|
|
|
|
|
для: lElectroHardl
(16.08.2010 в 17:56)
| | Этой функцией обрабатываются данные перед записью в базу данных, а данные должны всегда обрабатываться . | |
|
|
|
|
|
|
|
для: lElectroHardl
(16.08.2010 в 17:56)
| | Упростить можно, я как-то для себя писал класс для работы с БД, в той теме есть и инструкция, все довольно просто там, используй ? для подстановки значений переменных. Раз уж так не хочешь с фрейморками работать, можешь воспользоваться этим классом, или другим каким-нибудь, таких очень много. | |
|
|
|
|
|
|
|
для: nikita2206
(16.08.2010 в 20:08)
| | Фреймворк...
А тот код, который ты упрощенно написал, обрабатывается так ж как и стандартный пхп код?
И на сколько примерно сложнее Фреймворк от Дримвивера? | |
|
|
|
|
|
|
|
для: lElectroHardl
(16.08.2010 в 20:27)
| | > А тот код, который ты упрощенно написал, обрабатывается так ж как и стандартный пхп код?
Да, в данном случае, фреймворк - это просто набор классов(библиотек).
Не надо путать фреймворк и дримвивер. Дримвивер - это IDE, он лишь подсвечивает код, чтобы тебе было удобней писать, ну еще на фтп твои сорсы может заливать и еще некоторые функции... А фреймворк - это набор библиотек и, так сказать, платформа(или базис), он(например CodeIgniter или скажем YII) помогает отделить логику от представления(шаблонов можно сказать) и от данных... | |
|
|
|
|
|
|
|
для: nikita2206
(16.08.2010 в 20:34)
| | Уже качаю Zend.
Но что-то мне подсказывает, что мне еще рано такими игрушками баловаться :). Он (Zend) вообще прост в работе, понимании самой программы? | |
|
|
|
|
|
|
|
для: lElectroHardl
(16.08.2010 в 21:13)
| | С зендом не работал, и, мне кажется, что он как-раз таки не прост будет. Начни с CodeIgniter - там доки довольно понятные, и фреймворк не особо обременен различными сложностями... | |
|
|
|
|
|
|
|
для: nikita2206
(16.08.2010 в 21:33)
| | Спасибо, будем работать. | |
|
|
|