0

フォームから取得した userInput テキストをデータベースに照会しており、そのテキストを HTML ページに表示します。XSS を防ぐには、結果を反復処理して htmlspecialchars() を適用する必要があります。確かに、変更 fetchAll() を fetch() に変更し、そこに htmlspecialchars() を適用しますが、ネイティブの MySQL 関数を使用してインクルードするとよいでしょう。私のクエリでそれ。探しましたが見つかりませんでした。存在しますか?自分で作成することはできますか? ありがとう

$sql ='SELECT userInput FROM table WHERE fk_id=123';
$stmt = db::db()->query($sql);
return $stmt->fetchAll(PDO::FETCH_ASSOC);
4

5 に答える 5

1

それはすべて、保存するデータに依存します。Web サイトに直接表示するデータを保存する場合は、明らかに htmlspecialchars() などが必要です。PDO は、準備済みステートメントを使用することにより、mysql_real_escape() などの使用を廃止します。

鉄則として、すべての文字列は適切な宛先のためにエスケープする必要があります: HTML 文字列は HTML エスケープを受け、MySQL 文字列は MySQL エスケープを受けます。

編集 :

データベースから取得すると (またはそのいずれかを html としてユーザーに表示する)、ユーザーを XSS 攻撃から保護するために htmlentities() などを使用して、次の場所 (html) に備えて再度エスケープします。

于 2012-12-01T17:52:56.150 に答える
0

6年後、最初の部分への答えはまだ「いいえ、ありません」だと思います...しかし、2番目の部分への答えは「はい」です。必要に応じて、MySQLストアドプロシージャを使用して独自のものを作成できます。

とにかく、クロスサイト スクリプティング攻撃の状況に対処する最善の方法は、HTML がデータベースに格納される前に、スクリプト タグまたはインライン スクリプトを削除することです。 html をデータベースに送信します。

于 2018-08-16T10:49:06.750 に答える
-2

データのエスケープはデータベースではなく、PHP アプリケーションで行う必要があります。さらに、モデルではなく常にビューで実行する必要があります。

于 2012-12-01T19:52:51.417 に答える
-3

私の提案: オブジェクトを使用します。セッター/ゲッターを使用して独自のクラスを作成し、データを保存/返す方法を定義します。

元:

class UserRow{
    public $id;
    public $email;
    protected $bio;

    public function getBio(){
        return htmlspecialchars($this->bio);
    }

    public function __set($property, $value){
        $this->$property = $value;
    }

    public function __get($property){
        $getter = 'get'.$property;
        if(is_callable(array($this,$getter))){
            return $this->$getter();
        }else{
            return $this->$property;
        }
    }
}

$stmt = $pdo->query("SELECT * FROM user");
$stmt->fetchAll(PDO::FETCH_CLASS, 'UserRow');
于 2012-12-01T17:31:39.070 に答える