我问这个问题的原因是因为我正在检查stackoverflow的答案,而且自2012/13以来它似乎不再是一个热门话题而且所有答案文档都已弃用。你能否告诉我,我们是否还应该这样做,如果是这样,有什么安全的方法呢?我特别谈论用户定义的帖子数据......
更新:字符串将是用户输入的html并发布到我的dB中。
答案 0 :(得分:2)
简短的回答是肯定的。即使在2017年,你也应该在PHP中转义字符串。 PHP本身并不这样做,因为不是每个开发人员都希望开发一个需要逃避用户输入的产品/功能(无论出于何种原因)。
如果您将用户输入的数据回显到网页,则应使用函数htmlspecialchars()阻止潜在的恶意编码在您的浏览器读取时执行。
当您从客户端检索数据时,您还可以使用FILTER_INPUT函数验证传入数据,以验证客户端数据实际上是您想要的数据(例如,检查没有人绕过您的客户端)验证并在数据中输入了非法字符)
根据我的经验,这两个很棒的功能可用于1 :)将输出转发到客户端,2 :)防止在您的服务器上存储/处理恶意代码的可能性。
答案 1 :(得分:0)
这完全取决于你将如何处理字符串。
如果您要将其视为代码(无论该代码是HTML,JavaScript,PHP,SQL还是其他代码),那么它将需要转义。
PHP无法判断您是否信任数据源以编写安全代码。
答案 2 :(得分:0)
是的,从请求中转义字符串(因此可由用户处理)是一个实际需求,因为PHP使实际添加到请求的有效负载的数据可用,而不进行任何可能使数据本身无效的修改(并非所有数据需要转义),因此必须在开发人员的控制下对数据进行任何后续处理。
数据库交互操作中的变量转义以防止SQL注入。
在过去的PHP版本中,有一个“magic_quoteas”功能可以过滤GET或POST中的每个变量。但它已被弃用,并不是最佳做法。 Why Not?
查询DB的最先进技术主要是使用PDO驱动程序和准备好的语句。在绑定变量时,变量将自动转义。
$conn->prepare('SELECT * FROM users WHERE name = :name');
$conn->bindParam(':name',$_GET['username']); //this do the escape too
$conn->execute();
或者,mysql_real_escape_string手动管理它。
或者,mysqli::real_escape_string手动管理它。
答案 3 :(得分:0)
2017年,这是您所描述的场景中通常所做的事情:
用户在表单中输入文本,文本被发送到服务器,然后文本被url编码(这是一个表单或转义)。这通常由浏览器/ javascript完成,因此无需手动执行(但确实会发生)。
服务器接收文本,对其进行解码,然后创建MySQL插入/更新语句以将其存储在数据库中。虽然有些人仍在运行mysqli_real_escape_string
,但推荐的方法是使用预准备语句。因此,在这方面你不需要进行转义,但是准备好的语句委托转义到数据库(所以再次逃避确实发生)
如果用户输入的文本要在页面上显示,则通过htmlentities
或类似的(它本身是另一种转义形式)进行编码。这主要是手动运行,尽管大多数新的视图模板框架(例如树枝或刀片)为我们处理。
据我所知,这就是今天的情况。转义是非常需要的,但是如果使用现代框架和实践,程序员实际上并不需要转义。