【问题标题】:A tidy way to clean your URL variables?清理 URL 变量的整洁方法?
【发布时间】:2010-09-21 16:05:20
【问题描述】:

我想知道在我使用它们之前是否有一个快速简单的函数来清理我的 url 中的变量。(或者 $_POST 想想它......)

我想我可以使用正则表达式来替换不允许使用的字符,但我很想听听人们用什么来做这类事情?

【问题讨论】:

    标签: php security sanitization


    【解决方案1】:

    清理输入的概念对我来说从来没有多大意义。它基于某些类型的输入是危险的假设,但实际上不存在危险输入这样的东西;只是错误处理输入的代码。

    其罪魁祸首是,如果您将变量嵌入某种字符串(代码)中,然后由任何类型的解释器进行评估,您必须确保该变量被正确转义。例如,如果您在 SQL 语句中嵌入了一个字符串,那么您必须引用和转义该字符串中的某些字符。如果在 URL 中嵌入值,则必须使用 urlencode 对其进行转义。如果在 HTML 文档中嵌入字符串,则必须使用 htmlspecialchars 转义。以此类推。

    尝试预先“清理”数据是一种注定失败的策略,因为您无法知道 - 在这一点上 - 数据将在哪个上下文中使用。PHP 臭名昭著的 magic_quotes 反特性是这种被误导的想法的一个典型例子。

    【讨论】:

    • 我一直在使用 htmlentities 而不是 htmlspecialchars;它会进行完整的实体转换。
    • 从安全的角度来看没关系 - htmlentities 是 htmlspecialchars 的超集。不过,如果您使用 UTF-8 作为编码,则不需要它。
    【解决方案2】:

    我使用 PHP input filters 和函数 urlencode

    【讨论】:

      【解决方案3】:

      正则表达式可能会有所帮助,而且 PHP 5.2.0 还引入了一个完整的 filter 扩展,专门用于以不同方式过滤输入变量。

      很难推荐一个单一的解决方案,因为输入变量的性质是如此...多变。 :-)

      【讨论】:

        【解决方案4】:

        我使用以下方法清理输入以供 MYSQL 数据库使用。总而言之,通过 foreach 遍历 $_POST 或 $_GET 数组,并通过 DBSafe 函数传递每个 $_POST 或 $_GET 以清理它。 DBSafe 可以很容易地修改为数据变量的其他用途(例如 HTML 输出等)。

        // 迭代 POST 数组,将每个数组传递给 DBSafe 函数以清理数据 foreach ($_POST as $key => $PostVal) { // 将 POST 变量转换为常规变量 $$key=DBSafe($PostVal); // 使用上述语句保持 POST 或 GET 数组不变,并使用新的单个变量 // 或者,使用下面更新 POST 或 GET 数组变量 // 更新 POST 变量 $_POST[$key]=DBSafe($PostVal); } 函数 DBS​​afe($InputVal) { // 返回数据库更新的 MySQL 安全值。未加引号的数值;空输入为 NULL;转义的“单引号”字符串值; if (is_numeric($InputVal)) { 返回 $InputVal; } 别的 { // 根据服务器 PHP 和 MySQL(即 magic_quotes)设置,可能不需要 escape_string。如果需要,请在下面取消注释。 // $InputVal=mysql_escape_string($InputVal); $InputVal=(!$InputVal?'NULL':"'$InputVal'"); 返回 $InputVal; } }

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-08-28
          • 2023-03-30
          • 1970-01-01
          • 2022-10-23
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多