• ベストアンサー

htmlspecialcharsについて(セキュリティ)

PHP5&MySQL5(OS:XP)で、テキストボックスに文字をいれ、DBに書き込む処理を作成しています。 「htmlspecialchars」を利用してセキュリティをかけたいのですが、htmlspecialcharsを使っても使わなくても同じ結果(セキュリティがきかない)が出てきてしまいます。 何が理由がお分かりの方、教えていただけると助かります。 ---ソース if ((isset($_POST["MM_insert"])) && ($_POST["MM_insert"] == "formComment")) { $insertSQL = sprintf("INSERT INTO comment_table (entry_id, name, email, url, `comment`) VALUES (%s, %s, %s, %s, %s)", GetSQLValueString($_POST['entry_id'], "int"), GetSQLValueString($_POST['name'], "text"), GetSQLValueString($_POST['email'], "text"), GetSQLValueString($_POST['url'], "text"), GetSQLValueString($_POST['comment'], "text")); を if ((isset($_POST["MM_insert"])) && ($_POST["MM_insert"] == "formComment")) { $insertSQL = sprintf("INSERT INTO comment_table (entry_id, name, email, url, `comment`) VALUES (%s, %s, %s, %s, %s)", GetSQLValueString(htmlspecialchars($_POST['entry_id']), "int"), GetSQLValueString(htmlspecialchars($_POST['name']), "text"), GetSQLValueString(htmlspecialchars($_POST['email']), "text"), GetSQLValueString(htmlspecialchars($_POST['url']), "text"), GetSQLValueString(htmlspecialchars($_POST['comment']), "text")); に変えています。 また、$_POST['comment']の入力文字は、 <script type="text/Javascript">window.alert('Javascriptが実行されました');</script> でも <iframe width="500" height="250" src="http://book.xxxx.co.jp/"></iframe> でもタグの内容通りの結果が表示されてしまいます。

  • idek
  • お礼率47% (170/361)
  • PHP
  • 回答数2
  • ありがとう数4

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

もうお分かりだと思いますが SQLインジェクション対策であれば プレイスホルダを使用するのが一般的です。 PDOかMDB2か何をお使いになっているか分かりかねますが それぞれにありますので、検索してみてください。

idek
質問者

お礼

やってみます。ありがとうございました。

その他の回答 (1)

  • t140
  • ベストアンサー率39% (59/150)
回答No.1

関数GetSQLValueString内部で既にmysql_real_escape_stringによる エスケープがされているのでhtmlspecialcharsは不要です。 また、htmlspecialcharsはSQLインジェクション対策のようなセキュリティ として使うものではないです。

idek
質問者

お礼

ありがとうございました。大変参考になりました。

関連するQ&A

  • 別々のテーブルで共通のid使う

    一つのページから別々のテーブルにデータをINSERTしたいのですが、"id"と"number"は同じ値でそれぞれのテーブルにいれたいのですが、どうやってやるのでしょうか? 下のPHPのコード(一部)でデータを流してみたのですが、このままやると、もしデータに不具合があって片方だけ登録されないことがあると、一方は登録されて、一方は登録されないという事態が発生してしまい、"id"が違う番号で登録されてしまう可能性があります。 id int(8) NOT NULL AUTO_INCREMENT で"id"は作りました! $insertSQL1 = sprintf("INSERT INTO tbl1 (id, number, name, price) VALUES (%s, %s, %s, %s)", GetSQLValueString($_POST['id'], "int"), GetSQLValueString($_POST['number'], "text"), GetSQLValueString($_POST['name'], "text"), GetSQLValueString($_POST['price'], "int")); $insertSQL2 = sprintf("INSERT INTO tbl2 (id, number, ename, eprice, extra) VALUES (%s, %s, %s, %s, %s)", GetSQLValueString($_POST['id'], "int"), GetSQLValueString($_POST['number'], "text"), GetSQLValueString($_POST['ename'], "text"), GetSQLValueString($_POST['eprice'], "int"), GetSQLValueString($_POST['extra'], "text")); 別々のテーブルで共通のidを使う方法はないでしょうか? phpMyAdminのSQLを使ってます。 回答よろしくおねがいします!

    • ベストアンサー
    • MySQL
  • メールフォームにある必須入力について

    こんばんは、今メールフォームを作っています。入力画面→確認画面→完了ページという流れで作ったのですがよく必須項目に何も入れなかったり、間違った文字をいれたりするとエラーページが表示されるようにしたいと思っているのですが、なかなか上手くできません。下記のスクリプトからだとどうやってやったら良いのでしょうか?よろしくおねがいします。 <?php if (! isset($_POST[btn1]) and! isset($_POST[btn2]) and! isset($_POST[cancel])) { //入力画面 $body = "必要な項目を入力して[OK]ボタンをクリックしてください。 <FORM action='$_SERVER[PHP_SELF]' method='POST'> 名前:<INPUT size='40' type='text' name='name'><BR><BR> フリガナ:<INPUT size='40' type='text' name='kana'><BR><BR> 電話番号:<INPUT size='40' type='text' name='tel'><BR><BR> E-Mailアドレス:<INPUT size='40' type='text' name='email'><BR><BR> お問い合わせ内容:<BR><TEXTAREA rows='6' cols='40' name='inquiry'></TEXTAREA><BR><BR> <INPUT type='submit' name='btn1' value=' OK '> </FORM>"; } elseif (isset($_POST[btn1])) { //入力画面で[OK]がクリックされたとき $name = htmlspecialchars(stripcslashes($_POST[name])); $kana = htmlspecialchars(stripcslashes($_POST[kana])); $tel = htmlspecialchars(stripcslashes($_POST[tel])); $email = htmlspecialchars(stripcslashes($_POST[email])); $inquiry = htmlspecialchars(stripcslashes($_POST[inquiry])); $body = "ご入力した内容でメッセージを送信します。<BR> よろしければ[送信]ボタンをクリックしてください。 <FORM action='$_SERVER[PHP_SELF]' method='POST'> 名前:$name<BR><BR> フリガナ:$kana<BR><BR> 電話番号:$tel<BR><BR> E-Mailアドレス:$email<BR><BR> お問い合わせ内容:<BR>" . nl2br($inquiry) . "<BR><BR> <INPUT type='submit' name='btn2' value=' 送信 '> <INPUT type='submit' name='cancel' value='キャンセル'> <INPUT type='hidden' name='name' value=\"$name\"> <INPUT type='hidden' name='kana' value=\"$kana\"> <INPUT type='hidden' name='tel' value=\"$tel\"> <INPUT type='hidden' name='email' value=\"$email\"> <INPUT type='hidden' name='inquiry' value=\"$inquiry\"> </FORM>"; } elseif (isset($_POST[btn2])) { //確認画面で[送信]がクリックされたとき //メールの送信処理を行う $name = stripcslashes($_POST[name]); $kana = stripcslashes($_POST[kana]); $tel = stripcslashes($_POST[tel]); $email = stripcslashes($_POST[email]); $inquiry = stripcslashes($_POST[inquiry]); $mailto = "kuma202000@yahoo.co.jp"; $mailsbj = "メールフォームからの送信"; $mailbody = "$name さんからのメールが届きました。\n" . "---------------------------------------------\n" . "名前:$name \n" . "フリガナ:$kana \n" . "電話番号:$tel \n" . "E-Mailアドレス:$email \n" . "メッセージ:$inquiry \n" . "---------------------------------------------\n"; mb_language("ja"); if (mb_send_mail($mailto, $mailsbj, $mailbody, $mailheader)) { $body = "メールを送信しました。ありがとうございました。<BR><BR>"; } else { $body = "メールの送信に失敗しました。<BR><BR>"; } $body .= "<A href='$_SERVER[PHP_SELF]'>戻る</A>"; } elseif (isset($_POST[cancel])) { //確認画面で[キャンセル]がクリックされたとき header("location: $_SERVER[PHP_SELF]"); exit(); } ?> <HTML> <HEAD> </HEAD> <BODY> <?=$body?> </BODY> </HTML>

    • 締切済み
    • PHP
  • セキュリティ

    プログラム初心者です PDOやる前にmysqliの手続き型で勉強中です 手続き型でフォームから入力された値をこんな感じにするのは危険でしょうか? 悪意を持ったユーザーに簡単に突破されますか? if(!empty($_POST['name'])){ $sql = sprintf('SELECT * FROM hoge WHERE name="%s"', mysqli_real_escape_string($link,$_POST['name']) ); } 更新するとき if(!empty($_POST['name'])){ mysqli_query($link,sprintf('UPDATE hoge SET name="%s" WHERE id=%d', mysqli_real_escape_string($name), mysqli_real_escape_string($link,10) )); } よろしくお願いします

    • ベストアンサー
    • PHP
  • htmlspecialcharsの挙動について

    PHPのhtmlspecialcharsについての質問です。 とあるフォームで、「情報登録フォーム」→「確認ページ」→「完了ページ」という構成でプログラムを組んでいます。 タグはエスケープした状態でDBに保存しようと思ってます。 &lt;b&gt;カズン&lt;/b&gt;のようにエスケープした文字列をPOST送信したらもとの<b>カズン</b>に戻るという現象に見舞われてます。 まず「情報登録フォーム」で下記のように値をおくります。 <input type="text" name="shop" value="<b>カズン</b>" /> 「情報登録フォーム」でタグが入ってもてもエスケープできるように、「確認ページ」の出力時にhtmlspecialcharsを使っています。 結果、下記のようになります。 <input type="hidden" name="shop" value="&lt;b&gt;カズン&lt;/b&gt;" /> 次にこの値を「完了ページ」にPOSTで送ろうとしたら元の<b>カズン</b>にかわってしまいます。 「完了ページ」で再度htmlspecialcharsをかけたら&lt;b&gt;カズン&lt;/b&gt;になるんですが。 私は&lt;b&gt;カズン&lt;/b&gt;は普通にPOSTすれば&lt;b&gt;カズン&lt;/b&gt;が送られてくると仮定してたのですが、これは正しい仕様なのでしょうか?

    • 締切済み
    • PHP
  • POSTされたデータをそのまま変数名にするような・・・

    お世話になります。 タイトルのとおりなのですが、POSTされたデータをそのまま変数名にするような便利な方法はないでしょうか。 $name=htmlspecialchars($_POST["name"], ENT_QUOTES, $code); $email=htmlspecialchars($_POST["email"], ENT_QUOTES, $code); ・ ・ ・ をたくさんあるので簡単にできないかなーと思ったんですが、何か良い方法がありましたら教えてください。 よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • MySQLで表示され、追加・削除・変更ができない。

    MySQLでPHPにデータを追加・削除・変更を作っていたのですが、 表示はどうにかしてできたのですが、 追加・削除・変更のボタンを押してもなにもかわりません。 何回も見たのですが、どこが間違えてるのかさっぱりです。 <?php require_once("../mydb_ini.php"); $con_mydb = mysql_connect($MYDBSERVER, $MYDBUSER, $MYDBPASSWARD); $selectmydb = mysql_select_db($MYDBNAME, $con_mydb); $num=0; $mydbsql = "select * from newsline"; $rst = mysql_query($mydbsql, $con_mydb); $num = mysql_affected_rows(); $error = ""; $new_no = ""; $new_category = ""; $new_date = ""; $new_content = ""; $new_url_db = ""; $new_target = ""; $new_disabled = ""; if($_SERVER['REQUEST_METHOD']=="POST"){ if(isset($_POST["submit_add"])){ $new_no = htmlspecialchars($_POST["new_no"], ENT_QUOTES); $new_category = htmlspecialchars($_POST["new_category"], ENT_QUOTES); $new_date = htmlspecialchars($_POST["new_date"], ENT_QUOTES); $new_content = htmlspecialchars($_POST["new_content"], ENT_QUOTES); $new_url_db = htmlspecialchars($_POST["new_url_db"], ENT_QUOTES); $new_target = htmlspecialchars($_POST["new_target"], ENT_QUOTES); $new_disabled = htmlspecialchars($_POST["new_disabled"], ENT_QUOTES); if($error==""){ $mydbsql = "INSERT INTO newsline VALUES($new_category', '$new_date', '$new_content', '$new_url_db', '$new_target', '$new_disabled')"; } } if(isset($_POST["submit_upd"])){ $no = key($_POST[submit_upd]); $category = htmlspecialchars($_POST["category"][$no], ENT_QUOTES); $date = htmlspecialchars($_POST["date"][$no], ENT_QUOTES); $content = htmlspecialchars($_POST["content"][$no], ENT_QUOTES); $url_db = htmlspecialchars($_POST["url_db"][$no], ENT_QUOTES); $target = htmlspecialchars($_POST["target"][$no], ENT_QUOTES); $disabled = htmlspecialchars($_POST["disabled"][$no], ENT_QUOTES); if($error==""){ $mydbsql = "UPDATE newsline SET category='$category', date='$date', content='$content', url_db='$url_db', target='$target', disabled='$disabled' WHERE no=$no"; } } if(isset($_POST["submit_del"])){ $no = key($_POST[submit_del]); $mydbsql = "DELETE FROM newsline WHERE no=$no"; } if($error==""){ $mydbsql; $new_no = ""; $new_category = ""; $new_date = ""; $new_content = ""; $new_url_db = ""; $new_target = ""; $new_disabled = ""; } } ?> <!DOCTYPE HTML> <html> <head> <meta charset="utf-8"> <title>無題ドキュメント</title> </head> <body> <?=$error ?> <form action="<?=$_SERVER['PHP_SELF']?>" method="post"> <?php $mydbsql = "select * from newsline"; while($mydb = mysql_fetch_array($rst)){ $no = $mydb["no"]; $category = $mydb["category"]; $date = $mydb["date"]; $content = $mydb["content"]; $url_db = $mydb["url_db"]; $target = $mydb["target"]; $disabled = $mydb["disabled"]; mb_convert_variables('UTF-8', 'EUC-JP', $category); mb_convert_variables('UTF-8', 'EUC-JP', $content); echo <<<EOT $no: $new_no: <input type="text" name="category[$no]" value="$category"> <input type="text" name="date[$no]" value="$date"> <input type="text" name="content[$no]" value="$content"> <input type="text" name="url_db[$no]" value="$url_db"> <input type="text" name="target[$no]" value="$target"> <input type="text" name="disabled[$no]" value="$disabled"> <input type="submit" name="submit_upd[$no]" value="変更"> <input type="submit" name="submit_del[$no]" value="削除"> <br> EOT; } ?> <br> <input type="text" name="new_category" value="<?=$new_category ?>"> <input type="text" name="new_date" value="<?=$new_date ?>"> <input type="text" name="new_content" value="<?=$new_category ?>"> <input type="text" name="new_url_db" value="<?=$new_url_db ?>"> <input type="text" name="new_target" value="<?=$new_target ?>"> <input type="text" name="new_disabled" value="<?=$new_disabled ?>"> <input type="submit" name="submit_add" value="追加"> </form> <br> <?php if($mydbsql>""){ echo "発行した:<br>$mydbsql"; } ?> </body> </html>

    • ベストアンサー
    • PHP
  • javascript php フォームについて

    javascriptで作ったフォームをphpに送信したいのですが、上手く送信できません。 どのようにすれば上手く送信することができるでしょうか? 回答お願いします。 javascript側のソース <body> <form name="nform1" method="POST" action="./kaitou1.php" enctype="text/plain"> <p>問1</p> <p> (1)<input type="text" name="kaitouran11" size="20"> (2)<input type="text" name="kaitouran12" size="20"> (3)<input type="text" name="kaitouran13" size="20"> (4)<input type="text" name="kaitouran14" size="20"> </p> </form> <form name="nform2" method="POST" action="./kaitou1.php" enctype="text/plain"> <p>問2</p> <p> (1)<input type="text" name="kaitouran21" size="20"> (2)<input type="text" name="kaitouran22" size="20"> (3)<input type="text" name="kaitouran23" size="20"> (4)<input type="text" name="kaitouran24" size="20"> </p> </form> <form name="nform3" method="POST" action="./kaitou1.php" enctype="text/plain"> <p>問3</p> <p> (1)<input type="text" name="kaitouran31" size="20"> (2)<input type="text" name="kaitouran32" size="20"> (3)<input type="text" name="kaitouran33" size="20"> (4)<input type="text" name="kaitouran34" size="20"> </p> </form> <input type="button" value="送信" onClick="send()"> </body> php側のソース <body> <p>問1</p> <p>(1)<?php print(htmlspecialchars($_POST['kaitouran11'], ENT_QUOTES, 'UTF-8')); ?> (2)<?php print(htmlspecialchars($_POST['kaitouran12'], ENT_QUOTES, 'UTF-8')); ?> (3)<?php print(htmlspecialchars($_POST['kaitouran13'], ENT_QUOTES, 'UTF-8')); ?> (4)<?php print(htmlspecialchars($_POST['kaitouran14'], ENT_QUOTES, 'UTF-8')); ?> </p> <p>問2</p> <p>(1)<?php print(htmlspecialchars($_POST['kaitouran21'], ENT_QUOTES, 'UTF-8')); ?> (2)<?php print(htmlspecialchars($_POST['kaitouran22'], ENT_QUOTES, 'UTF-8')); ?> (3)<?php print(htmlspecialchars($_POST['kaitouran23'], ENT_QUOTES, 'UTF-8')); ?> (4)<?php print(htmlspecialchars($_POST['kaitouran24'], ENT_QUOTES, 'UTF-8')); ?> </p> <p>問3</p> <p>(1)<?php print(htmlspecialchars($_POST['kaitouran31'], ENT_QUOTES, 'UTF-8')); ?> (2)<?php print(htmlspecialchars($_POST['kaitouran32'], ENT_QUOTES, 'UTF-8')); ?> (3)<?php print(htmlspecialchars($_POST['kaitouran33'], ENT_QUOTES, 'UTF-8')); ?> (4)<?php print(htmlspecialchars($_POST['kaitouran34'], ENT_QUOTES, 'UTF-8')); ?> </p> </body>

    • 締切済み
    • PHP
  • MT コメントフォームのテキストエリアの『横幅』を変更したい

    ブログテンプレートをデフォルトを元に編集しています。 エントリーテンプレートを編集しているときに気づいたのですが、コメントフォームのテキストエリアの横幅の値を変えても、ある幅までにしか縮みません。もしかしたら編集する場所が間違っているかもしれませんが、お助け願います。 ついでに編集したあとのコメントフォームの例です。 <label for="comment-author">名前:</label> <input id="comment-author" name="author" size="20" /> <p id="comments-open-text"> <label for="comment-text">コメント: <MTIfAllowCommentHTML>(スタイル用のHTMLタグが使えます)</MTIfAllowCommentHTML></label> <textarea id="comment-text" name="text" rows="5" cols="40"></textarea> </p>

  • phpのエラーについて

    phpでメールフォームを作っています。 メールフォーム(1)、(2)、(3)と3つ作っています。 (2)で確認して記入内容に間違いがなれけば送信して(3)を表示。 間違っていたら(1)に戻るというものです。 確認するページ(2)の記述でParse error: syntax error, unexpected T_STRING in……とエラーが出ます。 その問題の行は、セッションを開始したすぐ下の行の die('不正アクセスの疑いがあります。'); という部分です。 この行と、それより以前・以後を何度も確認しましたがエラーの原因となるものが発見できません…… PHP初心者なのでもうお手上げです>< どなたかご教授よろしくお願いします!!! レンタルサーバーはヘテムルでphpは5.2.8です。 <?php function checkInput($var){ if(is_array($var)){ return array_map('checkInput', $var); } else { if(get_magic_quotes_gpc()){ $var = stripslashes($var); } if(preg_match('/\0/', $var)){ die('不正な入力です。'); } if(!mb_check_encoding($var, 'UTF-8')){ die('不正な入力です。'); } return $var; } } session_start(); $_POST = checkInput($_POST); if(isset($_POST['ticket']) && isset($_SESSION['ticket'])){ $ticket = $_POST['ticket']; if(!in_array($ticket, $_SESSION['ticket'])){ die('不正アクセスの疑いがあります。'); //この行がエラーとなります。 } }else{ die('不正アクセスの疑いがあります。'); } $name = isset($_POST['name']) ? $_POST['name'] : NULL ; $email = isset($_POST['email']) ? $_POST['email'] : NULL ; $name = isset($_POST['comment']) ? $_POST['comment'] : NULL ; $error = array(); if(trim($name) == ''){ $error[] = 'お名前は必須項目です。'; } else if(mb_strlen($name) > 100){ $error[] = 'お名前は100文字以内でお願いします。'; } if(trim($email) == ''){ $error[] = 'メールアドレスは必須項目です。'; } else { $pattern = '/^([a-z0-9\+_\-]+)(\.[a-z0-9\+_\-]+)*@([a-z0-9\-]+\.)+[a-z]{2,6}$/iD'; if(!preg_match($pattern, $email)){ $error[] = 'メールアドレスの形式が正しくありません'; } } if(trim($comment) == ''){ $error[] = 'コメントは必須項目です。'; } else if(mb_strlen($comment) > 500){ $error[] = 'コメントは500文字以内でお願いします。'; } $_SESSION['name'] = $name; $_SESSION['email'] = $email; $_SESSION['comment'] = $comment; $_SESSION['error'] = $error; if(count($error) > 0) { $dirname = dirname($_SERVER['SCRIPT_NAME']); $dirname = dirname == DIRECTORY_SEPARATOR ? '' : $dirname; $uri = 'http://' .$_SERVER['SERVER_NAME'] . $dirname . '/○○.php'; header('HTTP/1.1 303 See Other'); header('Location: ' . $uri); } else { ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <title>確認フォーム</title> </head> <body> <div id="form"> <p>以下の内容でよろしければ送信ボタンを押してください。</p> <dl> <dt>お名前:</dt> <dd><?php echo h($name);?></dd> </dl> <dl> <dt>メールアドレス:</dt> <dd><?php echo h($email);?></dd> </dl> <dl> <dt>コメント:</dt> <dd><?php echo nl2br(h($comment));?></dd> </dl> <form action="thank.php" method="post"> <input type="hidden" name="ticket" value="<?php echo h($ticket);?>" /> <input type="submit" name="submit" value="送信する" /> </form> </div> </body> </html> <?php } function h($string) { return htmlspecialchars($string, ENT_QUOTES); } ?>

    • ベストアンサー
    • PHP
  • PHPでMySQLデータを更新するとエラー

    PHPで作成したプログラムでMySQLにデータを登録しています。 新規にデータの追加はできるのですが、更新するとエラーになります。 スクリプトは if (isset($_POST["submit_upd"])){ $no = key($_POST[submit_upd]); $name = htmlspecialchars($_POST["name"][$no], ENT_QUOTES); $division = htmlspecialchars($_POST["division"][$no], ENT_QUOTES); $email = htmlspecialchars($_POST["email"][$no], ENT_QUOTES); $tel = htmlspecialchars($_POST["tel"][$no], ENT_QUOTES); $group = htmlspecialchars($_POST["group"][$no], ENT_QUOTES); $sql = "UPDATE user SET name='$name',division='$division',email='$email',tel='$tel',group='$group' WHERE no=$no"; $mysql->query($sql); $error = "{$no}番のデータを変更しました"; エラーは(例:4番のデータのグループを3番に変更) 1064:You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'group='3' WHERE no=4' at line 1 となっています。 以前同じプログラムで下記の質問をして、こちらは解決したのですが 結合していたり、whileループの設定などのせいでgroupの値を上手く得られないのか?と悩んでいます。 http://okwave.jp/qa3972723.html クラスも上記に記載してあります。 まわりに聞ける人が全くおらず困っています。 どうかお力を貸していただければと思いますので よろしくお願いします。

    • ベストアンサー
    • MySQL