2011-08-10 88 views
1

虽然用户输入消毒/验证是一个老生常谈的话题,但我在特定情况下发布了一个说明。

的一段代码包含

$haystack=$_GET['user']; 

$输入从不用于“回响”或“打印”或以任何SQL查询或任何这样的事情。用户输入($ haystack)的唯一用途是检查字符串是否包含预定义的$针。

if (preg_match($needle,$haystack)) { 
$result="A"; 
} else { 
$result="B"; 
} 

我的担心是恶意代码的执行,而不是它在用户输入中的存在。

所以问题是,如果用户输入仅用于上面提到的上下文(在回声,打印,SQL等没有用处),是否仍然有可能在用户输入执行恶意代码。

我想添加上下文所需的安全措施,而不是过度使用它。

+0

我认为没有问题,但是最大的问题是如果你忘记了哪个变量被消毒了。或者如果其他程序员认为它已经过消毒。我知道这是一种很好的工作方式(忘记没有检查,但可能发生),更好地做一个功能来消毒,你可以很容易地将其应用于任何输入。或者把你的清理过的变量放在明确标记的变量名称中,例如$ clean_xxx –

+0

可能重复[在PHP中直接使用超级全局变量是好还是坏?](http://stackoverflow.com/questions/3498207/is-using-superglobals-directly -good-or-bad-in-php) – vaxquis

回答

0

它不可能通过修改字符串来执行任意代码。只有当你直接输出字符串,或者在SQL中使用它时,你才会很担心。

+2

除非模式依赖它:)离题,抱歉,但preg_match中的/ e修饰符可以执行代码。 – Pelshoff

3

如果仅用于上下文中,则无法从用户输入中执行恶意代码。

你应该小心evalpreg_replace(含改性剂e,感谢Pelshoff),数据库查询和echo(& printsprintf ...)。

0

preg_match不会最终执行您的输入。隐藏可利用的漏洞太简单直接了。如果您在运行preg_match之后折腾$haystack,那么它不会伤害到您。

0

虽然$haystack可能不会被反映,但它可能会明显影响程序流程。您发布的(非常短的)代码当然看起来并不直接易受攻击,但不会消毒您的输入可能会导致代码与其他漏洞一起执行。