ALT Linux Team development discussions
 help / color / mirror / Atom feed
From: "Slava Semushin" <slava.semushin@gmail.com>
To: "ALT Devel discussion list" <devel@lists.altlinux.org>
Subject: Re: [devel] [git update] packages/katrin: heads/master
Date: Fri, 13 Jul 2007 13:12:14 +0700
Message-ID: <75e139a00707122312n6b871494ld6e3065e45934c71@mail.gmail.com> (raw)
In-Reply-To: <20070712111909.C16491BF4081@ssh.git.local.altlinux.org>

2007/7/12, Denis Klimov <zver / altlinux.org>:

Это опять я :)))

[...]
> --- a/src/db/db-service/katrin-db-service.c
> +++ b/src/db/db-service/katrin-db-service.c
> @@ -2,28 +2,39 @@
>  #include "katrin-db-service.h"
>  #include "db/dl-db.h"
>  #include "utils/utils.h"
> +
> +#define PROG katrin-db-service

Я не нашел где бы это использовалось. Если оно не используется, то
предлагаю удалить. А если и использовать, то как строку, в таком
случае katrin-db-service нужно заключить в кавычки, я думаю.

[...]
> + * katrin-db-service <action> <params>
> + *
> + * katrin-db-service clean YYYY-MM-DD YYYY-MM-DD [--nullcost]
> + * katrin-db-service sum YYYY-MM-DD YYYY-MM-DD <user|src_port|dst_port|src_addr|dst_addr|proto>
> + *
> + */
>  int main (int argc, char **argv) {
>         #include "conf/conf-katrin.inc"
>         #include "db/dl-db.inc"
> -       int find_all = 0;
> -       int i=0;
> -       for (i = 1; i < argc; i++) {
> -               if (strcmp(argv[i], "--clean") == 0)
> -                       find_all = 1;
> -               else
> -                       break;
> +       int find = 0;
> +       int num_rows = 0;
> +       if (strcmp(argv[1], "clean") == 0) {
> +               debug("enter into clean section");
> +               if (argc - 1 < 2) {
> +                       err("Usage with clean action: katrin-db-service clean YYYY-MM-DD YYYY-MM-DD [--nullcost]");
> +                       return 1;
> +               }
> +               num_rows = cleanstats(argv[2],argv[3]);
> +               info("DB clean: %d rows deleted",num_rows);
>         }
> -
> -
> -       if (argc - i != 2) {
> -               err("Two arguments required: a startdate and enddate. Date format YYYY-MM-DD [HH-MM-SS]\n");
> -               return 1;
> +       if (strcmp(argv[1], "sum") == 0) {
> +               debug("enter into sum section");
> +               if (argc - 1 < 3) {
> +                       err("Usage with sum action: katrin-db-service YYYY-MM-DD YYYY-MM-DD <user|src_port|dst_port|src_addr|dst_addr|proto>");
> +                       return 1;
> +               }
> +               num_rows = sumstats(argv[2],argv[3],argv[4]);
> +               info("DB sum: %d rows sum");
>         }
>
> -       int num_rows = cleanstats(argv[i],argv[i+1]);
> -
> -       info("DB Clean: %d rows deleted",num_rows);
> -
>         return 0;
>  }
>
> diff --git a/src/db/db.h b/src/db/db.h
> index 6cc318b..92d6caf 100644
> --- a/src/db/db.h
> +++ b/src/db/db.h
> @@ -16,6 +16,7 @@ void setblockuser (int userid);
>  void storestat (struct userTraffInfo traffik,int accuracy_stat);
>  struct filterslist *tariffid2filters (int tariffid);
>  int cleanstats(char *startdate, char *enddate);
> +int sumstats(char *startdate, char *enddate, char *opts);
>  struct userslist *tariffid2users(int tariffid);
>  #endif
>
> diff --git a/src/db/dl-db.h b/src/db/dl-db.h
> index 21fc5a1..bb15118 100644
> --- a/src/db/dl-db.h
> +++ b/src/db/dl-db.h
> @@ -22,6 +22,7 @@ void (*setblockuser)(int userid);
>  void (*storestat) (struct userTraffInfo traffik,int accuracy_stat);
>  struct filterslist *(*tariffid2filters) (int tariffid);
>  int (*cleanstats)(char *startdate, char *enddate);
> +int (*sumstats)(char *startdate, char *enddate, char *opts);
>  struct userslist *(*tariffid2users)(int tariffid);
>  #endif
>
> diff --git a/src/db/dl-db.inc b/src/db/dl-db.inc
> index 08fa47a..f952dac 100644
> --- a/src/db/dl-db.inc
> +++ b/src/db/dl-db.inc
> @@ -16,4 +16,5 @@ setblockuser = dlsym(handleLibDB,"setblockuser");
>  storestat = dlsym(handleLibDB,"storestat");
>  tariffid2filters = dlsym(handleLibDB,"tariffid2filters");
>  cleanstats = dlsym(handleLibDB,"cleanstats");
> +sumstats = dlsym(handleLibDB,"sumstats");
>  tariffid2users = dlsym(handleLibDB,"tariffid2users");
> diff --git a/src/db/libkatrin-db-mysql.c b/src/db/libkatrin-db-mysql.c
> index 6dfa17d..0871c92 100644
> --- a/src/db/libkatrin-db-mysql.c
> +++ b/src/db/libkatrin-db-mysql.c
> @@ -321,6 +321,7 @@ dbDisconnectMySQL(&mysqllink);
>  return ret_p;
>  }
>
> +// DB service functions
>  int cleanstats(char *startdate, char *enddate) {
>         debug("cleanstats");
>         MYSQL mysqllink;
> @@ -341,6 +342,43 @@ int cleanstats(char *startdate, char *enddate) {
>         return num_rows;
>  }
>
> +int sumstats(char *startdate, char *enddate, char *opts) {
[...]
> +       if (mysql_real_query(&mysqllink,query,(unsigned int) strlen(query)) !=0 ) {
[...]
> +                       if (mysql_real_query(&mysqllink,query,(unsigned int) strlen(query)) !=0 )
[...]

Здесь и в других файлах я вижу, что вы всегда приводите третий
аргумент ф-ции mysql_real_query() к типу unsigned int.

Вопрос: зачем?

strlen() возвращает тип size_t, который, насколько мне известно, на 32
битах и есть не что иное как unsigned int. Даже если и приводить
результат strlen() то уж точно не к unsigned int, а к unsigned long,
который и ожидает ф-ция mysql_real_query(), согласно описанию на
http://dev.mysql.com/doc/refman/5.0/en/mysql-real-query.html.

[...]

Вот ваш код:

>  int main (int argc, char **argv) {
[...]
> +       if (strcmp(argv[1], "sum") == 0) {
> +               debug("enter into sum section");
> +               if (argc - 1 < 3) {
> +                       err("Usage with sum action: katrin-db-service YYYY-MM-DD YYYY-MM-DD <user|src_port|dst_port|src_addr|dst_addr|proto>");
> +                       return 1;
> +               }
> +               num_rows = sumstats(argv[2],argv[3],argv[4]);
> +               info("DB sum: %d rows sum");
>         }
[...]

А теперь посмотрим на тело ф-ции sumstat():

> +int sumstats(char *startdate, char *enddate, char *opts) {
[...]
> +       sprintf(query,"select userid,sum(bytes),sum(cost) from stats WHERE storetime >= '%s' AND storetime <= '%s' group by userid;",startdate,enddate);
> +       debug("query: %s",query);
> +       if (mysql_real_query(&mysqllink,query,(unsigned int) strlen(query)) !=0 ) {
> +               err("MySQL select query error: %s",mysql_error(&mysqllink));
> +       }
[...]
> +}

Вы что-нибудь видите подозрительное в коде? Я да.

Например, использование sprintf() вместо более безопасного snprintf().
Но это цветочки... В данном коде допускается *ОЧЕНЬ* серьёзная ошибка
в безопасности. Вы используете в SQL-запросе данные, полученные от
пользователя, при этом не проверяя их!!!

Немного по теме: ru.wikipedia.org/wiki/Инъекция_SQL

Совет в данном случае: добавить ф-цию, к примеру, validate_date(),
которая бы получала указатель на строку и проверяла дата это или нет.
И потом везде где ожидается дата проверять аргументы. В качестве
примера можете посмотреть как проверяется дата в ф-ции
is_string_confirm_to_format() в OpenFM:

http://svn.berlios.de/viewcvs/openfm/trunk/src/common.c?rev=75&view=markup


P.S. BTW, char *startdate, char *enddate, char *opts в ф-ции
sumstats() не изменяются, а это значит что их неплохо было бы объявить
как const.


-- 
+ Slava Semushin | slava.semushin @ gmail.com
+ ALT Linux Team | php-coder @ altlinux.ru

       reply	other threads:[~2007-07-13  6:12 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2007-07-13  6:12 ` Slava Semushin [this message]
2007-07-13  8:06   ` Denis Klimov
2007-07-13  8:20     ` Slava Semushin
2007-07-13  8:59     ` [devel] UA: при разработке сетевого ПО _надо_ думать _сперва_ про безопасность! Michael Shigorin
2007-07-13  9:07       ` Denis Klimov
2007-07-13  9:31         ` Anton Farygin
2007-07-13  9:49           ` Denis Klimov
2007-07-14 22:21       ` Денис Смирнов
2007-07-16 10:43     ` [devel] [git update] packages/katrin: heads/master Eugene Prokopiev

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=75e139a00707122312n6b871494ld6e3065e45934c71@mail.gmail.com \
    --to=slava.semushin@gmail.com \
    --cc=devel@lists.altlinux.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link

ALT Linux Team development discussions

This inbox may be cloned and mirrored by anyone:

	git clone --mirror http://lore.altlinux.org/devel/0 devel/git/0.git

	# If you have public-inbox 1.1+ installed, you may
	# initialize and index your mirror using the following commands:
	public-inbox-init -V2 devel devel/ http://lore.altlinux.org/devel \
		devel@altlinux.org devel@altlinux.ru devel@lists.altlinux.org devel@lists.altlinux.ru devel@linux.iplabs.ru mandrake-russian@linuxteam.iplabs.ru sisyphus@linuxteam.iplabs.ru
	public-inbox-index devel

Example config snippet for mirrors.
Newsgroup available over NNTP:
	nntp://lore.altlinux.org/org.altlinux.lists.devel


AGPL code for this site: git clone https://public-inbox.org/public-inbox.git