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

Форум PHP

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

 

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

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

тема: Безопасность создаваемых веб приложений
 
 автор: man1   (27.01.2009 в 23:08)   письмо автору
 
 

Приветствую всех,
Возник вопрос по фильтрации переменных и передаваемых в БД значений. Прочитал несколько ответов от cheops'a, но все же осталась некая неясность по этому поводу.

Как все-таки лучше фильтровать переменные номера страницы, чтобы это было безопасно. Функции is_numeric, как я понимаю, будет достаточно? Ведь если $id != числу, то дальнейшее выполнение скрипта можно прекратить и проверка mysql_escape_string'ом уже не будет иметь смысла... Или я не прав? Или нужно фильтровать все preg_match'ем?

Пример: http://example.com/index.php?page=1 - Как лучше отфильтровать эту переменную?

Аналогичный вопрос и по записи/чтению данных из БД. Достаточно ли для этого применять функции mysql_escape_string (запись в БД, магические кавычки выключены) и htmlspecialchars (чтение из БД).

Также мучает вопрос, когда магические кавычки включены - что использовать для фильтрации? Или ничего не нужно?

Пример:
(Запись данных в БД, данные - ИП Адрес + Порт какого-то сервера)

ИП - ххх.ххх.ххх.ххх или ИМЯ ХОСТА

<?

funtion test_func
($test_func)
{
$test_func mysql_escape_string($test_func);

return 
$test_func;
}

$ip test_func($_GET[ip]);
$port test_func($_GET[ip]);

$add mysql_query("INSERT INTO test VALUES(NULL, '$ip', '$port', UNIX_TIMESTAMP())");

if(
$add) echo 'Добавлено.';
else echo 
'Ошибка.';

?>


Всем заранее спасибо за ответы.

   
 
 автор: man1   (27.01.2009 в 23:13)   письмо автору
 
   для: man1   (27.01.2009 в 23:08)
 

Да, и еще одно. Как безопаснее всего читать/писать html код в/из базу/базы

   
 
 автор: man1   (28.01.2009 в 01:23)   письмо автору
 
   для: man1   (27.01.2009 в 23:13)
 

Товарищи кодеры, где вы все ?))

   
 
 автор: Николай2357   (28.01.2009 в 02:20)   письмо автору
 
   для: man1   (28.01.2009 в 01:23)
 

Все ушли на фронт.
Вместо is_numeric() лучше использовать intval(), а так всё правильно вроде бы.

   
 
 автор: cheops   (28.01.2009 в 12:59)   письмо автору
 
   для: man1   (27.01.2009 в 23:08)
 

>Функции is_numeric, как я понимаю, будет достаточно?
Если у вас числовой параметр, то да, но лучше действительно пропустить его через intval().

>Также мучает вопрос, когда магические кавычки включены - что использовать для
>фильтрации? Или ничего не нужно?
В случае числового параметра можете об этом не думать (после того как убедитесь, что вам передали действительно число), магические кавычки только на строки влияют.

   
 
 автор: man1   (28.01.2009 в 16:46)   письмо автору
 
   для: cheops   (28.01.2009 в 12:59)
 

>>Также мучает вопрос, когда магические кавычки включены - что использовать для
>>фильтрации? Или ничего не нужно?
>В случае числового параметра можете об этом не думать (после того как убедитесь, что вам передали действительно число), магические кавычки только на строки влияют.

А в случае текста и html кода вносимого в базу и читаемого из базы?

   
 
 автор: man1   (29.01.2009 в 03:20)   письмо автору
 
   для: man1   (28.01.2009 в 16:46)
 

Достаточно, ведь так? Да что-ж такое, мужики, ссылку что ли подкиньте где уже ответ дан, если обсуждалось -))

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

   
 
 автор: Николай2357   (29.01.2009 в 08:22)   письмо автору
 
   для: man1   (29.01.2009 в 03:20)
 

Вообще то база должна использоваться для хранения информации без разметки, но коли возникла такая потребность, то нужно исходить из того, что храниться она там будет как обычный текст. Соответственно и все принципы сохраняются. Если записано с тегами, с тегами и будет результат. Не станeте обрабатывать htmlspecialchars на выводе - будет с разметкой, обработаете - получите в виде текста.

   
 
 автор: Trianon   (29.01.2009 в 12:44)   письмо автору
 
   для: Николай2357   (29.01.2009 в 08:22)
 

из БД данные будут получены в виде текста в любом случае.

   
 
 автор: Trianon   (29.01.2009 в 12:48)   письмо автору
 
   для: man1   (29.01.2009 в 03:20)
 

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

   
 
 автор: man1   (29.01.2009 в 14:43)   письмо автору
 
   для: Trianon   (29.01.2009 в 12:48)
 

