Функции PHP для доступа к базе данных и возвращает JSON с


<?php

include_once('../dbInfo.php');

function getReport($user_table) {
    $tables = array(
        "day"        => "p_day", 
        "month"      => "p_month"
        ... etc. .....
    );

    $table = $tables[$user_table];

    if(!$table) {
        die(json_encode(array("error" => "bad table name")));
    }

    $con = getConnection(); // getConnection is in '../dbInfo.php'

    $query = "select * from " . $table;
    $res = mysql_query($query, $con);

    if(!$res) {
        die(json_encode(array("error" => "no results from table")));
    }

    $fields_num = mysql_num_fields($res);
    $fields = array();
    for($i=0; $i < $fields_num; $i++) {
        $field = mysql_fetch_field($res);
        $fields[$i] = $field->name;
    }

    $i = 0;
    while($row = mysql_fetch_array($res)) {
        $rows[$i] = $row;
        $i++;
    }
    $json = array("rows" => $rows, "headers" => $fields);

    $jsontext = json_encode($json);
    return $jsontext;
}

?>

Что этот код делает:

  • доступ к базе данных, выбора строк из таблицы, и возвращение их в качестве сериализованный JSON-объект
  • таблица имя ищется в $столы -- ключи являются приемлемыми пользовательского ввода, значения фактических таблицы или представления имен в базе данных
  • данные выбираются из таблицы
  • данные помещаются в большой хэш
  • хэш-сериализуется в JSON строку и возвращается

Конкретные вопросы меня беспокоят:

  1. безопасность-это мой ДБ информация безопасное соединение? Этот файл находится в корневом каталоге контента, так dbiInfo.phpпри подключении к базе данных информации, не является общедоступным (я так думаю)
  2. безопасности -- я открыт для атак путем внедрения кода SQL? Я создаю SQL-запрос с конкатенацией строк
  3. безопасности -- $user_table является недоверенным ввода; это безопасно? Он используется только в качестве ключа, чтобы искать надежных входных ...
  4. обработка ошибок ... я общался со всеми условиями ошибку
  5. есть много версий PHP-функций -- я использую правильные?

Общие вопросы:

  • следующим конвенциям
  • качество/читаемость/комментарии

Редактировать: указанные данные являются общедоступными, я волнуюсь о ком-то, становится больше чем доступ на чтение к одной из перечисленных таблиц, или любой доступ к любой другой таблице в БД.



11579
4
задан 23 ноября 2011 в 08:11 Источник Поделиться
Комментарии
3 ответа

Это:

$tables = array(
"day" => "p_day",
"month" => "p_month"
... etc. .....
);

$table = $tables[$user_table];

if(!$table) {
die(json_encode(array("error" => "bad table name")));
}

бросят уведомление, если $user_table не является допустимым массива ключ, то вы должны уже опробовали. Переписать как:

$tables = array(
"day" => "p_day",
"month" => "p_month"
... etc. .....
);

if(!array_key_exists($user_table, $tables)) {
die(json_encode(array("error" => "bad table name")));
}

$table = $tables[$user_table];

Я действительно ненавижу его, когда функции умирать(), а в вашем случае нет смысла в этом. Вы могли бы просто сделать:

if(!$table) {
return json_encode(array("error" => "bad table name"));
}

поскольку функция должна вернуть строку в формате JSON. Если вы действительно хотите, чтобы умереть() вы должны сделать это, когда вы вызываете функцию и возвращаемой строке ошибка. Или вы могли бы просто вернуть false в случае возникновения ошибки и необработанного массива, когда все работает, а при вызове функции сделать что-то вроде:

$result = json_encode(getReport("some_table"));

Этак getReport() будет полезна, даже если вам не нужен JSON, закодированные вывода. Но это зависит от вас и как вы на самом деле использовать его.

Как @LokiAstari упоминает mysql_* функции являются устаревшими, и их следует избегать. Я бы пропустить mysqli_* функции и использовать ПДО , который даст вам дополнительный бонус в размере переходе на другую СУБД, если вы когда-нибудь понадобится, и это имеет приятный интерфейс ОО.

За все остальное, я с @LokiAstari.

6
ответ дан 24 ноября 2011 в 03:11 Источник Поделиться

