用PHP实现输入安全

用PHP实现输入安全,php,security,input,Php,Security,Input,我不确定,我怎样才能真正用字符串进行安全的输入 例如,我得到: $id = intval($_POST['id']); $name = $_POST['name']; $sql->query("UPDATE customers SET name = " . $sql->escape_string($name) . " WHERE id = {$id}"); 我确信$name不够安全。如何保护它,以防止XSS漏洞 亲切问候,, cyclone。XSS保护应该在输出端完成,而不是在存储

我不确定,我怎样才能真正用字符串进行安全的输入

例如,我得到:

$id = intval($_POST['id']);
$name = $_POST['name'];
$sql->query("UPDATE customers SET name = " . $sql->escape_string($name) . " WHERE id = {$id}");
我确信
$name
不够安全。如何保护它,以防止XSS漏洞

亲切问候,,
cyclone。

XSS保护应该在输出端完成,而不是在存储介质(数据库)上完成。数据库不知道数据显示在何处。如果要存储的数据是文本(如本例中的
$name
),则应将其存储为文本而不是HTML

如果你真的想摆脱可能的HTML标签,可以使用
$name=strip_标签($\u POST['name'])
,但是防止XSS vulns的正确方法是在输出端使用
htmlspecialchars
(或
htmllentities

如果要使用PHP过滤器函数,下面是一个删除HTML标记的示例:

$name = filter_input(INPUT_POST, 'name', FILTER_SANITIZE_STRING);
PHP文档:


XSS保护应该在输出端完成,而不是在存储介质(数据库)上完成。数据库不知道数据显示在何处。如果要存储的数据是文本(如本例中的
$name
),则应将其存储为文本而不是HTML

如果你真的想摆脱可能的HTML标签,可以使用
$name=strip_标签($\u POST['name'])
,但是防止XSS vulns的正确方法是在输出端使用
htmlspecialchars
(或
htmllentities

如果要使用PHP过滤器函数,下面是一个删除HTML标记的示例:

$name = filter_input(INPUT_POST, 'name', FILTER_SANITIZE_STRING);
PHP文档:


    • XSS与您的数据库没有任何关系,大部分情况下是这样的

      跨站点脚本(XSS)是一种计算机安全性 通常在启用 攻击者将客户端脚本注入到其他用户查看的网页中 用户


      也许你指的是SQL注入?您已经转义了输入,您可以通过将变量强制转换为适当的类型来进一步清理它。

      XSS与您的数据库没有任何关系,大多数情况下是这样的

      跨站点脚本(XSS)是一种计算机安全性 通常在启用 攻击者将客户端脚本注入到其他用户查看的网页中 用户


      也许你指的是SQL注入?您已经转义了输入,您可以通过将变量转换为适当的类型来进一步清理它。

      说到安全性,我始终认为尽可能严格是有意义的,但没有更严格的。如果可以在将名称插入数据库之前确定其无效,那么为什么不拒绝它呢

      有没有人有一个带有HTML标签的名字?可能不会。但是撇号或连字符怎么样?当然

      考虑到这一点,让我们看看有效名称是什么样子的:

      • 信件
      • 空间
      • 撇号
      • 连字符
      • 句号(首字母缩写)
      现在已经确定了有效名称的外观,请拒绝所有不符合此条件的名称:

      /* If the input contains any character that is not a capital letter, 
         a lowercase letter, whitespace, a hyphen, a period, or an apostrophe, 
         then preg_match with return true. */
      if (preg_match('/[^A-Za-z\s\-\.\']/', $_POST['Name']))
      {
          // Invalid name
      }
      else
      {
          // Valid name
      }
      

      说到安全性,我总是认为尽可能严格是有道理的,但不能再严格了。如果可以在将名称插入数据库之前确定其无效,那么为什么不拒绝它呢

      有没有人有一个带有HTML标签的名字?可能不会。但是撇号或连字符怎么样?当然

      考虑到这一点,让我们看看有效名称是什么样子的:

      • 信件
      • 空间
      • 撇号
      • 连字符
      • 句号(首字母缩写)
      现在已经确定了有效名称的外观,请拒绝所有不符合此条件的名称:

      /* If the input contains any character that is not a capital letter, 
         a lowercase letter, whitespace, a hyphen, a period, or an apostrophe, 
         then preg_match with return true. */
      if (preg_match('/[^A-Za-z\s\-\.\']/', $_POST['Name']))
      {
          // Invalid name
      }
      else
      {
          // Valid name
      }
      

      您提供的代码旨在再次保护SQL注入攻击,而不是XSS攻击,这是完全不同的事情

      SQL注入是指攻击者使用SQL代码以您不希望的方式进出数据库。正确地转义SQL字符串可以缓解这种情况。(也就是说,我不知道从您的代码中,
      $sql
      对象是什么类,因此我无法告诉您,
      $sql->escape\u string()
      是否是一种足够的保护;我假设是这样,但需要更多地了解对象才能确定)

      XSS(“跨站点脚本”)攻击是指攻击者设法将其HTML、CSS或Javascript代码放入您的页面,从而导致后续页面加载显示不需要的内容

      攻击者可以通过多种方式实现这一点,但通常情况下,您应该确保对用户输入的、将显示在您网站上的任何数据进行过滤,以防止其包含HTML、CSS或JS代码。如果是这样的话,您应该完全删除代码,或者使用HTML转义(PHP的
      htmlentities()
      函数和类似函数)来确保以安全的方式显示代码


      在您向我们展示的代码中,您目前根本没有采取任何措施来防止这种情况发生,但从您向我们展示的代码中,我们同样无法判断是否需要保护这些数据免受XSS攻击。这取决于它的使用时间和方式。

      您提供的代码旨在再次保护SQL注入攻击,而不是XSS攻击,这是完全不同的事情

      SQL注入是指攻击者使用SQL代码以您不希望的方式进出数据库。正确地转义SQL字符串可以缓解这种情况。(也就是说,我不知道从您的代码中,
      $sql
      对象是什么类,因此我无法告诉您,
      $sql->escape\u string()
      是否是一种足够的保护;我假设是这样,但需要更多地了解对象才能确定)

      XSS(“跨站点脚本”)攻击是指攻击者设法将其HTML、CSS或Javascript代码放入您的页面,从而导致后续页面加载显示为unwan