阻止字符串字段中的数组-XSS


prevent array in string field - XSS

我在分析输入表单时遇到问题
我将举三个例子,都考虑到"用户"形式的变化


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

原始字段不变,获取数据:
$_POST=数组('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=数组('first_name'=>数组(Albert),'last_name'=>阵列(Einstein))


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

掺杂字段,我得到的数据:
$_POST=数组("first_name"=>数组(Albert,Einstein),"last_name"=>null)


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

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


我希望我已经清楚了,因为这是一个真正的问题
储罐至所有

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

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验证

您可以使用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。