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

Форум PHP

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

 

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

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

тема: Безопасность форм
 
 автор: volodumir   (15.03.2014 в 18:19)   письмо автору
 
 

Здравствуйте,
не первый день разбираюсь вопросом, как обезопасить данные вводимые пользователем в форме, но как грамотно это сделать не знаю. Моих мозгов хватает только чтобы сделать что-то типо этого:
$name = (isset($_POST['name'])) ? addslashes(strip_tags(trim(mysql_real_escape_string($_POST['name'])))) : '';

Далее $name добавляется в базу. Слышал многие профи уже имеют готовые функции для очистки данных полученных от пользователя. Может кто-то поделится, кому не жалко, или внесет свои поправки, так как у меня много форм как цифровых так и строковых.
Заранее благодарен!

  Ответить  
 
 автор: confirm   (15.03.2014 в 18:50)   письмо автору
 
   для: volodumir   (15.03.2014 в 18:19)
 

<?
echo addslashes(mysql_real_escape_string('st"ring'));

  Ответить  
 
 автор: volodumir   (15.03.2014 в 19:09)   письмо автору
 
   для: confirm   (15.03.2014 в 18:50)
 

Ошибку:
Warning: mysql_real_escape_string(): No such file or directory in - on line 3 Warning: mysql_real_escape_string(): A link to the server could not be established in - on line 3

