代码之家  ›  专栏  ›  技术社区  ›  Aykut Çevik

如果一个web应用程序得到用户的输入或参数,那么在验证时,我们应该做哪些必要且最重要的事情?

  •  1
  • Aykut Çevik  · 技术社区  · 14 年前

    我一直在考虑网页上的任何形式的验证(PHP或ASP,这无关紧要),但从来没有找到一个好的和准确的答案。

    例如,我有一些 GET -参数,该参数定义一个SQL查询,如DESC oder ASC。( SQL-Injection

    或者我为用户提供了一个注释函数,其中数据也保存在数据库中。

    检查数据中的HTML标记是否足够?验证应该在将其添加到数据库或显示在页面上之前完成吗?

    我正在搜索ToDo,它应该始终使用“外部”提供的任何数据执行。

    谢谢。

    3 回复  |  直到 14 年前
        1
  •  1
  •   aib    14 年前

    对你想从用户那里得到什么有一个好的想法。

    $query = "SELECT [...] ORDER BY field " . escape($_GET['sortOrder']); //wrong
    

    无论您如何转义和清理它们的字符串,这都是错误的,因为这不是验证枚举的方法。比较:

    if ($_GET['sortOrder'] == 'desc') {
        $ascending = false;
    } else {
        $ascending = true;
    }
    
    if ($ascending) {
        ...
    } else {
        ...
    }
    

    …这不需要讨论字符串转义或SQL注入,因为您只想从用户那里得到一个yes/no(或升序/降序)答案。

    你想让他们输入评论吗?为什么不允许HTML标记?如果用户想输入HTML代码呢?

    $text = $_POST['commentText'];
    
    if (mb_strlen($text, ENCODING) <= 1024) {
        //valid!
    }
    

    数据库中的值应反映用户逐字输入的内容;不翻译,不转义。假设要从评论中删除所有HTML标记。当您决定以JSON格式将注释发送到某个地方时会发生什么情况?你也去掉了JSON控制字符吗?其他格式呢?如果HTML引入了一个名为“:”的标记,会发生什么情况?你会在数据库里从所有的评论中去掉笑脸吗?

    答案是否定的,因为你不希望HTML安全,JSON安全,一些奇怪的格式和smileys安全的用户输入。您需要最多1024个字符的文本。检查一下。把它存起来。

    现在,显示部分更难。为了显示:

    <b>I like HTML "tags"
    

    在HTML中,您需要编写如下内容:

    &lt;b&gt;I like HTML &quot;tags&quot;
    

    在JSON中,您可以执行以下操作:

    { "I like HTML \"tags\" }
    

    这就是为什么您应该使用语言工具来转义数据 当你使用它的时候 .

    当然,SQL也是如此,这就是为什么在使用诸如 mysql_query() 在PHP中。(另一方面,您应该真正使用的参数化查询不需要转义。)

    摘要


    *:您还应该定义“字符”在这里的含义。例如,UTF-8可以使用多个字节来编码一个代码点。“字符”是指“字节”还是“Unicode码位”?

        2
  •  1
  •   Adam Hopkinson    14 年前

    如果您使用的是PDO,请确保使用准备好的语句-这些语句会自动清除传入的数据。

    如果使用mysql函数,请通过 mysql_real_escape_string 第一。

    您还可以进行验证,例如确保变量是可接受范围之一:

    $allowed_values = array('name', 'date', 'last_login')
    if(in_array($v, $allowed_values)) {
        // now we can use the variable
    }
    
        3
  •  0
  •   Manos Dilaverakis    14 年前

    你说的是两种数据卫生。一个是将用户生成的数据放入数据库,另一个是将用户生成的数据放入网页。对于前者,你应该听从亚当的建议。以后你应该调查 htmlspecialchars .

    不要把这两件事混为一谈,因为他们做的是两件完全不同的事。为此目的,卫生工作只应在最后时刻进行。在更新数据库之前使用adam的建议。在回显数据之前使用htmlspecialchars。做 在将数据添加到数据库之前,请对其使用htmlspecialchars。