尝试编写此静态代码分析伪代码/算法。
有两种情况:
安全(输入 - $ 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"
}
]
]
}
]
]
}
]
]
}
现在我编写了这个伪代码/算法来查找未经过验证/无污染的变量:
这样做是否正确?任何人都有不同的想法/方法如何找到那些未经过清理/未被开发的变量?
作为一个完美的答案,正确的伪代码/算法这样做是最好的。
谢谢,
答案 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;
涉及变量但是安全。