Если вывод в формате JSON, вы можете установить тип содержимого:

Это то, что я nievely делать:

$type   ="text/json";
if ($_GET{"test"})
{
$type = "text/plain";
}
header("Content-type: $type");

Я также использую mysql_query (), но это потому, что мой PHP не очень хорошо (и я не делал). Но, видимо, это модуль DB является устаревшим в пользу "тема(модуль mproved)". http://us.php.net/manual/en/book.mysqli.php


безопасность-это мой ДБ информация безопасное соединение? Этот файл находится в корневом каталоге контента, так dbiInfo.php с информацией базы данных, не является общедоступным (как мне кажется)

Не думаю, что это делает разницу.
Если ваш веб-сервер настроен правильно, он не доставит php-файлах (только выполнить их).


безопасности -- я открыт для атак путем внедрения кода SQL? Я создаю SQL-запрос с конкатенацией строк

Потенциально. Все входные от небезопасном месте должны быть экранированы.

Также вы печатать сообщение об ошибке, содержит информацию о таблицах в ответ. Это, безусловно, проблема безопасности. Единственный ответ пользователю должно быть не сообщение (не почему это не удалось), потенциально с ID, так что вы можете использовать это, чтобы посмотреть его.

Все ошибки должны быть введены в файл журнала (с запроса, который их создал). Затем вы можете использовать идентификатор, указанный в сообщении об ошибке, чтобы посмотреть запрос и сообщение об ошибке было произведено.


безопасности -- $user_table является надежным ввода; это безопасно? Он используется только в качестве ключа, чтобы искать надежных входных ...

И данные из этой таблицы следует избегать перед использованием.


обработка ошибок ... я общался со всеми условиями ошибку
есть много версий PHP-функций -- я использую правильные?

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

$res = mysql_query($query, $con);

if(!$res) {
die(json_encode(array("error" => "no results from table")));
}

// For me this would be
$res = mysql_query($query, $con) or LogErrorAndDie(array("error" => "no results from table"));

4
ответ дан 23 ноября 2011 в 08:11 Источник Поделиться

<?php

include_once('../dbInfo.php');

function resolve_table($user_table) {
$tables = array(
"day" => "p_day",
"month" => "p_month"
... etc. .....
);

// check table exists or return null
return isset($tables[$user_table]) ? $tables[$user_table] : null;
}

function getReport($user_table) {

$output = array();

try {
// move resolve table into separate function so can be reused
$table = resolve_table($user_table);

if(!$table) {
// don't die here, throw and exception instead
throw new Exception("bad table name");
}

$con = getConnection(); // getConnection is in '../dbInfo.php'

// this is safe as $table is a trusted source,
// have added backticks around table name incase it is a reserved word in mysql
// $query = "select * from " . $table
$query = "select * from `$table`";

$res = mysql_query($query, $con);

if(!$res) {
// don't return error here, throw exception
throw new Exception("no results from table");
}

// do you want to handle the case of no results?
if (mysql_num_rows($res) == 0) {
throw new Exception("no results from table");
}

// as others have said, mysqli_ or pdo not mysql_ functions
// see nicer way of doing this below
// $fields_num = mysql_num_fields($res);
// $fields = array();
// for($i=0; $i < $fields_num; $i++) {
// $field = mysql_fetch_field($res);
// $fields[$i] = $field->name;
// }

// declare the array before using
$rows = array();

// not needed
// $i = 0;

// use fetch assoc instead to get an associative array
// while($row = mysql_fetch_array($res)) {
while($row = mysql_fetch_assoc($res)) {
// $rows[$i] = $row;
// $i++;

// [] automatically adds next element to array
$rows[] = $row;
}

// assuming there is at least 1 row in result set (we have tested for 0 rows above)
// we can just get the array_keys of the last $row
$fields = array_keys($row);

// if exceptions have been thrown we will never reach this line
$output = array("rows" => $rows, "headers" => $fields);

} catch (Exception $ex) {
$output['error'] = $ex->getMessage();
}

// not necessary
// $jsontext = json_encode($output);

return json_encode($output);
}

// remove closing php tag (unless something follows), otherwise you may have unwanted whitespace after it, which can cause header or cookie issues
// ? >

-1
ответ дан 26 августа 2013 в 06:08 Источник Поделиться