|
|
|
| Есть функция:
<?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. */
?>
|
| |
|
|
|
|
|
|
|
для: Maxam
(30.10.2012 в 03:40)
| | htmlspecialchars - это при выводе из базы, а при записи в базу mysql_real_escape_string(). | |
|
|
|
|
|
|
|
для: confirm
(30.10.2012 в 03:51)
| | А по общей логике не страшно:
<?php
$_POST['name']=function check($_POST['name']);
?>
|
| |
|
|
|
|
|
|
|
для: Maxam
(30.10.2012 в 04:09)
| | Какая разница в каком месте скрипта своего вы будете обрабатывать? К безопасности это отношения не имеет.
А вот что касается логики, то $_POST['name'] = check($_POST['name']);
И если это ради одного ключа, то никакой логики нет в объявлении функции.
$_POST - это массив, и обработать его элементы (если нет вложений) перед записью в базу можно сразу все, вызовом готовых функций - $_POST = array_map('mysql_real_escape_string', $_POST). Либо укажите свою функцию (вместо mysql_real_escape_string), которая помимо экранирования что-то еще должна сделать. | |
|
|
|
|
|
|
|
для: confirm
(30.10.2012 в 07:18)
| | Здорово, не знал о array_map.
У меня там целый арсенал сделан проверок.
Теперь в одну строчку сделаю.
Большое спасибо.
Вот только вопрос ещё.
$_POST['name']='text';
$_GET['name']='text';
|
Достаточно ли проверить text, или нужно проверять ещё и name? | |
|
|
|
|
|
|
|
для: Maxam
(30.10.2012 в 13:33)
| | Что значит проверять?
Проверять можно следующее - есть ли такой пользователь в базе, содержит ли ваш тест чего-то из вами запрещенного, и т.п., и т.д.. А mysql_real_escape_string - экранирует специальные символы в строках для использования в выражениях SQL, и коли вы писали о помещении в базу, то об этой функции и было сказано.
То что не знаете о функции, это плохо, а чтобы знать, надо заглядывать сюда, где можно и скачать это руководство и всегда иметь под рукой. | |
|
|
|
|
|
|
|
для: confirm
(30.10.2012 в 13:38)
| | mysql_real_escape_string подойдёт для любых типов полей в mysql? INT, TINYINT, VARCHAR, TEXT и т.д.? | |
|
|
|
|
|
|
|
для: Maxam
(30.10.2012 в 13:42)
| | INT и TINYINT, это поля хранящие числа, и экранировать их не к чему, но если вы пройдетесь по числам функцией mysql_real_escape_string перед записью, то страшного не произойдет, в базу будет помещено все равно число.
А вот числовой параметр в условиях запроса нужно приводить к этому типу, и если это массив таких данных, например, для оператора IN, то опять таки поможет функция array_map. | |
|
|
|
|
|
|
|
для: confirm
(30.10.2012 в 13:38)
| | Простите, что снова с вопросом.
Вот вроде сделал все проверки правильно, плюс теперь перед запросом mysql поставил:
$_POST=array_map('mysql_real_escape_string',$_POST);
|
Правда, теперь мне нужно после запроса к mysql вновь использовать некоторые переменные. Как от них убрать все это экранирование?
Подумал использовать stripslashes, но она обратная от addslashes, поэтому неуверен. А addslashes вместо mysql_real_escape_string не подойдёт? | |
|
|
|
|
|
|
|
для: Maxam
(01.11.2012 в 15:40)
| | Вы можете присвоить результат этого выражения другой переменной, оставив таким образом входной массив неизменным.
Ну а чтобы понять, что нужно сделать чтобы убрать результат работы mysql_real_escape_string():
а) прочесть внимательно о назначении данной функции (вопрос "А addslashes вместо..." отпадет сам собою), что она делает.
б) экранируйте ею тестовую строку с выводом на экран - поймете что надо сделать, чтобы "Как от них убрать все это экранирование?"
И самое главное - я вам давал ссылку в руководстве на раздел касающийся безопасности, изучать, причем все и досконально, пока не поймете. А это только малая толика данного вопроса. | |
|
|
|
|
|
|
|
для: confirm
(01.11.2012 в 16:11)
| | Спасибо. | |
|
|
|
|
|
|
|
для: confirm
(30.10.2012 в 03:51)
| | А addslashes() не то же самое? | |
|
|
|
|
|
|
|
для: Maxam
(30.10.2012 в 03:40)
| | Можно ВООБЩЕ не обрабатывать никакие переменные GET и POST, если я их не собираюсь никуда записывать? Только, например, использовать в собственных функциях и кодах. | |
|
|
|
|
|
|
|
для: Maxam
(30.10.2012 в 16:12)
| | Нельзя, так как, боже упаси, ваша функция использует эти данные как параметры подстановки, указатели подключений, ли прямо подключаются и т.д., тогда взлом неизбежен. | |
|
|
|
|
|
|
|
для: confirm
(30.10.2012 в 16:17)
| | Что мне нужно сделать перед этим кодом?
<?php
// ...
for($i=$_GET['page']*10; $i<=$_GET['page']*10+10; $i++)
{
// ...
}
// ...
?>
|
| |
|
|
|
|
|
|
|
для: Maxam
(30.10.2012 в 16:19)
| | А вы выполните вот такое:
<?
$_GET['page'] = 'тра-ла-ла';
echo $_GET['page']*10;
|
Ожидаем для вас результат?
Вы вопрос задаете - надо ли? Ответ - надо, а как, это уже зависит и от данных, и для чего они. | |
|
|
|
|
|
|
|
для: confirm
(30.10.2012 в 16:26)
| | Проверить, что там должно быть число - это понятно. Я к тому, что в данном случае не нужно никаких экранаций, переводов символов и прочего? | |
|
|
|
|
|
|
|
для: Maxam
(30.10.2012 в 16:48)
| | Для данной операции, конечно нет, ибо от строки останется 0.
Но тут не столь проверка на ноль нужна, сколь приведение типа к integer с последующей проверкой на величину вами ожидаемую, если это нужно или важно. | |
|
|
|
|
|
|
|
для: confirm
(30.10.2012 в 16:53)
| | Огромное спасибо. Буду переписывать все строки в php :) | |
|
|
|
|
|
|
|
для: Maxam
(30.10.2012 в 03:40)
| | Я правильно сделал вывод?
1) Если я собираюсь использовать переменную для записи в MySQL -> mysql_real_escape_string.
2) Если я собираюсь использовать переменную для вывода на страницу (echo) -> htmlspecialchars.
3) Если я собираюсь использовать переменную после вывода из MySQL -> stripslashes.
4) Если я собираюсь использовать переменную после вывода из MySQL, а потом для вывода на страницу (echo) -> вначале stripslashes, потом htmlspecialchars.
Так? | |
|
|
|
|
|
|
|
для: Maxam
(30.10.2012 в 16:14)
| | Сперва сюда, и обязательно с этим материалом ознакомиться, ибо ваши вопросы, это нечто поверхностное и вами не понимаемое - зачем, и что к чему. | |
|
|
|