我们应该在2017年逃避字符串还是PHP为我们做?

时间:2017-06-25 07:56:21

标签: php

我问这个问题的原因是因为我正在检查stackoverflow的答案,而且自2012/13以来它似乎不再是一个热门话题而且所有答案文档都已弃用。你能否告诉我,我们是否还应该这样做,如果是这样,有什么安全的方法呢?我特别谈论用户定义的帖子数据......

更新:字符串将是用户输入的html并发布到我的dB中。

4 个答案:

答案 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年,这是您所描述的场景中通常所做的事情:

  1. 用户在表单中输入文本,文本被发送到服务器,然后文本被url编码(这是一个表单或转义)。这通常由浏览器/ javascript完成,因此无需手动执行(但确实会发生)。

  2. 服务器接收文本,对其进行解码,然后创建MySQL插入/更新语句以将其存储在数据库中。虽然有些人仍在运行mysqli_real_escape_string,但推荐的方法是使用预准备语句。因此,在这方面你不需要进行转义,但是准备好的语句委托转义到数据库(所以再次逃避确实发生)

  3. 如果用户输入的文本要在页面上显示,则通过htmlentities或类似的(它本身是另一种转义形式)进行编码。这主要是手动运行,尽管大多数新的视图模板框架(例如树枝或刀片)为我们处理。

  4. 据我所知,这就是今天的情况。转义是非常需要的,但是如果使用现代框架和实践,程序员实际上并不需要转义。