使用C处理发布请求数据时的最佳方法,而不消耗不必要的内存

时间:2014-06-27 03:21:08

标签: c http-post

我正在创建一个Web应用程序并且已经在后端工作了。我需要使用appweb中提供的C和API来处理大量的帖子请求数据。

以下是代码:

static void addStudentInformation()
{
    char * average = malloc(30000);
    MprJson * userInput = httpGetParams(getConn());

    char * name;
    strcpy(name,mprLookupJson(userInput, "name"));

    average = computeGrade(mprLookupJson(userInput, "gradeSubject1_1"),   mprLookupJson(userInput, "gradeSubject1_2"), mprLookupJson(userInput, "gradeSubject1_3"));

   //more function calls

}

char * computeGrade(char * grade1, char * grade2, char * grade3)
{
    /*process grade*/
    return average;
}

//more function

如您所见,mprLookupJson返回的值直接用作函数computeGrade中的参数。我想过不将这些值存储在变量中,因为它不需要/在addStudentInformation中使用。我认为没有必要分配/使用内存。现在,我的问题这样做是安全/好的做法吗?是否有可能因此而出现安全问题?对此最好的方法是什么?

谢谢。

1 个答案:

答案 0 :(得分:0)

如果mpfLookupJson(userInput, "name")找不到有效的条目会怎样?比如说,它没有找到条目,因此传递-1。在这种情况下,您的strcpy()可能会崩溃。

如果mpfLookupJson发现某些内容有效,它将在堆上分配一些内存并为其指定指针。在这种情况下,已经分配了内存。如果你为它创建一个更多的指针变量,在我看来它不重要。如果你编写一些特殊的微控制器,也许你必须更多或更少关心一些字节,但可能不在这里。

现在您创建一个指针变量name并尝试复制找到name所指向的值。只要您不为name分配内存指向,就会崩溃。此外:您真的需要mpfLookupJson找到的值的副本吗?你不能使用它吗?

在我看来,这足够,更可靠,更具可读性:

static void addStudentInformation()
{
    char * average = malloc(30000);
    MprJson * userInput = httpGetParams(getConn());

    char * name;
    char * grade1;
    char * grade2;
    char * grade3;

    name = mprLookupJson(userInput, "name");
    grade1 = mprLookupJson(userInput, "gradeSubject1_1");
    grade2 = mprLookupJson(userInput, "gradeSubject1_2");
    grade3 = mprLookupJson(userInput, "gradeSubject1_3");

    if (name <= 0 || grade1 <= 0 || grade2 <= 0 || grade3 <= 0 ) {
        // handle error and / or abort 
    } 

    average = computeGrade(grade1, grade2, grade3);

    //more function calls

    ...
 }

然后,在函数结束后会发生什么?如果记忆对你很重要,请确保以正确的方式解除所有内容。

这些是安全问题而非安全问题。安全性从有人滥用您的代码获取管理员权限或使进程崩溃或内存泛滥的地方开始。要检查的第一点是mprLookupJson确切地做了什么,过滤了篡改的userInput有多好以及namegrade1,{{1}最轻微的方式是无效的。由于这个原因,你需要很好的代码。

希望这些建议是一个好的开始: - )