отказано в разрешении при публикации формы, содержащей текстовую область с содержимым html

#php #html #forms #phpmyadmin

#php #HTML #формы #phpmyadmin

Вопрос:

Хорошо, итак, вот моя проблема (которую я погуглил и не помог):

У меня есть форма, в которой есть элемент textarea, и в ней я хочу написать что-то вроде:

 <table><tr><td>123</td></tr></table>
  

и нажмите отправить, и я хочу, чтобы оно было сохранено в базе данных.

Теперь мой код работает, если я ввожу НЕHTML-символы, но если я ввожу, как указано выше, я получаю:

 Forbidden

You don't have permission to access /xxx/sample_posteddata.php on this server.

Additionally, a 404 Not Found error was encountered while trying to use an ErrorDocument to handle the request.
  

Я предполагаю, что каким-то образом на моем хостинге установлена некоторая защита, чтобы запретить это?

Я попытался вставить точный текст из интерфейса администратора php, и это работает нормально 😕

РЕДАКТИРОВАТЬ: полный исходный код файла podaciEdit.php:

 <?
            require_once("_dal/CredentialsManager.php");
            require_once("_dal/ProizvodRepository.php");
            $repos = new ProizvodRepository();

            if ( isset( $_POST["spremi"] ) ){
                $sifra = $_POST["sifra"];
                $naziv = $_POST["naziv"];                        
                $slika = $_POST["slika"];                   
                $podaci_full = htmlspecialchars($_POST["podaci_full"]);

                $podaci_min = $_POST["podaci_min"];
                $kategorija = $_POST["kategorija"];
                $kategorija_naziv = $_POST["kategorija_naziv"];

                if ($repos->updateProizvod ($sifra, $naziv, $slika, $podaci_full, $podaci_min, $kategorija, $kategorija_naziv))
                    echo "Podaci uspješno spremljeni!";
                else{
                    echo "Greška prilikom spremanja podataka!";                                             
                }

                echo '<br/>Kliknite <a href="proizvodiEdit.php">ovdje</a> za povratak.';
            }
            else if ( isset( $_GET["sifra"] ) ){
                $sifra = $_GET["sifra"];
                $proizvod = $repos->GetProizvod($sifra);

                if ($proizvod){                        
                    $sifra = $proizvod["sifra"];
                    $naziv = $proizvod["naziv"];                        
                    $slika = $proizvod["slika"];                        
                    $podaci_full = $proizvod["podaci_full"];

                    $podaci_min = $proizvod["podaci_min"];
                    $kategorija = $proizvod["kategorija"];
                    $kategorija_naziv = $proizvod["kategorija_naziv"];



                    //$data = htmlentities($podaci_full, ENT_QUOTES, "UTF-8");
                    echo <<<qq
                    <form id="proizvodEdit" method="POST" action="proizvodEdit.php">

                                            Podaci - tablica: (mozes resizeati po potrebi!)<br/>
                    <textarea class="podaci_full" id="podaci_full" name="podaci_full">{$podaci_full}</textarea>
                    <input type="submit" value="Spremi sve" name="spremi"/>
                    </form>

qq;
                }
                else
                    echo '<h2 class="title-page">Proizvod koji tražite ne postoji.</h2>';

            }
            else{
                echo '<h2 class="title-page">Proizvod koji tražite ne postoji.</h2>';
            }
  

Комментарии:

1. Без кода мы можем только догадываться.

2. вы пытаетесь использовать междоменную публикацию? используйте strip_tags() php.net/manual/en/function.strip-tags.php

3. @Rob W: пожалуйста, посмотрите, я c / ped весь php-код

Ответ №1:

Если вы являетесь владельцем веб-сайта, который вы можете использовать htmlspecialchars() , сохраните выходные данные в базе данных. Если вы хотите прочитать его обратно и преобразовать в html, используйте htmlspecialchars_decode()

для более точного ответа вам следует опубликовать код, который вы используете для сохранения данных в базе данных.

Комментарии:

1. как вы можете видеть, я использую htmlspecialchars(), но безрезультатно:(

2. @Nikola Выполняет ли этот метод updateProizvod() какую-либо дальнейшую обработку данных?

3. публичная функция updateProizvod($sifra, $naziv, $slika, $podaci_full, $podaci_min, $kategorija, $kategorija_naziv){ if ($this->openConnection()){ $sql = «ОБНОВИТЬ набор продуктов sifra=’$sifra’, naziv=’$naziv’, slika=’$slika’, podaci_full=’$podaci_full’, podaci_min=’$podaci_min’, kategorija=’$kategorija’, kategorija_naziv=’$kategorija_naziv’ ГДЕ sifra='». $sifra . «‘»; echo $ sifra; $result = mysql_query ($sql); если (mysql_affected_rows() == 1) возвращает true; else возвращает false; } else{ возвращает false; } }

4. @Nikola Вы неправильно экранируете свои данные (чтобы предотвратить использование SQL-инъекций mysql_real_escape_string() для параметров перед использованием в update запросе).

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

Ответ №2:

Я предполагаю, что вы изначально получили 403. Это проблема, связанная с правами доступа к файлам, сообщение об ошибке apache, а не php. Попробуйте перейти непосредственно к www.yourdomain.com//xxx/sample_posteddata.php и посмотрите, можете ли вы получить доступ к этому файлу. Может быть, даже попробуйте ПОЛУЧИТЬ параметр.

 www.yourdomain.com//xxx/sample_posteddata.php?sifra=xxx
  

Вы должны иметь к нему доступ. Если нет, попробуйте

 chmod  x /home/domain/public_html
  

404 — это код ошибки для НЕ НАЙДЕНО. Это означает, что ваша форма неправильно указывает на ваш php-файл или происходит сбой одного из включений. Проверьте свои пути.

Комментарии:

1. код работает отлично, если я ввожу обычный текст (без тегов HTML) в текстовую область и нажимаю Отправить. Он также отлично сохраняется в БД.

Ответ №3:

Поскольку ваш HTML содержит ключевое слово «table», я бы предпочел предположить, что это, вероятно, проблема, связанная с mod_security или каким-либо другим инструментом безопасности, который фильтрует ключевые слова SQL, чтобы помочь предотвратить SQL-инъекции. Попробуйте добавить в свой .htaccess :

 SecFilterEngine Off
  

Если это работает таким образом, это, вероятно, связано с mod_security. Обратите внимание, что вы, возможно, не сможете отключить его из своего .htaccess файла.

Ответ №4:

На самом деле, проблема заключалась в том, что функция stripslashes помогла решить проблему.

 $podaci_full = stripslashes($_POST["podaci_full"]);