вижу(. Как быть?

  Ответить  
 
 автор: confirm   (15.03.2014 в 19:18)   письмо автору
 
   для: volodumir   (15.03.2014 в 19:09)
 

SQL подключения нет. И мною написано не для того, чтобы так поступать, а для того, если вы пишите "кашу", то хотя бы потрудитесь вывести на экран результат для размышления. И к тому же, если есть проверка данных по условию, то зачем торопиться?

  Ответить  
 
 автор: volodumir   (16.03.2014 в 14:43)   письмо автору
 
   для: confirm   (15.03.2014 в 19:18)
 

На счет каши, понял, виноват. Можно посмотреть, как вы проверяете данные форм от пользователя?

  Ответить  
 
 автор: confirm   (16.03.2014 в 14:56)   письмо автору
 
   для: volodumir   (16.03.2014 в 14:43)
 

Ну как, согласно вашим условиям, которые вы закладываете в логику кода своего.
Ну к примеру, форма зачастую подразумевает диалог, то есть пользователь вполне может ошибиться, следовательно вам нужно будет вернуть форму пользователю для устранения ошибок. И что увидит пользователь, если вы сходу понаставили в его данных слешей?

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

  Ответить  
 
 автор: volodumir   (16.03.2014 в 15:03)   письмо автору
 
   для: confirm   (16.03.2014 в 14:56)
 

Я это понял, спасибо. Можно увидеть ваш сценарий для обработки данных уже для помещения в базу?

  Ответить  
 
 автор: confirm   (16.03.2014 в 15:59)   письмо автору
 
   для: volodumir   (16.03.2014 в 15:03)
 

Да какой сценарий, помнить пока надо о такой пакости как магические кавычки, и лучше отключать их. Зная тип данных, поступайте соответствующее, числовые приводить к intereg, строковые экранировать. Удалять слеши, а вот теги, так нужно знать, что функция может возвратить некорректный результат.

  Ответить  
 
 автор: moonfox   (15.03.2014 в 19:48)   письмо автору
 
   для: confirm   (15.03.2014 в 18:50)
 

простите,а зачем addslashes

mysql_real_escape_string() вызывает библиотечную функцмю MySQL mysql_real_escape_string, которая добавляет обратную косую черту к следующим символам: \x00, \n, \r, \, ', " и \x1a.

  Ответить  
 
 автор: confirm   (15.03.2014 в 19:48)   письмо автору
 
   для: moonfox   (15.03.2014 в 19:48)
 

Читать умеете? Что дальше написано?

  Ответить  
 
 автор: moonfox   (15.03.2014 в 19:55)   письмо автору
 
   для: confirm   (15.03.2014 в 19:48)
 

а дальше это где именно?

  Ответить  
 
 автор: confirm   (15.03.2014 в 20:01)   письмо автору
 
   для: moonfox   (15.03.2014 в 19:55)
 

Вам что еще и ссылку дать, или может все таки потрудитесь сами прочесть и вникнуть?

  Ответить  
 
 автор: psychomc   (15.03.2014 в 19:22)   письмо автору
 
   для: volodumir   (15.03.2014 в 18:19)
 

ерунду вы какую-то слышали. всё зависит от того, какого рода данные заносятся в базу данных. если например это целое число, то имеет смысл делать приведение к целому числу с помощью (int) или intval, если это строка, то имеет смысл обрезать пробелы по краям и т.д. но есть одно правило для всех заносимых данных в базу - их нужно экранировать. делается это с помощью встроенных в php функций. все, что начинается с mysql_, использовать не желательно. лучше разберитесь с PDO или на худой конец c mysqli
addslashes и mysql_real_escape_string это вообще адская бессмысленная смесь.

  Ответить  
 
 автор: moonfox   (15.03.2014 в 19:52)   письмо автору
 
   для: psychomc   (15.03.2014 в 19:22)
 

а скажите, разве в большинстве случаев для строки, не достаточно использовать
htmlspecialchars с ENT_QUOTES


просто не ясно зачем добавлять слеши к ' и "
если это тупо текст, который на странице в виде сущностей будет и так выглядеть как ' и "

  Ответить  
 
 автор: confirm   (15.03.2014 в 20:02)   письмо автору
 
   для: moonfox   (15.03.2014 в 19:52)
 

htmlspecialchars с ENT_QUOTES помещая в базу?

  Ответить  
 
 автор: psychomc   (15.03.2014 в 20:05)   письмо автору
 
   для: moonfox   (15.03.2014 в 19:52)
 

htmlspecialchars используется ТОЛЬКО для вывода пользовательских данных, которые могут представлять опасность и больше ни для чего. никогда не ассоциируйте эту функцию с базой данных

  Ответить  
 
 автор: moonfox   (15.03.2014 в 20:10)   письмо автору
 
   для: psychomc   (15.03.2014 в 20:05)
 

подскажите
а чем плохо поместить в БД &quot; вместо " ?

при условии что в тексте нет и ненужно служебных символов типа ссылок и изображений

  Ответить  
 
 автор: confirm   (15.03.2014 в 20:19)   письмо автору
 
   для: moonfox   (15.03.2014 в 20:10)
 

А если потребуется разбор текста?
Если вы считаете, что htmlspecialchras именно для этих целей самая удобная, то что мелочится тогда, пропускайте через htmlentities, чтобы всем страшно было.

  Ответить  
 
 автор: moonfox   (15.03.2014 в 20:22)   письмо автору
 
   для: confirm   (15.03.2014 в 20:19)
 

да нет, просто у меня целевые поля
для небольших блоков где не предполагалось ничего кроме букв и цифр там одно - html chars
а для содержания самой страницы там - real string

спасибо за ответ.

  Ответить  
 
 автор: confirm   (15.03.2014 в 20:24)   письмо автору
 
   для: moonfox   (15.03.2014 в 20:22)
 

Это значит, что вы не совсем понимаете смысла этой функции, и поступая таким образом просто сознательно вносите в базу мусор, а требуется экранирование.

  Ответить  
 
 автор: moonfox   (15.03.2014 в 20:32)   письмо автору
 
   для: confirm   (15.03.2014 в 20:24)
 

возможно,
и книги были не те в которых это писали
а вообще меня тупо харило потом убирать слеши + сивол &amp;
но мусора нет, не думаю что из возможных записей типа - 1комнатная квартира/Дом
каким то чудом туда полезут кавычки.
и

вот читаю инет нигде непишут использование addslahes с real_escape_string
одновременно.
real_escape_string экранизирует на utf-8 всегда

  Ответить  
 
 автор: confirm   (15.03.2014 в 20:39)   письмо автору
 
   для: moonfox   (15.03.2014 в 20:32)
 

Экранирование, это один лишний байт, а ваше никчемное htmlspecialchars, это несколько байт, вот и мусорите не понятно для чего. К тому же это может сказаться на неудобства при определенных операциях (сами подумайте каких). Вирус, если его не запустить, может так и "прожить вечно в инкубационном периоде". И база может безболезненно хранить "страшные вещи", надо только понимать это, и не чертыхаться от боязни. А экранирование служит не для того, что превратить один байт в длинную козявку для хранения, а для иных целей.

>вот читаю инет нигде непишут использование addslahes с real_escape_string

А где вы тут увидели, что ему кто-то советует применять такое?

  Ответить  
 
 автор: moonfox   (15.03.2014 в 20:41)   письмо автору
 
   для: confirm   (15.03.2014 в 20:39)
 

да я понял понял 1 байт 5 байт
это ясно.
а так же очевидно что не все парятся над этим. это проблема каждого в отдельности

меня больше напрягает когда пользователь используя ckeditor и не понимая ничего соотвесвенно
пихает в БД просто тонну пустых ненужных тегов

для: volodumir (15.03.2014 в 18:19)


<?
echo addslashes(mysql_real_escape_string('st"ring'));

ваш короткий пост ввиде ответа

вот этого я не понял

  Ответить  
 
 автор: confirm   (15.03.2014 в 20:45)   письмо автору
 
   для: moonfox   (15.03.2014 в 20:41)
 

А чего непонятно?
Я ему дал строку кода. Что она выведет на экран?
Можно ли будет по этому выводу понять, что он пишет полнейшую чушь?

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

PS. Визуальные редакторы необходимы когда это нужно, и не противопоказано в базе хранить html-код.

  Ответить  
 
 автор: moonfox   (18.03.2014 в 01:31)   письмо автору
 
   для: confirm   (15.03.2014 в 20:45)
 

я не про хтмл как таковой а про вставки типа

<div>
  <div style="text-align:">
    <span style="color:">
      <span style"font-weight:">
         текст
     </span>
   </span>
  </div>
</div>
<span style="font-size:">&nbsp;</span>
<p>&nbsp;</p>
текст
<h1>текст</h1>
<h1>еще текст</h1>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; текст
&nbsp;


и тд и тп
в таком хаусе и семантика хромает и куча байт вообще левого кода

или еще круче не очищенный от вордовских тегов текст, который порой вызывает в разметке смарти ошибки...

  Ответить  
 
 автор: confirm   (18.03.2014 в 10:11)   письмо автору
 
   для: moonfox   (18.03.2014 в 01:31)
 

Что-то вы тесто месите. Левый такой код или нет, это понятие относительное, а что касается семантики и мусора Word, то htmlspacialchars уж никак не специалист в этом вопросе.

  Ответить  
 
 автор: moonfox   (18.03.2014 в 11:01)   письмо автору
 
   для: confirm   (18.03.2014 в 10:11)
 

а вы прочтите что я написал выше.

  Ответить  
 
 автор: confirm   (18.03.2014 в 11:07)   письмо автору
 
   для: moonfox   (18.03.2014 в 11:01)
 

Прочел и ответил, и если в контексте темы этой, то и не понятно к чему это.

  Ответить  
 
 автор: psychomc   (15.03.2014 в 21:07)   письмо автору
 
   для: moonfox   (15.03.2014 в 20:10)
 

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

  Ответить  
 
 автор: volodumir   (16.03.2014 в 14:55)   письмо автору
 
   для: psychomc   (15.03.2014 в 19:22)
 

За совет с PDO спасибо.

  Ответить  
 
 автор: volodumir   (24.03.2014 в 15:25)   письмо автору
 
   для: volodumir   (15.03.2014 в 18:19)
 

Подскажите, пожалуйста, можно ли средствами PDO проверить тип строки integer?

  Ответить  
 
 автор: psychomc   (24.03.2014 в 15:26)   письмо автору
 
   для: volodumir   (24.03.2014 в 15:25)
 

нет, зачем вам это?

  Ответить  
 
 автор: volodumir   (24.03.2014 в 15:33)   письмо автору
 
   для: psychomc   (24.03.2014 в 15:26)
 

Честно говоря сам не знаю, использовать is_numeric() безопасно непосредственно для $_POST? Перед самим добавлением цифр через PDO.

  Ответить  
 
 автор: psychomc   (24.03.2014 в 16:32)   письмо автору
 
   для: volodumir   (24.03.2014 в 15:33)
 

ВСЕ параметры, которые вы собираетесь использовать в запросах PDO, должны прогоняться через метод execute. забудьте о том строка это или число, просто возьмите за правило. и не имеет никакого значения откуда эти данные

  Ответить  
 
 автор: confirm   (24.03.2014 в 16:58)   письмо автору
 
   для: psychomc   (24.03.2014 в 16:32)
 

Надо бы сказать, что сперва подготавливается запрос, а уже потом....

  Ответить  
 
 автор: Саня   (24.03.2014 в 19:07)   письмо автору
 
   для: psychomc   (24.03.2014 в 16:32)
 

Если не использовать эмулированные подготовленные запросы, то получится деградация производительности.

  Ответить  
 
 автор: psychomc   (24.03.2014 в 19:16)   письмо автору
 
   для: Саня   (24.03.2014 в 19:07)
 

так никто и не говорит, что не использовать. речь то шла конкрентно про параметры

  Ответить  
 
 автор: confirm   (24.03.2014 в 23:26)   письмо автору
 
   для: psychomc   (24.03.2014 в 19:16)
 

Ну в общем да, будет смотреть, значит и в prepare() воткнется, где и разъясняется интересуемое )

  Ответить  
 
 автор: volodumir   (05.04.2014 в 21:21)   письмо автору
 
   для: confirm   (24.03.2014 в 23:26)
 

