我正在清理页面上输出的所有用户输入,例如:
echo escape($user_input);
我有一个关于用户输入的问题,这些输入没有输出到页面但是在内部语句中 - 他们是否需要转义?
这样可以:
if ($user_input == 'something') { echo escape($another_user_input); }
或应该是:
if (escape($user_input) == 'something') { echo escape($another_user_input); }
对于其他逻辑(foreach循环等)的相同问题,这将比这个简单的例子增加更多的faff。
答案 0 :(得分:0)
您需要逃避某些事情的唯一原因是您将数据内插到另一个文本媒体中,然后根据某些规则对其进行重新解释。
E.g:
echo '<p>' . $somedata . '</p>';
这是以编程方式生成HTML,它将由HTML解析器解释,并具有特定的行为,具体取决于$somedata
内的内容。
$query = 'SELECT foo FROM bar WHERE baz = ' . $somedata;
这是以编程方式生成SQL查询,该查询将由SQL解析器解释,并根据$somedata
内的内容具有特定行为。
如果您想确保HTML或该查询的行为符合您的预期,您最好确保以不允许任何人注入不需要的命令的方式生成这些文本命令。
if ($somedata == 'something')
在这里,您并未创建一些将由某些内容解释的新文本。任何人都无法在这里注射任何东西。它不像PHP用$somedata
的内容替换$somedata
,然后用插值数据重新解释该行。因此,没有必要以任何方式逃避这一点。
另见The Great Escapism (Or: What You Need To Know To Work With Text Within Text)。