静态代码分析 - 查找未清除/未实现的变量

时间:2017-06-21 08:27:07

标签: algorithm static-analysis

尝试编写此静态代码分析伪代码/算法。

有两种情况:

安全(输入 - $ sort - 已消毒/污染)

 <?php
      $sort = htmlentities($_GET['sort']);


      if($sort=="asc")
      {
        echo 'Sorting: '.$sort;
      }elseif($sort=="desc"){
        echo 'Sorting: '.$sort;
      }else{
       echo $sort;
      }

哪个产生这个树:

{
  "token_name": "C_ROOT",
  "token_group": "C_BLOCK",
  "group": true,
  "body": [
    [
      {
        "token_name_org": "T_VARIABLE",
        "token": 320,
        "value": "sort",
        "line": 2,
        "token_group": "VARIABLES",
        "token_name": "C_VARIABLE"
      },
      {
        "token_name_org": "C_ASSIGNMENT_EQUAL",
        "line": 2,
        "value": "=",
        "token": "VALUE",
        "token_group": "ASSIGNMENTS"
      },
      {
        "token_name_org": "T_STRING",
        "token": 319,
        "value": "htmlentities",
        "line": 2,
        "token_group": "FUNCTIONS",
        "token_name": "C_FUNCTION_INT",
        "args": [
          [
            {
              "token_name_org": "T_VARIABLE",
              "token": 320,
              "value": "_GET",
              "line": 2,
              "token_group": "VARIABLES",
              "token_name": "C_VARIABLE",
              "args": [
                [
                  {
                    "token_name_org": "T_CONSTANT_ENCAPSED_STRING",
                    "token": 323,
                    "value": "sort",
                    "line": 2,
                    "token_group": "STRINGS",
                    "token_name": "C_STRING"
                  }
                ]
              ]
            }
          ]
        ]
      }
    ],
    [
      {
        "token_name_org": "T_IF",
        "token": 327,
        "value": "if",
        "line": 5,
        "token_group": "CONDITIONS",
        "token_name": "C_IF",
        "conditions": [
          [
            {
              "token_name_org": "T_VARIABLE",
              "token": 320,
              "value": "sort",
              "line": 5,
              "token_group": "VARIABLES",
              "token_name": "C_VARIABLE"
            },
            {
              "token_name_org": "T_IS_EQUAL",
              "token": 289,
              "value": "==",
              "line": 5,
              "token_group": "RELOPERATOR",
              "token_name": "C_IS_EQUAL"
            },
            {
              "token_name_org": "T_CONSTANT_ENCAPSED_STRING",
              "token": 323,
              "value": "asc",
              "line": 5,
              "token_group": "STRINGS",
              "token_name": "C_STRING"
            }
          ]
        ],
        "body": [
          [
            {
              "token_name_org": "T_ECHO",
              "token": 328,
              "value": "echo",
              "line": 7,
              "token_group": "FUNCTIONS",
              "token_name": "C_ECHO",
              "args": [
                [
                  {
                    "token_name_org": "T_CONSTANT_ENCAPSED_STRING",
                    "token": 323,
                    "value": "Sorting: ",
                    "line": 7,
                    "token_group": "STRINGS",
                    "token_name": "C_STRING"
                  },
                  {
                    "token_name_org": "T_VARIABLE",
                    "token": 320,
                    "value": "sort",
                    "line": 7,
                    "token_group": "VARIABLES",
                    "token_name": "C_VARIABLE"
                  }
                ]
              ]
            }
          ]
        ]
      }
    ],
    [
      {
        "token_name_org": "T_ELSEIF",
        "token": 308,
        "value": "elseif",
        "line": 8,
        "token_group": "CONDITIONS",
        "token_name": "C_ELSEIF",
        "conditions": [
          [
            {
              "token_name_org": "T_VARIABLE",
              "token": 320,
              "value": "sort",
              "line": 8,
              "token_group": "VARIABLES",
              "token_name": "C_VARIABLE"
            },
            {
              "token_name_org": "T_IS_EQUAL",
              "token": 289,
              "value": "==",
              "line": 8,
              "token_group": "RELOPERATOR",
              "token_name": "C_IS_EQUAL"
            },
            {
              "token_name_org": "T_CONSTANT_ENCAPSED_STRING",
              "token": 323,
              "value": "desc",
              "line": 8,
              "token_group": "STRINGS",
              "token_name": "C_STRING"
            }
          ]
        ],
        "body": [
          [
            {
              "token_name_org": "T_ECHO",
              "token": 328,
              "value": "echo",
              "line": 9,
              "token_group": "FUNCTIONS",
              "token_name": "C_ECHO",
              "args": [
                [
                  {
                    "token_name_org": "T_CONSTANT_ENCAPSED_STRING",
                    "token": 323,
                    "value": "Sorting: ",
                    "line": 9,
                    "token_group": "STRINGS",
                    "token_name": "C_STRING"
                  },
                  {
                    "token_name_org": "T_VARIABLE",
                    "token": 320,
                    "value": "sort",
                    "line": 9,
                    "token_group": "VARIABLES",
                    "token_name": "C_VARIABLE"
                  }
                ]
              ]
            }
          ]
        ]
      }
    ],
    [
      {
        "token_name_org": "T_ELSE",
        "token": 309,
        "value": "else",
        "line": 10,
        "token_group": "FUNCTIONS",
        "token_name": "C_ELSE",
        "body": [
          [
            {
              "token_name_org": "T_ECHO",
              "token": 328,
              "value": "echo",
              "line": 11,
              "token_group": "FUNCTIONS",
              "token_name": "C_ECHO",
              "args": [
                [
                  {
                    "token_name_org": "T_VARIABLE",
                    "token": 320,
                    "value": "sort",
                    "line": 11,
                    "token_group": "VARIABLES",
                    "token_name": "C_VARIABLE"
                  }
                ]
              ]
            }
          ]
        ]
      }
    ]
  ]
}

