Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: SQL, XSS, помогите защититься

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (2): [1] 2 »   

> Без описания
nomak_suntown
Отправлено: 20 Сентября, 2014 - 15:36:20
Post Id


Гость


Покинул форум
Сообщений всего: 65
Дата рег-ции: Июль 2013  


Помог: 0 раз(а)

[+]


Всем здрасте. Опишу сразу в кратце суть проблемы:

Пишу гостевую книгу, без регистрации и прочего, любой пользователь может оставить запись в гостевой книге на сайте, ввести может только сообщение, ну и каптча для проверки.
Вот база сообщений:

CREATE TABLE `t_messages` (
`id` int(10) unsigned NOT NULL auto_increment,
`message` varchar(2000) default NULL,
`data` varchar(50) default NULL,
`ip` varchar(20) default NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 PACK_KEYS=0 DELAY_KEY_WRITE=1 AUTO_INCREMENT=1 ;

(надеюсь с ней все впорядке, имею ввиду типы полей указаны верно)

Сам скрипт: (без лишнего хтмл кода)




PHP:
скопировать код в буфер обмена
  1. $_url = "http://".$_SERVER['SERVER_NAME'].$_SERVER['PHP_SELF'];
  2.  
  3. if(isset($_POST["user_message"]) && isset($_SESSION["rand_code"])) //(если короч нажата кнопка и есть сессия от каптчи)
  4. {
  5. $_SESSION['name'] = "$user_message"; // для формы, чтобы текст сохранялся
  6.                            
  7. if ($user_message==""){echo "<center>Ошибка! Заполните поле Сообщение!<br> <a href=".$_url.">Вернуться</a></center>";?></div></div></div ><? include ('footer.php'); exit; }
  8.  
  9.  
  10. if ($captcha==""){echo "<center>Ошибка! Введите результат<br> <a href=".$_url.">Вернуться</a></center>";?></div></div></div ><? include ('footer.php'); exit; }
  11.  
  12.  
  13. if($_POST['captcha'] != $_SESSION['rand_code']) {echo "<center>Ошибка! Не верный результат!<br> <a href=".$_url.">Вернуться</a></center>";?></div></div></div><? include ('footer.php'); exit; }
  14.  
  15.  
  16. if (strlen($user_message)>2000){echo "<center>Ошибка! Текст не должен превышать 2000 символов!<br> <a href=".$_url.">Вернуться</a></center>";?></div></div></div><? include ('footer.php'); exit; }
  17.  
  18.  
  19.  
  20. {
  21. $sIp = getVisitorIP();
  22.  
  23.  
  24. $text = htmlspecialchars(trim(strip_tags(stripslashes($_POST['user_message']))));
  25.  
  26.  
  27. $text = mysql_real_escape_string($_POST['user_message']);
  28. $date_time=date("m.d.Y H:i:s");
  29. mysql_query("insert into `t_messages` (`message`,`data`,`ip`) VALUES ('$text','$date_time','$sIp')");unset($_SESSION['name']); // cняли сессию с формы, удалили текст если юзер неправильно ввел каптчу чтобы заного не вводить
  30.  
  31. echo "<center>Ваше сообщение отправлено в обработку!</center>";
  32.  
  33.  
  34. }}
  35. ?>



А теперь выводим список из БД

PHP:
скопировать код в буфер обмена
  1. <table id="tables"  width="100%">
  2.  
  3. <td id="tables" width="5" align="center">НОМЕР:</td><td id="tables" width="713" align="center" >СООБЩЕНИЕ</td><td id="tables" width="5" align="center">ДАТА</td>
  4. <tr>
  5. <? $sql = mysql_query("SELECT `id`, `message`, `data` FROM t_messages ORDER BY id DESC");
  6.  
  7. while ($text = mysql_fetch_array($sql))
  8.  
  9. {
  10.  
  11. $id_from = $text["id"];
  12. $message = $text["message"];
  13. mysql_real_escape_string($message);  // помогите тут тоже как что лучше и куда писать
  14. $message = mysql_real_escape_string($text["message"]); // помогите тут тоже как что лучше и куда писать
  15. $data = $text["data"];
  16. $data = date("m.d.Y");
  17. $ip = $text["ip"]; ?>
  18. <tr>
  19. <td id="tables" align="center"><?=$text["id"]?></td><td id="tables"><?=htmlspecialchars(trim(strip_tags(stripslashes($text['message']))));?></td><td id="tables" align="center"><?=$data?><? } ?></td></tr>
  20. </table>



Теперь, имея все это, нужно еще написать снизу навигацию, что то типа переход по страницам <1> <2> <3> <вперед> так же эти ссылки вроде как нужно защищать mysql_real_escape_string`ом ? Не знаю как это реализовать вообще..

Вот мой скрипт, обычная гостевая с одним полем - "введите Ваше сообщение", вот мое понимание о защите.. Уважаемые знатоки, пожалуйста, помогите разобраться, что я еще не сделал тут, что сделал не так, а что сделал вообще криво аж на что смотреть страшно...

Как защищать в МОЕМ случае данные и обрабатывать их до ввода в БД?
Как выводить их безопасно ИЗ БД, даже если я руками туда пропишу слеши, хтмл теги, кавычки, или ява скрипт ну и в этом духе..
В общем, как обезопасить сей скрипт? И кому не лень, помогите с навигацией из БД чтобы выводились последние, "свежие" мессаги из БД, чтобы можно было переменной регулировать коилчество выводимых строк на одной странице.
И есчё, как при такой защите сделать так, чтобы в БД можно было отправить допустим кавычку? Слеши не пускаем, а если юзер захочет написать (к примеру) Жанна Д'Арк, чтобы так оно и отобразилось в гостевой? Каким макаром экранировать чтобы в БД сидело безопасно, а выводилось как надо..

Радость

(Отредактировано автором: 20 Сентября, 2014 - 15:41:38)

 
 Top
RickMan
Отправлено: 20 Сентября, 2014 - 20:42:07
Post Id


Участник


Покинул форум
Сообщений всего: 1033
Дата рег-ции: Май 2012  


Помог: 30 раз(а)




http://www.php.su/mysql_real_escape_string - почитай... ей надо передавать не строку запроса, а строку которую надо фильтровать. Тобиш сообщение пользователей. + почитай про xss.
Для защиты от xss советую вот это - http://htmlpurifier[dot]org/
 
 Top
nomak_suntown
Отправлено: 21 Сентября, 2014 - 02:34:43
Post Id


Гость


Покинул форум
Сообщений всего: 65
Дата рег-ции: Июль 2013  


Помог: 0 раз(а)

[+]


по первому ссылю понятно, по xss читал и везде по-разному пишут, я хочу разобраться именно со своим случаем. Вторая ссыль - не понятно что там такое вообще. Так же навигацию сделать не могу.
Вопрос по-прежнему актуален! Улыбка
 
 Top
Мелкий Супермодератор
Отправлено: 21 Сентября, 2014 - 19:07:41
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




nomak_suntown пишет:
именно со своим случаем.

Нет никакого своего случая.
htmlspecialchars на весь вывод в HTML
prepared statements на всё, что передаётся извне в базу.
Всё.


-----
PostgreSQL DBA
 
 Top
nomak_suntown
Отправлено: 23 Сентября, 2014 - 07:56:15
Post Id


Гость


Покинул форум
Сообщений всего: 65
Дата рег-ции: Июль 2013  


Помог: 0 раз(а)

[+]


Что фильтровать перед выводом, а что перед вводом? Что куда применить
 
 Top
Мелкий Супермодератор
Отправлено: 23 Сентября, 2014 - 10:03:34
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Мелкий пишет:
htmlspecialchars на весь вывод в HTML
prepared statements на всё, что передаётся извне в базу.

Что здесь непонятно?


-----
PostgreSQL DBA
 
 Top
esterio
Отправлено: 23 Сентября, 2014 - 13:39:19
Post Id



Активный участник


Покинул форум
Сообщений всего: 5025
Дата рег-ции: Нояб. 2012  
Откуда: Украина, Львов


Помог: 127 раз(а)




nomak_suntown пишет:
<?=htmlspecialchars(trim(strip_tags(stripslashes($text['message']))));?>

этот код в топку не задумиваясь

nomak_suntown пишет:
Что фильтровать перед выводом, а что перед вводом? Что куда применить

на вводе mysql_real_escape_string (но все же лучше prepared statements)
на выводе htmlspecialchars
 
 Top
nomak_suntown
Отправлено: 23 Сентября, 2014 - 14:09:41
Post Id


Гость


Покинул форум
Сообщений всего: 65
Дата рег-ции: Июль 2013  


Помог: 0 раз(а)

[+]


Я не могу понять что такое prepared statements
htmlspecialchars на выводе из БД и все? и вся защита?
А как же strip_tags? а как же ENT_QUOTES ?

Я могу htmlspecialchars использовать при вводе? Не повредит ведь?
 
 Top
esterio
Отправлено: 23 Сентября, 2014 - 14:25:30
Post Id



Активный участник


Покинул форум
Сообщений всего: 5025
Дата рег-ции: Нояб. 2012  
Откуда: Украина, Львов


Помог: 127 раз(а)




nomak_suntown пишет:
Я не могу понять что такое prepared statements

http://php.net/manual/ru/mysqli....d-statements.php
nomak_suntown пишет:
А как же strip_tags? а как же ENT_QUOTES

почитайте наконец документацию
 
 Top
nomak_suntown
Отправлено: 24 Сентября, 2014 - 09:18:19
Post Id


Гость


Покинул форум
Сообщений всего: 65
Дата рег-ции: Июль 2013  


Помог: 0 раз(а)

[+]


Всем спасибо за помощь!!

Только вот вопрос по навигации, там методом GET передаем ссылки на страницы 1.2.3....и тд, их нужно как то обрабатывать?
 
 Top
RickMan
Отправлено: 24 Сентября, 2014 - 09:26:00
Post Id


Участник


Покинул форум
Сообщений всего: 1033
Дата рег-ции: Май 2012  


Помог: 30 раз(а)




Что с этими ссылками происходит после передачи? Они отображаются где-то или как?
 
 Top
nomak_suntown
Отправлено: 24 Сентября, 2014 - 09:26:20
Post Id


Гость


Покинул форум
Сообщений всего: 65
Дата рег-ции: Июль 2013  


Помог: 0 раз(а)

[+]


Народ еще такой вопрос, Дата записывается в таблицу date с типом varchar(50) и записывается функцией $date_time=date("d.m.Y H:i:s"); и в таблице имеет вид 23.09.2014 22:03:08
Правильно ли я делаю? Помню в прошлый раз у меня время было толи юникс код не помню как делается, там просто цифры..

И Как мне вывести не всю такую дату с временем, ( <?=$data?> ) а только лишь дату, без времени? Как ее вытянуть из бд?
где-то прочитал что можо $date = date(m.d.y, $date) как то так, но не работает..
(Добавление)
Да на странице, обыкновенная навигация, думаю как лучше ее сделать (смотрю на другие варианты) но нигде ни в запросах ни при выводе она не фильтруется.
Просто на странице, к примеру, выводится последние 10 записей из БД, и ниже навигация по страницам 1,2,3...далее
(Добавление)
echo date('Y-m-d',$data["date"]); выводит 1970 год...видимо не правильно в Б храню дату и время, записываю тупо как текст...
 
 Top
Sail
Отправлено: 24 Сентября, 2014 - 09:59:29
Post Id



Участник


Покинул форум
Сообщений всего: 1131
Дата рег-ции: Февр. 2014  


Помог: 57 раз(а)




nomak_suntown пишет:
Дата записывается в таблицу date с типом varchar(50) и записывается функцией $date_time=date("d.m.Y H:i:s"); и в таблице имеет вид 23.09.2014 22:03:08
Правильно ли я делаю?

В обще-то, не правильно.
Выбирай.
nomak_suntown пишет:
И Как мне вывести не всю такую дату с временем

При условии использования более правильного формата становятся доступны Функции даты и времени.
Впрочем, это уже тема для другого обсуждения... да и на форуме неоднократно поднималась.

(Отредактировано автором: 29 Сентября, 2014 - 12:40:29)

 
 Top
nomak_suntown
Отправлено: 29 Сентября, 2014 - 10:44:35
Post Id


Гость


Покинул форум
Сообщений всего: 65
Дата рег-ции: Июль 2013  


Помог: 0 раз(а)

[+]


Люди добрые, написал каптчу, простое сложение двух чисел, решил случайно выводить в картинку либо мт_ранд(1,10) + мт_ранд(1,10) либо мт_ранд(1,10) - мт_ранд(1,10)
Вроде все сделал, но не работает.. Вот код
PHP:
скопировать код в буфер обмена
  1. <?
  2. $number_1 = mt_rand(1, 10);
  3. $number_2 = mt_rand(1, 4);
  4. $number_3 = mt_rand(7, 10);
  5. $number_4 = mt_rand(1, 4);
  6.  
  7. $aa = mt_rand(1,10);
  8. if ($aa > 5) { $a = "$number_1 + $number_2";} else
  9. if ($aa < 5) { $a = "$number_3 - $number_4";}
  10.  
  11. imagettftext ($image, 16, 11, 6, 41, $color, "$font", "$a");
  12. $_SESSION['codecpt'] = $a;
  13. header('Cache-Control: no-store, no-cache, must-revalidate');
  14. header('Cache-Control: post-check=0, pre-check=0', FALSE);
  15. header('Pragma: no-cache');?>
  16.  



Не понимаю, если в imagettftext записать $number_1+$number_2 то все работает, а если это внести в переменную $a и записать в imagettftext эту переменную, то ничего не работает.. Так же и с сессией, нужно в сессию записывать само выражение +. А я хочу либо + либо - и те числа которые мне надо заранее подготовить.
Как правильно вписать в строку? Вопрос то простой блин, разобраться не могу((

(Отредактировано автором: 29 Сентября, 2014 - 11:56:20)

 
 Top
KingStar
Отправлено: 29 Сентября, 2014 - 11:58:37
Post Id



Участник


Покинул форум
Сообщений всего: 1889
Дата рег-ции: Авг. 2011  
Откуда: Беларусь


Помог: 69 раз(а)




PHP:
скопировать код в буфер обмена
  1. if ($aa > 5) { $a = $number_1.' + '.$number_2;} else
  2. if ($aa < 5) { $a = $number_3.' - '.$number_4;}


-----
То что программа работает, не означает что она написана правильно!
 
 Top
Страниц (2): [1] 2 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Программирование на PHP »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB