|
|
|
| Приветствую всех.
Сейчас пишу один скрипт, в нем постоянно требуется вытаскивать все данные профиля пользователя.
Набросал одну функцию для безопасного вывода данных из БД. На сколько только она безопасна на ваш взгляд?
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);
}
|
| |
|
|
|
|
|
|
|
для: man1
(14.04.2012 в 21:32)
| | ну учитывая что полезная строка закомментирована, то скорей всего инъекция в свободном пользовании
//$id_login = (int) $id_login -расскоментировать
//а лучше всего так:
$data=fetch("SELECT * FROM logins WHERE id_login=".(int)$id_login);
|
это если в fetch у вас не проверяются внешние данные для запроса | |
|
|
|
|
|
|
|
для: 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>";
?>
|
| |
|
|
|
|
|
|
|
для: 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 может случиться | |
|
|
|
|
|
|
|
для: 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>";
?>
|
| |
|
|
|