質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

1回答

619閲覧

ループ処理がある場合のXSS対策、htmlエスケープ処理の実装方法について

退会済みユーザー

退会済みユーザー

総合スコア0

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2022/01/08 01:02

XSS対策前は以下コードのように、
$resに値を代入して、htmlに出力していました。

XSS対策で、出力時にhtmlエスケープ処理をしたいのですが、
今回のようにループ処理がある場合、
どのような方法が良いのか分からず教えて頂ければ幸いです。

PHP

1<?php 2function h($str) { 3return htmlspecialchars($str, ENT_QUOTES, 'UTF-8'); 4}//XSS対策で追加 5 6$res = ""; 7$sql = "SELECT * FROM table1 WHERE Cusid=?"; 8$sth = $dbh -> prepare($sql); 9$array = array($_SESSION['cusid']); 10$sth -> execute($array); 11$result = $sth->fetchall(PDO::FETCH_ASSOC); 12$sth = null; 13$res .= "<table>"; 14foreach($result as $row){ 15$title = $row['Title']; 16$price = $row['Price']; 17$res .= <<<eof 18<tr><td> 19<form method='post'> 20<input type='text' name='title' value='{$title}'> 21<input type='number' name='price' value='{$price}'> 22</tr></td> 23eof; 24} 25$res .= "</table>"; 26} 27?> 28 29<section class="section-contents"> 30<div class="section-inner"> 31<?=$res?> 32</div> 33</section>

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

HTMLに入れ込むところで処理しましょう。

php

1$escaped_title = h($title); 2$escaped_price = h($price); 3$res .= <<<eof 4<tr><td> 5<form method='post'> 6<input type='text' name='title' value='$escaped_title'> 7<input type='number' name='price' value='$escaped_price'> 8</tr></td> 9eof;

投稿2022/01/08 01:08

maisumakun

総合スコア145184

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2022/01/08 01:24

ご回答頂きありがとうございます。 頂いた内容は正しいと思っておりますが、 一点、学習のため、宜しければアドバイス頂ければ幸いです。 「エスケープは必ず、出力を行うその時点で行います」との文言をよく見受けられますが、 ご参考例は、出力(<?=$res?>)の1つ手前の処理という感覚がします。 この感覚は誤りでしょうか。 どうぞよろしくお願い致します。
maisumakun

2022/01/08 02:09 編集

> この感覚は誤りでしょうか。 HTMLに混ぜ込んでしまった後に、文字列だけエスケープするのは不可能です。字義通りに解釈するのではなく、「何のために」それを実行するのかを考えてください。
maisumakun

2022/01/08 02:10

(なお、実践的には、forなどにも対応したテンプレートエンジンを使う、というのが妥当です)
退会済みユーザー

退会済みユーザー

2022/01/08 02:51

お忙しい中、教えて頂き誠にありがとうございました。 参考にいたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問