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

Форум PHP

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

 

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

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

тема: Будет ли безопасна такая функция?
 
 автор: man1   (14.04.2012 в 21:32)   письмо автору
 
 

Приветствую всех.

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

Набросал одну функцию для безопасного вывода данных из БД. На сколько только она безопасна на ваш взгляд?

function auth_data(){
global $id_login;

//$id_login = (int) $id_login - фильтруется вне данной функции
//hsc = stripslashes(htmlspecialchars($data,ENT_QUOTES));
//fetch = аналог mysql_fetch_array();

$data=fetch("SELECT * FROM logins WHERE id_login='{$id_login}'");

foreach($data as $user_key=>$user_data) {

if(is_numeric($data[$user_key])) $safe_data[$user_key]=(int)$user_data;
else $safe_data[$user_key]=hsc($user_data);

}
return($safe_data);
}

  Ответить  
 
 автор: tvv123456   (14.04.2012 в 22:38)   письмо автору
 
   для: man1   (14.04.2012 в 21:32)
 

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



//$id_login = (int) $id_login -расскоментировать
//а лучше всего так:
$data=fetch("SELECT * FROM logins WHERE id_login=".(int)$id_login);

это если в fetch у вас не проверяются внешние данные для запроса

  Ответить  
 
 автор: man1   (15.04.2012 в 00:02)   письмо автору
 
   для: tvv123456   (14.04.2012 в 22:38)
 

Нет, с $id_login - все хорошо. Он фильтруется, но в другом месте. Там все точно так же, как Вы и написали: $id_login=(int)$id_login;

Так как, на Ваш взгляд, эта функция вполне безопасна для фильтрации выходных данных и дальнейшее их отображение на странице?

Например вот в таком скрипте:
<?php

$user
=auth_data();

echo 
"<table>
<tr><td>Имя: </td><td>"
.$user['name']."</td></tr>
<tr><td>Телефон: </td><td>"
.$user['tel']."</td></tr>
<tr><td>Увлечения: </td><td>"
.$user['hobbies']."</td></tr>
<tr><td colspan='100%'>О себе: </td></tr>
<tr><td colspan='100%'>"
.$user['about']."</td></tr>
</table>"
;

?>

  Ответить  
 
 автор: tvv123456   (15.04.2012 в 00:11)   письмо автору
 
   для: man1   (15.04.2012 в 00:02)
 

ну, во-первых, (int) это не фильтрация
Обьясню почему я выбираю вот такоей метод:

<?
$res 
mysql_query("Select * FORM table WHERE id=".(int)$user_id); // для целочисленных

$res =mysql_query("Select * FORM table WHERE id='".mysql_real_escape_string($user_id)."'"); // для строковых


Все в самих запросах, и не нужно волноваться что там где=то 60-ью строками ранее забыл подстраховаться, и аудит кода на наличие уязвимостей проще делать
Во-вторых,
>Нет, с $id_login - все хорошо. Он фильтруется, но в другом месте
И как это можно узнать? Вы спрашиваете о безопасности а сами оставляете некоторое на чтение мыслей

Насчет того что вы написали:
неплохо бы все переменные выводимые на экран обработать при помощи функции htmlspecialchars:

<?
$user
=auth_data(); //потому что Я ВИДЕЛ  в предоставленном коде, это небезопасно

echo "<table>
<tr><td>Имя: </td><td>"
.htmlspecialchars($user['name'])."</td></tr>
<tr><td>Телефон: </td><td>"
.htmlspecialchars($user['tel'])."</td></tr>
<tr><td>Увлечения: </td><td>"
.htmlspecialchars($user['hobbies'])."</td></tr>
<tr><td colspan='100%'>О себе: </td></tr>
<tr><td colspan='100%'>"
.htmlspecialchars($user['about'])."</td></tr>
</table>"
;

?>

А то неровен час и XSS может случиться

  Ответить  
 
 автор: man1   (15.04.2012 в 00:37)   письмо автору
 
   для: tvv123456   (15.04.2012 в 00:11)
 

tvv123456, видимо мы друг друга не совсем поняли. Сейчас покажу как выглядит все вместе для наглядности.

$user=auth_data(); //потому что Я ВИДЕЛ  в предоставленном коде, это небезопасно 


Данные в этой функции фильтруются, в цикле идет фильтрация:

<?
foreach($data as $user_key=>$user_data) {

if(
is_numeric($data[$user_key])) $safe_data[$user_key]=(int)$user_data;
else 
$safe_data[$user_key]=[b]hsc($user_data);[/b]


?>

Меня интересует только вопрос: безопасен ли вывод данных через мою функцию, auth_data()?

<?php

function hsc($data) { return stripslashes(htmlspecialchars($data,ENT_QUOTES)); }
function 
fetch($data) { return mysql_fetch_array(mysql_query($data),MYSQL_ASSOC); } 

function 
check_auth() {
global 
$id_login;

// ...
// проверка на авторизацию юзера

if($is_auth$id_login=(int)$data['id_login'];
else 
$id_login=0;

return 
$id_login;
}

function 
auth_data(){
global 
$id_login;

//$id_login = (int) $id_login - фильтруется вне данной функции
//hsc = stripslashes(htmlspecialchars($data,ENT_QUOTES));
//fetch = аналог mysql_fetch_array();

$data=fetch("SELECT * FROM logins WHERE id_login='{$id_login}'");

foreach(
$data as $user_key=>$user_data) {

if(
is_numeric($data[$user_key])) $safe_data[$user_key]=(int)$user_data;
else 
$safe_data[$user_key]=hsc($user_data);

}
return(
$safe_data);
}

//------------------------ Вывод информации

$id_login=check_auth();
$user=auth_data();

echo 
"<table>
<tr><td>Имя: </td><td>"
.$user['name']."</td></tr>
<tr><td>Телефон: </td><td>"
.$user['tel']."</td></tr>
<tr><td>Увлечения: </td><td>"
.$user['hobbies']."</td></tr>
<tr><td colspan='100%'>О себе: </td></tr>
<tr><td colspan='100%'>"
.$user['about']."</td></tr>
</table>"


?>

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

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