用PHP清理用户输入的最佳方法是什么?

用PHP清理用户输入的最佳方法是什么?

是否有一个catchall函数适用于清理SQL注入和XSS攻击的用户输入,同时仍允许某些类型的html标记?



开满天机
浏览 633回答 5
5回答

慕桂英3389331

这是一种常见的误解,即用户输入可以被过滤。PHP甚至还有一个(现已弃用的)“功能”,称为魔术引号,它建立在这个想法的基础之上。这是胡说八道。忘记过滤(或清洁,或任何人称之为)。为了避免出现问题,你应该做的很简单:每当你在外国代码中嵌入一个字符串时,你必须根据该语言的规则来逃避它。例如,如果在某些SQL目标MySql中嵌入字符串,则必须为此目的使用MySql函数转义字符串(mysqli_real_escape_string)。(或者,对于数据库,如果可能,使用预处理语句是更好的方法)另一个例子是HTML:如果在HTML标记中嵌入字符串,则必须使用它进行转义htmlspecialchars。这意味着每个单词echo或print语句都应该使用htmlspecialchars。第三个例子可能是shell命令:如果你要将字符串(例如参数)嵌入到外部命令中,并用它们调用它们exec,那么你必须使用escapeshellcmd和escapeshellarg。等等等等 ...您需要主动过滤数据的唯一情况是,您是否接受预先格式化的输入。例如。如果您允许用户发布HTML标记,那么您计划在网站上显示该标记。但是,你应该不惜一切代价避免这种情况,因为无论你如何过滤它,它总是一个潜在的安全漏洞。

慕无忌1623718

不可以。如果没有任何上下文,您无法对数据进行一般过滤。有时您想要将SQL查询作为输入,有时您希望将HTML作为输入。您需要过滤白名单上的输入 - 确保数据符合您期望的某些规范。然后,您需要在使用它之前将其转义,具体取决于您使用它的上下文。转义SQL数据的过程 - 防止SQL注入 - 与转换(X)HTML数据的过程非常不同,以防止XSS。

慕田峪9158850

不,那里没有。首先,SQL注入是一个输入过滤问题,XSS是一个输出转义问题 - 所以你甚至不会在代码生命周期中同时执行这两个操作。基本的经验法则对于SQL查询,绑定参数(与PDO一样)或对查询变量使用驱动程序本机转义函数(例如mysql_real_escape_string())使用strip_tags()过滤掉不需要的HTMLhtmlspecialchars()在此处转义所有其他输出并注意第二和第三参数。
打开App,查看更多内容
随时随地看视频慕课网APP