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

Форум PHP

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

 

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

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

тема: Безопасно ли?
 
 автор: Maxam   (30.10.2012 в 03:40)   письмо автору
 
 

Есть функция:
<?php
function check($name)
{
     
$name=htmlspecialchars($name);
     
$name=stripslashes($name);
}
?>

Есть код на странице, после этой функции, которая там где-то выше подключена через include:
<?php
$_POST
['name']=function check($_POST['name']);
/* Операции с переменной $_POST['name'], включая запись в mysql. */
?>

Это безопасно? Или лучше делать каждую переменную отдельно вручную вверху как:
<?php
$_POST
['name']=htmlspecialchars($_POST['name']);
$_POST['name']=stripslashes($_POST['name'];
/* Операции с переменной $_POST['name'], включая запись в mysql. */
?>

  Ответить  
 
 автор: confirm   (30.10.2012 в 03:51)   письмо автору
 
   для: Maxam   (30.10.2012 в 03:40)
 

htmlspecialchars - это при выводе из базы, а при записи в базу mysql_real_escape_string().

  Ответить  
 
 автор: Maxam   (30.10.2012 в 04:09)   письмо автору
 
   для: confirm   (30.10.2012 в 03:51)
 

А по общей логике не страшно:
<?php
$_POST
['name']=function check($_POST['name']);
?>

  Ответить  
 
 автор: confirm   (30.10.2012 в 07:18)   письмо автору
 
   для: Maxam   (30.10.2012 в 04:09)
 

Какая разница в каком месте скрипта своего вы будете обрабатывать? К безопасности это отношения не имеет.
А вот что касается логики, то $_POST['name'] = check($_POST['name']);
И если это ради одного ключа, то никакой логики нет в объявлении функции.
$_POST - это массив, и обработать его элементы (если нет вложений) перед записью в базу можно сразу все, вызовом готовых функций - $_POST = array_map('mysql_real_escape_string', $_POST). Либо укажите свою функцию (вместо mysql_real_escape_string), которая помимо экранирования что-то еще должна сделать.

  Ответить  
 
 автор: Maxam   (30.10.2012 в 13:33)   письмо автору
 
   для: confirm   (30.10.2012 в 07:18)
 

Здорово, не знал о array_map.
У меня там целый арсенал сделан проверок.
Теперь в одну строчку сделаю.
Большое спасибо.

Вот только вопрос ещё.
$_POST['name']='text';
$_GET['name']='text';

Достаточно ли проверить text, или нужно проверять ещё и name?

  Ответить  
 
 автор: confirm   (30.10.2012 в 13:38)   письмо автору
 
   для: Maxam   (30.10.2012 в 13:33)
 

Что значит проверять?
Проверять можно следующее - есть ли такой пользователь в базе, содержит ли ваш тест чего-то из вами запрещенного, и т.п., и т.д.. А mysql_real_escape_string - экранирует специальные символы в строках для использования в выражениях SQL, и коли вы писали о помещении в базу, то об этой функции и было сказано.
То что не знаете о функции, это плохо, а чтобы знать, надо заглядывать сюда, где можно и скачать это руководство и всегда иметь под рукой.

  Ответить  
 
 автор: Maxam   (30.10.2012 в 13:42)   письмо автору
 
   для: confirm   (30.10.2012 в 13:38)
 

mysql_real_escape_string подойдёт для любых типов полей в mysql? INT, TINYINT, VARCHAR, TEXT и т.д.?

  Ответить  
 
 автор: confirm   (30.10.2012 в 13:54)   письмо автору
 
   для: Maxam   (30.10.2012 в 13:42)
 

INT и TINYINT, это поля хранящие числа, и экранировать их не к чему, но если вы пройдетесь по числам функцией mysql_real_escape_string перед записью, то страшного не произойдет, в базу будет помещено все равно число.
А вот числовой параметр в условиях запроса нужно приводить к этому типу, и если это массив таких данных, например, для оператора IN, то опять таки поможет функция array_map.

  Ответить  
 
 автор: Maxam   (01.11.2012 в 15:40)   письмо автору
 
   для: confirm   (30.10.2012 в 13:38)
 

Простите, что снова с вопросом.

Вот вроде сделал все проверки правильно, плюс теперь перед запросом mysql поставил:
$_POST=array_map('mysql_real_escape_string',$_POST);

Правда, теперь мне нужно после запроса к mysql вновь использовать некоторые переменные. Как от них убрать все это экранирование?

Подумал использовать stripslashes, но она обратная от addslashes, поэтому неуверен. А addslashes вместо mysql_real_escape_string не подойдёт?

  Ответить  
 
 автор: confirm   (01.11.2012 в 16:11)   письмо автору
 
   для: Maxam   (01.11.2012 в 15:40)
 

Вы можете присвоить результат этого выражения другой переменной, оставив таким образом входной массив неизменным.
Ну а чтобы понять, что нужно сделать чтобы убрать результат работы mysql_real_escape_string():
а) прочесть внимательно о назначении данной функции (вопрос "А addslashes вместо..." отпадет сам собою), что она делает.
б) экранируйте ею тестовую строку с выводом на экран - поймете что надо сделать, чтобы "Как от них убрать все это экранирование?"

