0

jquery で ajax リクエストをしようとしていますが、php 関数を送信するたびに 403 Forbidden エラーが発生します。私が必要とするものの例は、ソースコードも受け入れるこのstackoverflowコメント入力です。

私がやったこと:

PHP

class Error {
  public function __construct() {
    // etc
  }

  public function comment($error_id, $content) {

    if(!$this->user->loged)
      return false;

    $error_id = $this->mysqli->real_escape_string($error_id);
    if(!is_numeric($error_id))
      return false;

    $this->mysqli->query("INSERT INTO comments 
                          VALUES (NULL, '" . $error_id . "', '" . $this->user->user_id . "', '" . $content . "', NULL)");
    return $this->mysqli->insert_id;

  }
}

クラス内の関数$contentを使用してエスケープされている場所:escapeStringCommon

public function escapeString($text) {
  return htmlspecialchars($this->mysqli->real_escape_string($text));
}

私のJSは:

$('div.left-content').on('click','form.comment input[type=button]',function(){

        $but = $(this);

        if(!erori.user.loged) {

            showTooltip($but, 'Trebuie să fii autentificat pentru a putea comenta!');

            return false;
        }

        if($but.prev('textarea').val() == $but.prev('textarea').data("text") || $but.prev('textarea').val().trim() == '') {

            showTooltip($but, 'Completează câmpul de text pentru a putea trimite comentariul!');

            return false;
        }

        if($but.prev('textarea').hasClass('disabled'))
            return false;

        $but.attr('disabled', 'disabled');
        $but.prev('textarea').addClass('disabled');

        $.post(
            $but.parent().attr('action'),
            $but.parent().serialize(),
            function(data){
                if(data.content) {
                    $('<div class="comment"></div>').html(data.content).insertBefore($but.parent().parent());
                    if($but.prev('textarea').hasClass('disabled'))
                        $but.prev('textarea').val('').trigger('blur').animate({height: '20px'}, 300);
                    $but.prev('textarea').removeClass('disabled');
                }

                $but.removeAttr('disabled');

            },
            'json')
        .fail(function(xhr, textStatus, errorThrown) {
            if(errorThrown == 'Forbidden') {
                showTooltip($but, 'Comentariul nu a putut fi trimis!<br />Dacă vrei să trimiți sursă de cod folosește <strong>` cod sursă `</strong>!');

                $but.prev('textarea').removeClass('disabled');
                $but.removeAttr('disabled');

                return false;
            }
        })                                                         
    }); 

アクションコードは次のとおりです。

$error = new Error($mysqli, $user);

$content = $common->escapeString($_POST['error_comment']);

$comment_id = $error->comment($_POST['error_id'], $content);

この 403 Forbidden エラーを返さないために、サーバーに送信する前にソース コードをエスケープする方法は?

私が言おうとしているのは、たとえばコメントしようとするとThis is my comment with <?php $sql = mysql_query(); ?>、サーバーが 403 エラー コードをスローしているということです。

4

1 に答える 1

2

ユーザーはJavaScriptをオフにしてコードを直接送信し、クライアント側のフィルタリングをスキップできるため、送信する前にコードを実際にフィルタリングすることはできません。

そして 403 エラー - これは「権限」エラーであるため、ヘッダーを修正するか、php-file を修正する必要があります。

于 2013-02-01T12:57:34.380 に答える