我们应该在2017年转义字符串还是PHP为我们转义字符串?

我们应该在2017年转义字符串还是PHP为我们转义字符串?,php,Php,我问这个问题的原因是因为我在检查stackoverflow的答案,自2012/13年以来,它似乎不再是一个热门话题,所有的答案文档都被弃用。你能告诉我我们是否仍然应该这样做吗?如果是这样的话,安全的方法是什么?我特别谈论的是用户定义的post数据 更新:字符串将从用户输入html并发布到我的数据库中 这完全取决于您将如何处理字符串 如果要将其视为代码(无论该代码是HTML、JavaScript、PHP、SQL还是其他代码),则需要对其进行转义 PHP无法判断您是否信任数据源来编写安全代码。简短的

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


更新:字符串将从用户输入html并发布到我的数据库中

这完全取决于您将如何处理字符串

如果要将其视为代码(无论该代码是HTML、JavaScript、PHP、SQL还是其他代码),则需要对其进行转义


PHP无法判断您是否信任数据源来编写安全代码。

简短的回答是肯定的。即使在2017年,您也应该在PHP中转义字符串。PHP本身并没有做到这一点,因为并非每个开发人员都希望开发一个需要逃避用户输入的产品/功能(无论出于何种原因)

如果您正在将用户输入的数据回显到网页,则应使用该功能在浏览器读取时停止执行潜在的恶意编码

从客户端检索数据时,还可以使用函数验证传入数据,以验证客户端数据是否确实是您想要的数据(例如,检查是否没有人绕过客户端验证并在数据中输入非法字符)


根据我的经验,这两个伟大的功能可用于1:)将输出转义到客户端和2:)防止恶意代码在服务器上存储/处理。

是的,从请求中转义字符串(因此可由用户输入)这是一个实际的要求,因为PHP使实际添加到请求有效负载的数据可用,而无需进行任何可能使数据本身无效的修改(不是转义所需的所有数据),因此对该数据的任何后续处理都必须在开发人员的控制下进行

数据库交互操作中的变量转义,以防止SQL注入

在过去的PHP版本中,有一个“magic”特性,可以过滤GET或POST中的每个变量。但它已被弃用,并不是最佳实践

查询数据库的最新技术主要是在准备好的语句中使用驱动程序。在绑定变量时,该变量将自动转义

$conn->prepare('SELECT * FROM users WHERE name = :name');
$conn->bindParam(':name',$_GET['username']); //this do the escape too
$conn->execute();
或者,手动管理它


或者,手动管理它。

在2017年,这是您描述的场景中通常要做的:

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

  • 服务器接收文本,对其进行解码,然后创建一个MySQL insert/update语句将其存储在数据库中。虽然有些人仍然在上面运行
    mysqli\u real\u escape\u字符串
    ,但推荐的方法是使用准备好的语句。因此,在这方面,您不需要进行转义,但是prepared语句将转义委托给数据库(因此转义也会发生)

  • 如果用户输入的文本要显示在页面上,则通过
    htmlentities
    或类似方式对其进行编码(这本身就是另一种转义形式)。虽然大多数新的视图模板框架(如twig或blade)为我们解决了这一问题,但这主要是手动运行的


  • 就我所知,这就是今天的情况。转义是非常必要的,但是如果使用现代的框架和实践,那么实际执行转义的程序员就不是那么必要了

    我将编辑评论。。字符串将以两种方式工作。。传递到我的数据库中,并作为html传回以显示用户。。那么,我该如何逃避这是我的问题呢?看看……第二个问题是。将2012/2013年的问题联系起来有助于提供上下文。有很多类型的转义可以在字符串上执行。mysql_*api的可能副本已经被弃用了一段时间,因此不应该在新的答案中推荐它,因此我的-1。我的主要建议是使用PDO,但是关于手动转义,mysql_real_escape_string在PHP5.5.0中被弃用,所以就在不久前。。。顺便说一句,我的错是,当前的方法是mysqli::real\u escape\u string()。我也会更新我的答案。