【问题标题】:Is it recommended to have a santizing function that combines two or more built in sanitizing functions in php?是否建议在 php 中结合两个或多个内置消毒功能的消毒功能?
【发布时间】:2012-01-10 09:30:07
【问题描述】:

是否可以使用一个功能来清理由于表单提交或任何其他请求而传入的输入。这是节省时间,但有效性和效率的问题仍然困扰着我。例如,

   function clearSpecialChars($str)
   {
     $str=htmlentities($str);
     $str=strip_tags($str);
     $str=mysql_real_escape_string($str);

     return $str;
   } 

这样当我收到表单提交时,我会这样做:

    $username=clearSpecialChars($_REQUEST['username']);

    $email=clearSpecialChars($_REQUEST['email']);

从根本上说,我不希望用户提供任何 html 输入。

【问题讨论】:

  • 一种尺寸永远不会适合所有人。这只是一种偷懒的尝试。
  • 我不明白。你的意思是上面比逐步使用它们更容易受到攻击?
  • 一个尝试解决 SQL 注入漏洞,另一个尝试解决跨站点脚本漏洞(尽管如果不小心使用,两者都无法成功完成任务 - 通常在与其他工具结合使用)。它们应该永远在任何地方按顺序使用,因为它们彼此无关。
  • 感谢秋葵。我从来没有想过用过度杀伤力来形容这个词:)

标签: php security function sanitize


【解决方案1】:

每个功能都有自己的用途,您不应使用任何不符合其预期用途的功能。

  1. 在mysql查询中使用参数之前,应该使用mysql_real_escape_string。
  2. 您应该在输出到页面之前使用 htmlspecialchars。

就是这样。

【讨论】:

  • 不要永远不要使用mysql_real_escape_string(),除非它真的是你最后的选择——它太容易被滥用并最终容易受到SQL注入的攻击,或者在易受攻击的配置中使用它。请尝试在 mysqliPDO 库中使用参数化查询。
  • “太容易误用”是什么意思?
  • $sql = "select * from users where id=" + mysql_real_escape_string( $_POST['userid'] ); 一个非常常见的例子; SQL 注入就在那里。
【解决方案2】:

是的,您可以创建一个简单的函数来在使用值之前对其进行清理。我使用这样的功能:

function sanitize($value)
{
    return htmlentities(addslashes($value));
}

转义 ' 和 " 并转换 html 实体中的所有适用字符。我的其他选项更复杂,但你可以从它开始。

【讨论】:

  • fyi:这不会对单引号进行 htmlencode,因此当注入上下文位于 HTML 标记内但不在双引号属性值内时,它很容易受到 XSS 攻击。还存在其他弱点,例如多字节攻击(因为不考虑字符集)和一些特定于浏览器的语法漏洞。
  • 是的,所以我说我使用了一个更复杂的函数。我以为他想知道如何以简单的方式使用一些不同的功能,所以很难在一个答案中谈论安全问题;)
  • 确实如此。我认为读者从中学到的主要一点是,任何方法都只能在特定的一组地方工作。在考虑注入漏洞时,考虑注入字符串的输出的语法/结构中的 where 与考虑 如何 执行输出同样重要-encoding - 大提示:输出编码取决于位置。 (并且还要考虑应该避免注入的地方)
  • 是的,我同意你的观点,但是有一些方法可以一起调用。例如,当我收到一些输入数据时,我在数组上应用一个方法,然后该方法循环遍历数组以清理 - 或者更好地进行简单的初始清理 - 所有输入。然后我以不同的方式为不同的值工作,使用令牌会话作为表单,检查 id,检查没有 html 的数据,检查 CSRF - 等等。
  • 确保在以这种方式转换之前完成所有初始输入验证并拒绝 duff 数据。那么请确保您只能在已转换它们的位置使用这些预转换形式的数据。不要尝试在 PDF 文档、输出数据文件、电子邮件标题或其他文件格式或您未考虑过的 HTML 文档的其他位置使用您认为干净的数据。另外,请注意不要将预先转换的数据存储在您的数据库中,如果您不存储原始数据,您最终会遇到问题。
猜你喜欢
  • 2011-02-25
  • 2015-05-09
  • 2020-06-20
  • 1970-01-01
  • 2015-10-27
  • 1970-01-01
  • 2011-07-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多