И самое главное - я вам давал ссылку в руководстве на раздел касающийся безопасности, изучать, причем все и досконально, пока не поймете. А это только малая толика данного вопроса.

  Ответить  
 
 автор: Maxam   (01.11.2012 в 22:32)   письмо автору
 
   для: confirm   (01.11.2012 в 16:11)
 

Спасибо.

  Ответить  
 
 автор: Maxam   (30.10.2012 в 16:21)   письмо автору
 
   для: confirm   (30.10.2012 в 03:51)
 

А addslashes() не то же самое?

  Ответить  
 
 автор: Maxam   (30.10.2012 в 16:12)   письмо автору
 
   для: Maxam   (30.10.2012 в 03:40)
 

Можно ВООБЩЕ не обрабатывать никакие переменные GET и POST, если я их не собираюсь никуда записывать? Только, например, использовать в собственных функциях и кодах.

  Ответить  
 
 автор: confirm   (30.10.2012 в 16:17)   письмо автору
 
   для: Maxam   (30.10.2012 в 16:12)
 

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

  Ответить  
 
 автор: Maxam   (30.10.2012 в 16:19)   письмо автору
 
   для: confirm   (30.10.2012 в 16:17)
 

Что мне нужно сделать перед этим кодом?
<?php
// ...
for($i=$_GET['page']*10$i<=$_GET['page']*10+10$i++)
{
     
// ...
}
// ...
?>

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

А вы выполните вот такое:
<?
$_GET
['page'] = 'тра-ла-ла';
echo 
$_GET['page']*10;

Ожидаем для вас результат?

Вы вопрос задаете - надо ли? Ответ - надо, а как, это уже зависит и от данных, и для чего они.

  Ответить  
 
 автор: Maxam   (30.10.2012 в 16:48)   письмо автору
 
   для: confirm   (30.10.2012 в 16:26)
 

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

  Ответить  
 
 автор: confirm   (30.10.2012 в 16:53)   письмо автору
 
   для: Maxam   (30.10.2012 в 16:48)
 

Для данной операции, конечно нет, ибо от строки останется 0.
Но тут не столь проверка на ноль нужна, сколь приведение типа к integer с последующей проверкой на величину вами ожидаемую, если это нужно или важно.

  Ответить  
 
 автор: Maxam   (30.10.2012 в 17:07)   письмо автору
 
   для: confirm   (30.10.2012 в 16:53)
 

Огромное спасибо. Буду переписывать все строки в php :)

  Ответить  
 
 автор: Maxam   (30.10.2012 в 16:14)   письмо автору
 
   для: Maxam   (30.10.2012 в 03:40)
 

Я правильно сделал вывод?

1) Если я собираюсь использовать переменную для записи в MySQL -> mysql_real_escape_string.

2) Если я собираюсь использовать переменную для вывода на страницу (echo) -> htmlspecialchars.

3) Если я собираюсь использовать переменную после вывода из MySQL -> stripslashes.

4) Если я собираюсь использовать переменную после вывода из MySQL, а потом для вывода на страницу (echo) -> вначале stripslashes, потом htmlspecialchars.

Так?

  Ответить  
 
 автор: confirm   (30.10.2012 в 16:20)   письмо автору
 
   для: Maxam   (30.10.2012 в 16:14)
 

Сперва сюда, и обязательно с этим материалом ознакомиться, ибо ваши вопросы, это нечто поверхностное и вами не понимаемое - зачем, и что к чему.

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

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