和第二个,不安全,$ sort没有消毒/污染:

<?php
  $sort = $_GET['sort'];


  if($sort=="asc")
  {
    echo 'Sorting: '.$sort;
  }elseif($sort=="desc"){
    echo 'Sorting: '.$sort;
  }else{
   echo $sort;
  }
产生这棵树的

{
  "token_name": "C_ROOT",
  "token_group": "C_BLOCK",
  "group": true,
  "body": [
    [
      {
        "token_name_org": "T_VARIABLE",
        "token": 320,
        "value": "sort",
        "line": 2,
        "token_group": "VARIABLES",
        "token_name": "C_VARIABLE"
      },
      {
        "token_name_org": "C_ASSIGNMENT_EQUAL",
        "line": 2,
        "value": "=",
        "token": "VALUE",
        "token_group": "ASSIGNMENTS"
      },
      {
        "token_name_org": "T_VARIABLE",
        "token": 320,
        "value": "_GET",
        "line": 2,
        "token_group": "VARIABLES",
        "token_name": "C_VARIABLE",
        "args": [
          [
            {
              "token_name_org": "T_CONSTANT_ENCAPSED_STRING",
              "token": 323,
              "value": "sort",
              "line": 2,
              "token_group": "STRINGS",
              "token_name": "C_STRING"
            }
          ]
        ]
      }
    ],
    [
      {
        "token_name_org": "T_IF",
        "token": 327,
        "value": "if",
        "line": 5,
        "token_group": "CONDITIONS",
        "token_name": "C_IF",
        "conditions": [
          [
            {
              "token_name_org": "T_VARIABLE",
              "token": 320,
              "value": "sort",
              "line": 5,
              "token_group": "VARIABLES",
              "token_name": "C_VARIABLE"
            },
            {
              "token_name_org": "T_IS_EQUAL",
              "token": 289,
              "value": "==",
              "line": 5,
              "token_group": "RELOPERATOR",
              "token_name": "C_IS_EQUAL"
            },
            {
              "token_name_org": "T_CONSTANT_ENCAPSED_STRING",
              "token": 323,
              "value": "asc",
              "line": 5,
              "token_group": "STRINGS",
              "token_name": "C_STRING"
            }
          ]
        ],
        "body": [
          [
            {
              "token_name_org": "T_ECHO",
              "token": 328,
              "value": "echo",
              "line": 7,
              "token_group": "FUNCTIONS",
              "token_name": "C_ECHO",
              "args": [
                [
                  {
                    "token_name_org": "T_CONSTANT_ENCAPSED_STRING",
                    "token": 323,
                    "value": "Sorting: ",
                    "line": 7,
                    "token_group": "STRINGS",
                    "token_name": "C_STRING"
                  },
                  {
                    "token_name_org": "T_VARIABLE",
                    "token": 320,
                    "value": "sort",
                    "line": 7,
                    "token_group": "VARIABLES",
                    "token_name": "C_VARIABLE"
                  }
                ]
              ]
            }
          ]
        ]
      }
    ],
    [
      {
        "token_name_org": "T_ELSEIF",
        "token": 308,
        "value": "elseif",
        "line": 8,
        "token_group": "CONDITIONS",
        "token_name": "C_ELSEIF",
        "conditions": [
          [
            {
              "token_name_org": "T_VARIABLE",
              "token": 320,
              "value": "sort",
              "line": 8,
              "token_group": "VARIABLES",
              "token_name": "C_VARIABLE"
            },
            {
              "token_name_org": "T_IS_EQUAL",
              "token": 289,
              "value": "==",
              "line": 8,
              "token_group": "RELOPERATOR",
              "token_name": "C_IS_EQUAL"
            },
            {
              "token_name_org": "T_CONSTANT_ENCAPSED_STRING",
              "token": 323,
              "value": "desc",
              "line": 8,
              "token_group": "STRINGS",
              "token_name": "C_STRING"
            }
          ]
        ],
        "body": [
          [
            {
              "token_name_org": "T_ECHO",
              "token": 328,
              "value": "echo",
              "line": 9,
              "token_group": "FUNCTIONS",
              "token_name": "C_ECHO",
              "args": [
                [
                  {
                    "token_name_org": "T_CONSTANT_ENCAPSED_STRING",
                    "token": 323,
                    "value": "Sorting: ",
                    "line": 9,
                    "token_group": "STRINGS",
                    "token_name": "C_STRING"
                  },
                  {
                    "token_name_org": "T_VARIABLE",
                    "token": 320,
                    "value": "sort",
                    "line": 9,
                    "token_group": "VARIABLES",
                    "token_name": "C_VARIABLE"
                  }
                ]
              ]
            }
          ]
        ]
      }
    ],
    [
      {
        "token_name_org": "T_ELSE",
        "token": 309,
        "value": "else",
        "line": 10,
        "token_group": "FUNCTIONS",
        "token_name": "C_ELSE",
        "body": [
          [
            {
              "token_name_org": "T_ECHO",
              "token": 328,
              "value": "echo",
              "line": 11,
              "token_group": "FUNCTIONS",
              "token_name": "C_ECHO",
              "args": [
                [
                  {
                    "token_name_org": "T_VARIABLE",
                    "token": 320,
                    "value": "sort",
                    "line": 11,
                    "token_group": "VARIABLES",
                    "token_name": "C_VARIABLE"
                  }
                ]
              ]
            }
          ]
        ]
      }
    ]
  ]
}

