0

XSS 攻撃の防止に関する Web 上の記事がいくつかありますが、解決策が見つかりませんでした。

htmlspecialchars(mb_convert_encoding($value, "UTF-8", "UTF-8"),ENT_QUOTES,'UTF-8')

また

json_encode($value, JSON_HEX_QUOT|JSON_HEX_TAG|JSON_HEX_AMP|JSON_HEX_APOS);

または単にstrip_tags.
現時点では、フォーマットを壊すため、メッセージを除いて、情報を取得して表示する必要があるたびにこれらのメソッドを使用しています


私がする必要があるのは、この状況からの XSS 攻撃を防ぐことです:

  • エラーが発生した場合に名前を返し、警告するアップロードフォームがあります。

    echo '<script>parent.noty({text: "File Name:'.json_encode($_FILES['filename']['name'][$i]).' Error Code:'.$_FILES['filename']['error'][$i].'",type:"error",timeout:9000});</script>';
    
  • ユーザーは、スクリプトなどの html タグを含むことができるメッセージを書くことができます。私はそれを保持する必要があります: 私は ckeditor を使用して新しいメッセージを書きます。

    ...) 残り、スクリプト部分をアームレスにする

この時点で、私json_encodeが使用するファイル名を返しますが、よくわかりません
編集
コメントから、可能性はあまりないことがわかったので、これらの方法が信頼できない理由を知りたいです
編集
これが方法ですメッセージを取得します。

$query = "SELECT 
                    a.enc_id,
                    IF(b.department_name IS NOT NULL, b.department_name,'Unknown'),
                    IF(c.name IS NOT NULL, c.name,IF(a.ticket_status='2','Not Assigned','Unknown'),
                    a.title,
                    CASE a.priority WHEN '0' THEN 'Low' WHEN '1' THEN 'Medium' WHEN '2' THEN 'High' WHEN '3' THEN 'Urgent' WHEN '4' THEN 'Critical' ELSE priority  END,
                    a.created_time,
                    a.last_reply,
                    CASE a.ticket_status WHEN '0' THEN '<span class=\'label label-success\'>Closed</span>' WHEN '1' THEN '<span class=\'label label-important\'>Open</span>' WHEN '2' THEN '<span class=\'label label-warning\'>To Assign</span>' WHEN '3' THEN '<span class=\'label label-important\'>Reported</span>' ELSE 'Error' END 
                FROM ".$SupportTicketsTable." a
                LEFT JOIN ".$SupportDepaTable." b
                    ON  b.id=a.department_id
                LEFT JOIN ".$SupportUserTable." c
                    ON c.id=a.operator_id
                WHERE a.user_id=".$_SESSION['id']." 
                ORDER BY a.last_reply DESC 
                LIMIT 350";
        $STH = $DBH->prepare($query);
        $STH->execute();
        $list=array('response'=>'ret','tickets'=>array('user'=>array()));
        $STH->setFetchMode(PDO::FETCH_ASSOC);
        $a = $STH->fetch();
        if(!empty($a)){
            do{
                $list['tickets']['user'][]=array('id'=>$a['enc_id'],'dname'=>$a['dname'],'opname'=>$a['opname'],'title'=>htmlspecialchars(mb_convert_encoding($a['title'], "UTF-8", "UTF-8"),ENT_QUOTES,'UTF-8'),'priority'=>$a['prio'],'date'=>$a['created_time'],'reply'=>$a['last_reply'],'status'=>$a['stat']);
            }while ($a = $STH->fetch());
        }
...
echo json_encode($list);
4

1 に答える 1

0

この特定のケースでは、コンテンツをエスケープする正しい方法は次のようになります。

echo '...{text: "File Name:"+'.json_encode($_FILES['filename']['name'][$i]).'+" Error code...'

これは、json_encodeあらゆる入力を受け取り、JavaScript コンテキストで安全にダンプできるようにするためです。文字列は引用符で囲まれ、有効になるように適切にエスケープされます。ただし、機能させるには、値を連結する前に既存の引用符を閉じる必要があります。

つまり、このテキストをページに配置する関数はdocument.createTextNode(arguments[0].text);、HTML コンテキストではなく、テキスト ノードを作成するようなものを使用すると想定しています。

于 2013-08-29T16:53:19.283 に答える