Стесняюсь спросить, а как узнать нужно ли по синтаксису их обрабатывать или нет?

Если не сложно то приведите, пожалуйста, примеры или ссылку на материал, где про это можно почитать.

   
 
 автор: cheops   (29.01.2009 в 14:47)   письмо автору
 
   для: man1   (28.01.2009 в 16:46)
 

>А в случае текста и html кода вносимого в базу и читаемого из базы?
Это зависит от того, откуда поступает текст или html-код, если со стороны клиента, т.е. из массивов $_GET, $_POST, $_COOKIE - нужен учет режима магических кавычек, если у вас просто строка в PHP-скрипте, например, взятая из файла, то её необходимо обработать при помощи mysql_escape_string() в любом случае - так как режим магических кавычек на такие строки не распространяется.

   
 
 автор: man1   (29.01.2009 в 19:51)   письмо автору
 
   для: cheops   (29.01.2009 в 14:47)
 

У меня на одном хостинге магические кавычки выключены, а на другом включены...
Да, и еще, это ведь получается практически все функции для безопасной работы с mysql? =)

Набросал тут код, чтобы иметь представление с чем имеем дело, вот, посмотрите, вполне ли безопасно ниже написанное =) :

<?

# Скрипт 1. Регистрация аккаунта.

# Функция проверки магических кавычек (Где-то тут на форуме валялась ;) )

function is_qutes_on($info) {

if(!
get_magic_quotes_gpc()) $info mysql_escape_string($info);

return 
$info;

}

# Функция регистрации аккаунта и проверки полей
function reg_user($name$password$mail) {

if(isset(
$name) && isset($password) && isset($mail)) {

$name is_quotes_on($name);
$password is_quotes_on($password);
/* проверка емейла */

}

$insert mysql_query("INSERT INTO test VALUES (NULL, '$name', '$password', '$mail')");
if(
$insert$msg true;
else 
$msg false;

return 
$msg;

}

/* Сама форма регистрации */

echo "
<form action='"
.$_SERVER[PHP_SELF]."' method='post'>
Name: <input type=text name='name'>
Password: <input type=text name='password'>
Mail: <input type=text name='mail'>
<input type='submit'>
</form>
"
;

if(
$submit) {

if(
reg_user($_POST[name], $_POST[password], $_POST[mail]) == true) echo 'Регистрация успешно завершена';
else echo  echo 
'Ошибка';

}

?>

<?

# Скрипт2. Вывод информации об аккаунте.

$select mysql_query("SELECT * FROM test ORDER BY name");

while(
$user mysql_fetch_array($selectMYSQL_ASSOC) {

echo 
"Информиация: ".htmlspecialchars($user[name])." - ".htmlspecialchars($user[password])." - ".htmlspecialchars($user[mail])."<br>";

}


?>


Информация всегда поступает через массивы $_GET или $_POST, бывают также сессии (пароль в мд5 хранится в них, по ним же происходит определение пользователей).

   
 
 автор: man1   (31.01.2009 в 00:12)   письмо автору
 
   для: man1   (29.01.2009 в 19:51)
 

=)

   
 
 автор: Trianon   (31.01.2009 в 01:19)   письмо автору
 
   для: man1   (29.01.2009 в 19:51)
 

самое время порешать задачу 21

   
 
 автор: man1   (31.01.2009 в 21:38)   письмо автору
 
   для: Trianon   (31.01.2009 в 01:19)
 

Решил, посмотрите, верно ли?) http://www.softtime.ru/forum/read.php?id_forum=7&id_theme=62168

   
 
 автор: Trianon   (31.01.2009 в 23:27)   письмо автору
 
   для: man1   (31.01.2009 в 21:38)
 

там же и ответил.

Если Вас интересует мой вариант - можете сравнить с решением N5

   
 
 автор: man1   (01.02.2009 в 20:17)   письмо автору
 
   для: Trianon   (31.01.2009 в 23:27)
 

Интересное решение )

  $sql = "SELECT *, LENGTH(guestname) as len FROM guests WHERE id = ".intval($id); 


Дело в том, что я совсем недавно начал осваивать php, в основном по книгам или мануалам с интернета. Скажите, а есть ли в онлайне какая-нибудь приемлемая по написанию книга в электронном виде по MySql запросам и, желательно, в доступной форме? Или лучше все-таки приобрести ее в магазине?

Я также заметил несколько, вроде бы, весьма занятных книг от студии SoftTime здесь на сайте. (http://softtime.ru/php5/index.php) Могли бы вы подсказать мне, какую из них лучше выбрать, если я все-такие буду покупать ее? Заранее спасибо.

   
Rambler's Top100
вверх

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