清理数据PHP - 我需要转义内部if语句的用户输入吗?
我消毒是页输出的所有用户输入,例如:清理数据PHP - 我需要转义内部if语句的用户输入吗?
echo escape($user_input);
我有一个关于不输出到页面的,但里面的语句用户输入的问题 - 他们需要逃脱?
这是正确的:
if ($user_input == 'something') { echo escape($another_user_input); }
或者它应该是:
if (escape($user_input) == 'something') { echo escape($another_user_input); }
方法,能比这个简单的例子添加更多faff其他逻辑(foreach循环等)同样的问题。
你需要逃避某些事情的唯一原因是当你将数据插入到另一个文本介质中时,它会根据一些规则重新解释。
例如为:
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)。
感谢您给出的很好的答案和真正有用的文章 - 它有助于更全面地理解这些问题。 – Ryan
插入数据库之前的第二个值,以便从任何错误代码中清除该值。例如,用户名!第一个是评论之类的东西,你接受用户的输入并打印出来并使用htmlspecialchars! –
@MrPro Wut ?!为什么? – deceze
如果只是将它们与预定义的字符串进行比较,则在转义输入时几乎没有用处。 'echo'行应该被转义,并且你应该确保没有任何东西可以破坏页面中的HTML或插入恶意脚本,所以在这种情况下,我认为只是'逃避'是不够的。 –