Скажите, пожалуйста, на сколько данный код безопасен?
//Не именованные метки
try {
$stmt = $db->prepare("INSERT INTO test (label,color) VALUES (?,?)");
$stmt -> execute(array('perfect','green'));
}
catch(PDOException $e){
echo 'Error : '.$e->getMessage();
exit();
}
//stmt - это "дескриптор состояния"
 
//Именованные метки
$stmt = $db->prepare("INSERT INTO test (label,color) VALUES (:label,:color)");
$stmt -> execute(array('label'=>'perfect', 'color'=>'green'));
 
//Еще вариант
$stmt = $db->prepare("INSERT INTO users (firstname, lastname, email) VALUES (:firstname, :lastname, :email)");
$stmt->bindParam(':firstname', $firstname);
$stmt->bindParam(':lastname', $lastname);
$stmt->bindParam(':email', $email);
$firstname = "John";
$lastname = "Smith";
$email = "john@test.com";
$stmt->execute();

  Ответить  
 
 автор: psychomc   (06.04.2014 в 00:49)   письмо автору
 
   для: volodumir   (05.04.2014 в 21:21)
 

код полностью безопасен. вместо

$stmt->bindParam(':firstname', $firstname); 
$stmt->bindParam(':lastname', $lastname); 
$stmt->bindParam(':email', $email); 

лучше отдайте массив методу execute

  Ответить  
 
 автор: volodumir   (07.04.2014 в 14:47)   письмо автору
 
   для: psychomc   (06.04.2014 в 00:49)
 

Спасибо, а почему лучше?

  Ответить  
 
 автор: confirm   (07.04.2014 в 14:53)   письмо автору
 
   для: volodumir   (07.04.2014 в 14:47)
 

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

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

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