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

Форум PHP

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

 

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

вид форума:
Линейный форум Структурный форум

тема: Защищенность сайта!
 
 автор: lElectroHardl   (16.08.2010 в 15:06)   письмо автору
 
 

Недавно создавал тему по защите админке. По столь высокой критике понял, что сайт мой висит на... соплях.
Вот и хочу поделить методами защиты, которыми пользуюсь я, и узнать новые (и более действенны) методы, от более опытных людей, от вас.

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'], 025);
substr($_POST['text'], 0700);

// убираем ненужные символы, которые могут навредить
$author stripslashes ($author);
$author htmlspecialchars ($author);
$text stripslashes ($text);
$text htmlspecialchars ($text);


Как обезопасить другими методами $_POST пока не знаю. Жду ваших соображений.

3. Защищать $_COOKIE еще не доводилось, так что (на будущие) послушаю ваши советы.

4. .htaccess В нее вписано такая строчка (для подавления "магических ковычек"):
php_flag magic_quotes_gpc Off


Вот собственно и все... знаю, этого ОЧЕНЬ мало для защиты сайта, поэтому и прошу помощи в этом деле :).

  Ответить  
 
 автор: bishake   (16.08.2010 в 15:44)   письмо автору
 
   для: 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.

  Ответить  
 
 автор: lElectroHardl   (16.08.2010 в 16:05)   письмо автору
 
   для: bishake   (16.08.2010 в 15:44)
 

1. Толку? В коде и так, и так просвечивается action.

2. Трим писать не стал, но он есть. И проверка, на пустоту.

3. А какую посоветовали бы вы проверку? Каптчу взломать тоже возможно.
Не совсем понял, как через IP + Cookie защититься от спама?

  Ответить  
 
 автор: bishake   (16.08.2010 в 16:41)   письмо автору
 
   для: lElectroHardl   (16.08.2010 в 16:05)
 

1. А я что, сказал, что мой код скроет адрес? Я привёл пример более менее чистого кода вместо Ваших лишних команд.

3. Запоминайте IP, и сравнивайте... куки это в принципе, тоже защита на дурачка... капча тут лучше всего подойдёт.

  Ответить  
 
 автор: lElectroHardl   (16.08.2010 в 16:45)   письмо автору
 
   для: bishake   (16.08.2010 в 16:41)
 

Вы имеете ввиду проверку по АйПи, что бы люди часто не комментировали? Это уже реализовано.

  Ответить  
 
 автор: nikita2206   (16.08.2010 в 16:33)   письмо автору
 
   для: lElectroHardl   (16.08.2010 в 15:06)
 

Да никто тебе не говорил, что "сайт висит на... соплях", просто код грязный и, хммм, скажем так - говеный, не в обиду. Если ты читаешь сайт попова или учишься по его урокам - оставь это дело. Лучше например найди какую-нибудь хорошую cms, по-изучай ее, да - это сложно, не потому что ты новичек или что-то в этом роде, просто чужой код изучать всем довольно сложно. Возьми например LiveStreet или Cogear - в дальнейшем может понравится какой-нибудь фреймворк. В прошлом треде, где-то, ты сказал, что не пользуешься и не будешь пользоваться фреймворками, т.к. не умеешь. Ты конечно наверное не помнишь этого, но когда-то ведь тебе было, скажем пол года, тогда ты не умел ходить и разговаривать, но ведь начал? Если уж так увлекаешься вебом, то не поленись изучить что-нибудь кроме похапе.

  Ответить  
 
 автор: lElectroHardl   (16.08.2010 в 16:50)   письмо автору
 
   для: nikita2206   (16.08.2010 в 16:33)
 

Прям-таки прописная истина :). Нет, правда, ценные советы.
Фреймворк это что-то типа Дримвивера? Тогда я примерно тем и пользуюсь.
Да, веб меня привлекает, правда изучать начал около 2-х месяцев назад и учить (сейчас) что-то кроме пхп времени нет, т.к. учусь на маркетолога. И времени крайне не хватает...

  Ответить  
 
 автор: bishake   (16.08.2010 в 16:55)   письмо автору
 
   для: lElectroHardl   (16.08.2010 в 16:50)
 

Нет, фреймворк, это например Zend, CodeIgniter, CakePHP.

  Ответить  
 
 автор: nikita2206   (16.08.2010 в 17:23)   письмо автору
 
   для: 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;

  Ответить  
 
 автор: bishake   (16.08.2010 в 17:44)   письмо автору
 
   для: nikita2206   (16.08.2010 в 17:23)
 

nikita2206, +1 за CI ;-)

  Ответить  
 
 автор: lElectroHardl   (16.08.2010 в 17:49)   письмо автору
 
   для: nikita2206   (16.08.2010 в 17:23)
 

Ого, результат на лицо.

Верю, что Фреймворк это лучше чем все то, чем я пользуюсь, но на начальном уровне, я думаю, стоит пройти весь путь - от не самого лучшего до наилучшего. но все-равно спасибо, раз "ради меня старался" :).

  Ответить  
 
 автор: lElectroHardl   (16.08.2010 в 17:56)   письмо автору
 
   для: nikita2206   (16.08.2010 в 17:23)
 

Еще одно.

Обязательно каждый раз писать
mysql_real_escape_string
При обращении к базе? Или это можно упростить?

  Ответить  
 
 автор: Slo_Nik   (16.08.2010 в 19:38)   письмо автору
 
   для: lElectroHardl   (16.08.2010 в 17:56)
 

Этой функцией обрабатываются данные перед записью в базу данных, а данные должны всегда обрабатываться .

  Ответить  
 
 автор: nikita2206   (16.08.2010 в 20:08)   письмо автору
 
   для: lElectroHardl   (16.08.2010 в 17:56)
 

Упростить можно, я как-то для себя писал класс для работы с БД, в той теме есть и инструкция, все довольно просто там, используй ? для подстановки значений переменных. Раз уж так не хочешь с фрейморками работать, можешь воспользоваться этим классом, или другим каким-нибудь, таких очень много.

  Ответить  
 
 автор: lElectroHardl   (16.08.2010 в 20:27)   письмо автору
 
   для: nikita2206   (16.08.2010 в 20:08)
 

Фреймворк...
А тот код, который ты упрощенно написал, обрабатывается так ж как и стандартный пхп код?
И на сколько примерно сложнее Фреймворк от Дримвивера?

  Ответить  
 
 автор: nikita2206   (16.08.2010 в 20:34)   письмо автору
 
   для: lElectroHardl   (16.08.2010 в 20:27)
 

> А тот код, который ты упрощенно написал, обрабатывается так ж как и стандартный пхп код?

Да, в данном случае, фреймворк - это просто набор классов(библиотек).

Не надо путать фреймворк и дримвивер. Дримвивер - это IDE, он лишь подсвечивает код, чтобы тебе было удобней писать, ну еще на фтп твои сорсы может заливать и еще некоторые функции... А фреймворк - это набор библиотек и, так сказать, платформа(или базис), он(например CodeIgniter или скажем YII) помогает отделить логику от представления(шаблонов можно сказать) и от данных...

  Ответить  
 
 автор: lElectroHardl   (16.08.2010 в 21:13)   письмо автору
 
   для: nikita2206   (16.08.2010 в 20:34)
 

Уже качаю Zend.
Но что-то мне подсказывает, что мне еще рано такими игрушками баловаться :). Он (Zend) вообще прост в работе, понимании самой программы?

  Ответить  
 
 автор: nikita2206   (16.08.2010 в 21:33)   письмо автору
 
   для: lElectroHardl   (16.08.2010 в 21:13)
 

С зендом не работал, и, мне кажется, что он как-раз таки не прост будет. Начни с CodeIgniter - там доки довольно понятные, и фреймворк не особо обременен различными сложностями...

  Ответить  
 
 автор: lElectroHardl   (16.08.2010 в 21:47)   письмо автору
 
   для: nikita2206   (16.08.2010 в 21:33)
 

Спасибо, будем работать.

  Ответить  
Rambler's Top100
вверх

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