我知道我已经asked有关消毒和逃避的问题,但我有一个问题没有得到解答。
好的,就在这里。如果我有一个PHP脚本,我GET
用户从mySQL数据库输入并SELECT
,如果我没有逃脱{{1},它是否会有任何安全风险? }和<
使用>
,htmlspecialchars
或htmlentities
,因此允许从数据库中选择/搜索HTML标记?因为已使用strip_tags
,trim()
和mysql_real_escape_string
(\%_)对输入进行了清理。
使用addcslashes
的问题是它逃脱&符号(&amp;),用户输入应该允许(我猜htmlspecialchars
也是如此?)。使用htmlentities
,类似&#34; John &#34;导致PHP脚本选择并显示John的结果,这是不应该做的。
在从数据库中选择之前,这是用于清理输入的PHP代码:
strip_tags
这是我输出的显示&#34; x匹配的y结果。&#34;:
if(isset($_GET['query'])) {
if(strlen(trim($_GET['query'])) >= 3) {
$search = mysql_real_escape_string(addcslashes(trim($_GET['search']), '\%_'));
$sql = "SELECT name, age, address WHERE name LIKE '%".$search."%'";
[...]
}
}
答案 0 :(得分:2)
解决这个问题的一个好方法是使用MySQLi,它使用预处理语句,它基本上可以在后端为您提供所有内容,并提供针对SQL注入的强大保护。不转义GET数据就像逃避任何其他输入一样危险。
答案 1 :(得分:1)
您已经确定了两个不同的问题。
SQL语句中的用户数据
每当您构建查询时,您都需要绝对确定任何用户数据都不会在其中结束。这些错误称为SQL injection bugs,是无法正确转义数据的结果。作为一般规则,您永远不应该使用字符串连接来撰写查询。只要有可能,请使用placeholders确保您的数据已正确转义。
HTML文档中的用户数据
当您呈现包含用户提交的内容的页面时,您需要对其进行转义,以便用户无法引入任意HTML标记或脚本元素。这样可以避免XSS issues,这意味着&
和<
等字符的解释不正确。用户数据“x&lt; y”不会最终破坏您的页面。
无论您将用户数据呈现到何种上下文,您都需要转义。还有其他内容,例如脚本标记或URL中,但这些是最常见的两种。