为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

PHP
开满天机 2019-05-22 15:03:34
用PHP清理用户输入的最佳方法是什么?是否有一个catchall函数适用于清理SQL注入和XSS攻击的用户输入,同时仍允许某些类型的html标记?
查看完整描述

5 回答

?
慕桂英3389331

TA贡献2036条经验 获得超8个赞

这是一种常见的误解,即用户输入可以被过滤。PHP甚至还有一个(现已弃用的)“功能”,称为魔术引号,它建立在这个想法的基础之上。这是胡说八道。忘记过滤(或清洁,或任何人称之为)。

为了避免出现问题,你应该做的很简单:每当你在外国代码中嵌入一个字符串时,你必须根据该语言的规则来逃避它。例如,如果在某些SQL目标MySql中嵌入字符串,则必须为此目的使用MySql函数转义字符串(mysqli_real_escape_string)。(或者,对于数据库,如果可能,使用预处理语句是更好的方法)

另一个例子是HTML:如果在HTML标记中嵌入字符串,则必须使用它进行转义htmlspecialchars。这意味着每个单词echoprint语句都应该使用htmlspecialchars

第三个例子可能是shell命令:如果你要将字符串(例如参数)嵌入到外部命令中,并用它们调用它们exec,那么你必须使用escapeshellcmdescapeshellarg

等等等等 ...

您需要主动过滤数据的唯一情况是,您是否接受预先格式化的输入。例如。如果您允许用户发布HTML标记,那么您计划在网站上显示该标记。但是,你应该不惜一切代价避免这种情况,因为无论你如何过滤它,它总是一个潜在的安全漏洞。


查看完整回答
反对 回复 2019-05-22
?
慕无忌1623718

TA贡献1744条经验 获得超4个赞

不可以。如果没有任何上下文,您无法对数据进行一般过滤。有时您想要将SQL查询作为输入,有时您希望将HTML作为输入。

您需要过滤白名单上的输入 - 确保数据符合您期望的某些规范。然后,您需要在使用它之前将其转义,具体取决于您使用它的上下文。

转义SQL数据的过程 - 防止SQL注入 - 与转换(X)HTML数据的过程非常不同,以防止XSS。


查看完整回答
反对 回复 2019-05-22
?
慕田峪9158850

TA贡献1794条经验 获得超7个赞

不,那里没有。

首先,SQL注入是一个输入过滤问题,XSS是一个输出转义问题 - 所以你甚至不会在代码生命周期中同时执行这两个操作。

基本的经验法则

  • 对于SQL查询,绑定参数(与PDO一样)或对查询变量使用驱动程序本机转义函数(例如mysql_real_escape_string()

  • 使用strip_tags()过滤掉不需要的HTML

  • htmlspecialchars()在此处转义所有其他输出并注意第二和第三参数。


查看完整回答
反对 回复 2019-05-22
  • 5 回答
  • 0 关注
  • 632 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信