【问题标题】:prevent array in string field - XSS防止字符串字段中的数组 - XSS
【发布时间】:2013-12-19 00:17:39
【问题描述】:

我在分析输入表单时遇到问题...
我举三个例子,都考虑到'User'形式的变化


<form method="POST" action="#">
    <input type="text" name="first_name" value="Albert">
    <input type="text" name="last_name" value="Einstein">
</form>

原字段不变,获取数据:
$_POST = array( 'first_name' => 'Albert' , 'last_name' => 'Einstein' )


<form method="POST" action="#">
    <input type="text" name="first_name[]" value="Albert">
    <input type="text" name="last_name[]" value="Einstein">
</form>

掺假字段,我得到数据:
$_POST = array( 'first_name' => array( Albert ) , 'last_name' => array( Einstein ) )


<form method="POST" action="#">
    <input type="text" name="first_name[]" value="Albert">
    <input type="text" name="first_name[]" value="Einstein">
</form>

掺假字段,我得到数据:
$_POST = array( 'first_name' => array( Albert , Einstein ) , 'last_name' => null )


  1. 即使在处理“验证类”之前,我也会检查该字段是否属于预期类型?
    field_X 如果一个字符串符合预期并且我得到一个数组,我将其标记为错误还是得到数组的第一个元素?

  2. 如果我将一个数组接收到一个字符串字段中,那么我将如何使用发送的数据填写表单?
    如果我用$_POST['XXX'] 填写该字段,则会出现Array


我希望我已经清楚了,因为这是一个真正的问题
所有人的坦克

【问题讨论】:

    标签: php arrays forms validation xss


    【解决方案1】:

    您需要验证输入不是脚本顶部的数组

    if(isset($_POST['my_field'] AND !is_array($_POST['my_field'])) {
      $field = htmlentities($_POST['field'], ENT_QUOTES, 'UTF-8');
      // You are now "safe"
    }
    
    1. 您需要确保您的响应标头 Content-Type 在 application/* 之后包含“UTF-8” 如果您的响应不是 UTF-8,那么您很容易受到攻击。始终以 UTF-8 输出字符串。您可能可以在上述脚本的第一行之后添加一些 UTF-8 验证。

    【讨论】:

    • 关于模式:当一个数组我应该在数组中找到值或通告类型错误?
    • 将请求作为数组发送或不发送。如果您不选择将数据作为数组发送,则不要在数组中查找值,因为这不是必需的,因为我假设您可以完全控制预期的请求介质。不允许动态请求是不合适的。在这种情况下,使用数组没有任何优势。不要宣传类型错误,只显示 404 或一般错误消息,不会让黑客有太多可操作的地方。
    • 解决了一个通用消息...这个问题发生在测试我的验证类时,我想我必须为类型创建一个规则。
    【解决方案2】:

    您可以使用gettype() 进行类型验证。

    form.html:

    <form method="POST" action="action.php">
        <input type="text" name="first_name" value="Albert">
        <input type="text" name="last_name" value="Einstein">
    </form>
    

    action.php

    <?php
    
    if (gettype($_POST['first_name']) === 'string') {
        var_dump($_POST['first_name']);
    }
    

    在此示例中,如果 $_POST['first_name'] 是字符串,则它仅是 var_dump()ed。

    【讨论】:

    • 朋友,你不懂。 first_name 字段必须是字符串,但是可以将字段更改为name=first_name[],这样会产生一个数组值,谢谢
    • 哦,我明白了,您说的是伪造请求。您可以使用 gettype() 将类型验证添加到验证列表中。
    • GetType 不一定是数组类型的问题很关键,那么我认为最好的选择是is_array。 is_array 为真,当我在数组中找到值或通告类型错误时?这部分是关于标准的
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多