5 回答
TA贡献2036条经验 获得超8个赞
这是一种常见的误解,即用户输入可以被过滤。PHP甚至还有一个(现已弃用的)“功能”,称为魔术引号,它建立在这个想法的基础之上。这是胡说八道。忘记过滤(或清洁,或任何人称之为)。
为了避免出现问题,你应该做的很简单:每当你在外国代码中嵌入一个字符串时,你必须根据该语言的规则来逃避它。例如,如果在某些SQL目标MySql中嵌入字符串,则必须为此目的使用MySql函数转义字符串(mysqli_real_escape_string
)。(或者,对于数据库,如果可能,使用预处理语句是更好的方法)
另一个例子是HTML:如果在HTML标记中嵌入字符串,则必须使用它进行转义htmlspecialchars
。这意味着每个单词echo
或print
语句都应该使用htmlspecialchars
。
第三个例子可能是shell命令:如果你要将字符串(例如参数)嵌入到外部命令中,并用它们调用它们exec
,那么你必须使用escapeshellcmd
和escapeshellarg
。
等等等等 ...
您需要主动过滤数据的唯一情况是,您是否接受预先格式化的输入。例如。如果您允许用户发布HTML标记,那么您计划在网站上显示该标记。但是,你应该不惜一切代价避免这种情况,因为无论你如何过滤它,它总是一个潜在的安全漏洞。
TA贡献1744条经验 获得超4个赞
不可以。如果没有任何上下文,您无法对数据进行一般过滤。有时您想要将SQL查询作为输入,有时您希望将HTML作为输入。
您需要过滤白名单上的输入 - 确保数据符合您期望的某些规范。然后,您需要在使用它之前将其转义,具体取决于您使用它的上下文。
转义SQL数据的过程 - 防止SQL注入 - 与转换(X)HTML数据的过程非常不同,以防止XSS。
TA贡献1794条经验 获得超7个赞
不,那里没有。
首先,SQL注入是一个输入过滤问题,XSS是一个输出转义问题 - 所以你甚至不会在代码生命周期中同时执行这两个操作。
基本的经验法则
对于SQL查询,绑定参数(与PDO一样)或对查询变量使用驱动程序本机转义函数(例如
mysql_real_escape_string()
)使用
strip_tags()
过滤掉不需要的HTMLhtmlspecialchars()
在此处转义所有其他输出并注意第二和第三参数。
- 5 回答
- 0 关注
- 632 浏览
添加回答
举报