现在我编写了这个伪代码/算法来查找未经过验证/无污染的变量:

  1. 搜索token_group:FUNCTIONS
  2. 检查是否有args
  3. 签入token_group:VARIABLES
  4. 的args
  5. 从找到的args索引中,取args键“value”并存储
  6. 搜索token_group ASSIGNMENTS,获取下一个元素,如果token_group“FUNCTIONS”标记为安全,如果token_group“VARIABLES”标记为不安全
  7. 转到第1点
  8. 这样做是否正确?任何人都有不同的想法/方法如何找到那些未经过清理/未被开发的变量?

    作为一个完美的答案,正确的伪代码/算法这样做是最好的。

    谢谢,

1 个答案:

答案 0 :(得分:0)

目前还不清楚你究竟想要完成什么以及伪代码究竟做了什么,但我的猜测是它没有做你想做的事。

  • 第4步&#39;商店&#39;一个值,但伪代码从不再引用它。更一般地说,步骤1-4和步骤5之间没有联系。

  • 程序似乎没有终止:如果你的AST有一个功能和一个指定,那么步骤1和5将永远成功,所以你将永远循环。

    < / LI>
  • 标记安全或不安全的唯一触发器似乎是转让声明,但可能是安全/不安全的结构不涉及任务。例如,我想你想把echo $_GET['sort'];视为不安全(但echo "<p>hi!</p>";是安全的)。

  • 步骤5似乎将每个函数调用视为安全,并且每个变量引用都是不安全的,但是(取决于您尝试完成的内容)可能会有两个反例。例如,echo trim($_GET['sort']);涉及功能但不安全,$x = "<p>hi!</p>"; echo $x;涉及变量但是安全。