2013-12-03 4 views
0

У меня возникли проблемы анализа формы ввода ...
Я приведу три примера, и принимая во внимание изменение формы «User»предотвратить массив в строковое поле - 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' => 'Альберт', 'last_name' => 'Эйнштейна)


<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' => массив (Эйнштейн))


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

фальсифицированных поля, я получаю данные:
$ _POST = массив ('first_name' => массив (Альберт Эйнштейн), 'last_name' => NULL)


  1. проверить, если поле типа ожидается еще до того, имеем дело с «класса Validate»?
    field_X, если строка как ожидалось, и я получаю массив, я отмечаю его как ошибку или получаю первый элемент массива?

  2. Если я получаю массив в поле строки, то должно быть, как я буду заполнять форму переданными данными?
    Если я заполнить поле с $_POST['XXX'] появляется Array


Я надеюсь, что было ясно, так как это реальная проблема
Баки для всех

ответ

0

Вы должны подтвердить, что вход не является массивом в верхней части вашего сценария

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 содержит «UTF-8» после применения/* Если ваш ответ не UTF-8, вы уязвимы. Всегда выводить строки в UTF-8. Вероятно, вы можете добавить некоторую проверку UTF-8 после первой строки в приведенном выше скрипте.
+0

о шаблоне: когда массив должен найти значение в массиве или объявить ошибку типа? –

+0

Либо отправьте запрос в виде массива, либо нет. Если вы не хотите отправлять данные в виде массива, не смотрите на значение в массиве, поскольку это не обязательно, потому что я предполагаю, что вы полностью контролируете предполагаемый носитель запроса. Невозможно разрешить динамический запрос. В этом случае нет преимущества перед использованием массивов. Не рекламируйте ошибку типа, просто покажите 404 или общее сообщение об ошибке, не позволяющее хакеру много работать. –

+0

решает общее сообщение ... эта проблема возникла при тестировании моего класса проверки, я думаю, мне нужно будет создать правило для типов. –

-1

Вы можете использовать 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() издание, если это строка.

+0

Друг, вы не понимаете. поле 'first_name' должно быть строкой, но поле может быть изменено на' name = first_name [] ', что делает значение массива, спасибо –

+0

О, я вижу, вы говорите о подделке запроса. Вы можете просто добавить проверку типов в свой список проверок с помощью 'gettype()'. – chrishasbrouck

+0

GetType не обязательно проблема с типом массива критическая, тогда я думаю, что лучшим вариантом будет 'is_array'. is_array истинно, и когда я нахожу значение в массиве или рекламу ошибки типа? эта часть о стандарте –

Смежные вопросы