@Dreaded

Является ли такое использование вводимых данных безопасным?

Пользователь заполняет форму , данные отправляются методом POST.
В PHP сценарии примерно следующее
foreach ($_POST as $key => $value){
    if (empty($_POST[$key]))
        $errors[$key]='Поле обязательно для заполнения';
    else {
        //обработка вводимых данных
        //если нашли ошибку добавляем ее в массив $erors[$key];
        //и в html показываем пользователю что не так
        //если все хорошо, отправляем данные в БД.
    }
}

В html тегах, что бы пользователь не заполнял все 10 полей заново, в случае ошибки ошибки или некорректных данных, например следующее:
<input  type="text" name="firstname"  value="<?=($_POST['firstname']) ?? '';?>" required>


Безопасно ли подставлять значения полученные из POST(ведь по факту они только подставляются в форму, без проверки они в БД не уйдут) или всё же нет?
  • Вопрос задан
  • 261 просмотр
Решения вопроса 2
<input  type="text" name="firstname"  value="<?=($_POST['firstname']) ?? '';?>" required>

$_POST['firstname']='"</input><script src="scripts.js"></script>'
Ответ написан
@Yan-s
Пользовательский ввод надо чистить/экранировать/проверять перед отображением.
https://habr.com/post/66057/
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
dklight
@dklight
php кодер - level 2.5
Для начала надо посмотреть, действительно ли POST запрос пришел?
if ($_SERVER['REQUEST_METHOD'] !== 'POST'{
   die('error');
}


Перебирать все содержимое глобального массива тоже не есть хорошо.
Вместо foreach ($_POST as $key => $value){
Должен быть у вас список нужных ключей, которые вы будете в дальнейшем использовать. Например, если проверяется только 1 поле и ключ его 'id', то можно использовать функцию array_key_exists или filter_has_var:
if ($_SERVER['REQUEST_METHOD'] === 'POST'{
   if (array_key_exists('id',$_POST)){
      // очистка входной переменной
   
   }
}

также вы должно знать что за тип данных будет числиться под конкретным ключом входного массива, число, строка, массив и тд. Для их валидации можно использовать функцию filter_input:
filter_input(INPUT_POST,'id', FILTER_SANITIZE_NUMBER_INT);

либо простое приведение типов, если это число:
$id = (int) $_POST['id'];
$id = intval( $_POST['id']);

либо регулярные выражения, например вот так:
$id = 0; // значение по умолчанию
if (!preg_match("/^[1-9]\d+{1,9}$/")){
   die('ошибка');
}else{
   $id = $_POST['id'];

В вашем случае, вы хотите немного сократить труды пользователя, чтобы он не вводил данные еще раз.
для этого обычно используются функции htmlspecialchars, htmlentities. Можно также регулярными выражениями почистить, либо чем нибудь еще, вариантов много.

Напоследок приведу функцию, которая применяется для защиты строк в yii2,

function encode($content, $doubleEncode = true){
return htmlspecialchars($content, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8', $doubleEncode);
}

тогда ваш код примет вид:
<input  type="text" name="firstname"  value="<?=encode($_POST['firstname']) ?>" required>
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы