PHPについて質問です。


学習し始めてまだ間がない初心者ですが、
自分でスクリプト(極シンプルなリンク作成プログラム)を作成してみました。
http://hatena88.web.fc2.com/hatena/newpage1.html

このスクリプトについてどんなささいなことでも良いのでご意見ください。
本当にどんな細かいことでも今後の参考になります。
私ならこうするといった代替案は特に嬉しいです。

なお、質問者は本当に初心者なので、回答には理論だけでなく、
実際にスクリプトをお示しいただけると理解の助けとなります。

質問が不足していたり、不明瞭だった場合はコメント欄にその旨お知らせください。
よろしくお願いします。

回答の条件
  • 1人2回まで
  • 登録:2008/04/29 01:40:11
  • 終了:2008/05/04 03:05:19

回答(3件)

id:tezcello No.1

tezcello回答回数460ベストアンサー獲得回数692008/04/29 09:55:23

ポイント35pt

脳内デバッグなので、外している所があるかもしれませんが。

  • showAllMySQLData() 内の echo の所: " で括るのなら、$url, $title をわざわざ外に出さなくてもいいのでは?
  • 同上:$titel の後は</a>では?
  • 空要素であるタグが、閉じているものとそうでないものが混在している(閉じている例 <br/>)
  • mysql_start() ではDBをオープンしたら必ずクローズしてしまいますが、データの追加やソート、抽出などの作業をしないのでしょうか。そうであれば、関数を2つに分けたり、showAllMySQLData() に引数にクエリ後のリソースを指定できるようにしておく必要性が無いでしょう。
  • MySQL に接続する時はエラーを抑制していますが、ノーチェックで大丈夫ですか?(接続に失敗してもDBの選択時にエラーになるでしょうから、大丈夫かもしれませんが、原因が掴みにくいのでは?)
  • set_error_handler() で用意している処理は、デフォルトの状態と殆ど同じようなので不要では?(display_errors が 1 でないと表示されないけど、こちらもデフォで 1 では?)
  • mysql系の関数内で起こるエラーは、そのエラー内容まで文章で error_handler に渡してくれるのでしょうか?そうでないなら、エラーチェックをし、mysql_error() 等で取り出さないとエラーの内容は分からないのでは?
id:taroemon

いつもありがとうございます。


>$url, $title をわざわざ外に出さなくてもいいのでは?

>同上:$titel の後は</a>では?

間違えてました。そのとおりです。


>データの追加やソート、抽出などの作業をしないのでしょうか。

>そうであれば、関数を2つに分けたり、showAllMySQLData() に

>引数にクエリ後のリソースを指定できるようにしておく必要性が無いでしょう。

今回は追加やソートは必要無しとしています。

うまく作れる人は関数を作って最後にメインとしてるので、

それにあこがれて、自分なりにまねしてみたのですが、

こんなに簡単な物だと分ける必要がないのですね。

そこらへんの必要、不必要の見極めは今後の課題にします。


>MySQL に接続する時はエラーを抑制していますが、ノーチェックで大丈夫ですか?

>set_error_handler() で用意している処理は、デフォルトの状態と殆ど同じようなので不要では?

>mysql系の関数内で起こるエラーは、そのエラー内容まで文章で error_handler に渡してくれるのでしょうか?

テスト段階ではエラーをexitで確認していたのですが、

それだとエラーが表示されるのでまずいだろうと他の方に回答していただいたことがあるので、

こちらに質問するに当たって急遽、set_error_handlerに挑戦してみました。

全部exitでテストした後に変更したので、自分ではチェックしてませんが、

これではうまく機能していないませんか?

まだ使い方を把握していないので、これについてはもう少し勉強してみます。


とても参考になりました。

2008/04/29 10:43:58
id:kaijikaiji No.2

kaijikaiji回答回数40ベストアンサー獲得回数02008/04/29 10:10:58

ポイント23pt

1.mysql_escape_string()はSQL文をエスケープするために使うものです。例えば以下のように、$hogeにシングルコーテーションが入るような場合。

$hoge = "aaa'bbb";

$sql = "SELECT * FROM T1 WHERE F1 = '" . mysql_escape_string($hoge) . "'";

2.DBの値をHTML出力するときは、htmlspecialchars()を使うのがよいでしょう。

echo htmlspecialchars($title);

id:taroemon

まだ全然理解できてないので、

セキュリティについてのご指摘は特に切実です。

ご指摘ありがとうございました。

2008/04/29 10:34:22
id:y-kawaz No.3

y-kawaz回答回数1421ベストアンサー獲得回数2262008/04/29 10:47:56

ポイント22pt

・MySQLからSELECTしたデータに対して mysql_escape_string をする必要はありません(してはいけません)

 mysql_escape_string はSQLクエリに変数の値を埋め込む時に使うもので取りだしたデータに対して適用するものではないです。

・$url は urlencode してください。XSS脆弱性の元です。→例えば $url 中に "><script>~</script> が含まれるケースを考えてください。

・$title は htmlspecialchars してください。XSS脆弱性の元です。→例えば $title 中に <script>~</script> という文字列が含まれるケースを考えてください。

id:taroemon

ご回答ありがとうございます。

やっぱり私はセキュリティのことがまだよくわかってないようですね。 

特に自信の無い分野だったのでご指摘いただいて助かりました。

こちらに質問して本当によかったです。

2008/04/29 10:55:26
  • id:pahoo
    回答欄が利用できないので、コメント欄にて失礼します。
    mysql_connect のエラー出力を @ で打ち消すのはマズイのではないかと思います。せっかくエラー処理関数を用意しているのですし。
    また、MySQL リンク ID を取得しているのですから、素直に mysql_query($query, $db) と指定してやればいいと思います。
  • id:tezcello
    ソースを表示するときは、<pre></pre> を使えば <br> を毎行入れたり、ブラウザ上でタブが無視されたりしなくて都合がいいのでは?
  • id:taroemon
    pahooさん
    コメントありがとうございます。

    @は気づきませんでした。

    >また、MySQL リンク ID を取得しているのですから、
    >素直に mysql_query($query, $db) と指定してやればいいと思います。
    これはちょっとすぐに理解できませんでしたが、これからいじって試して理解してみます。
  • id:taroemon
    tezcelloさん
    コメントありがとうございます。

    このタグは知りませんでした。今後活用させていただきます。
    こういうことは本に書かれてないのでとても勉強になりました。
  • id:oisiiotya
    3番の方の回答で
    >$url は urlencode してください。XSS脆弱性の元です。→例えば $url 中に "><script>~</script> が含まれるケースを考えてください。
    とありますが、urlencodeではなくhtmlspecialcharsの間違いでは?
    上げ足を取るようで申しわけないがurlencodeではxssは防げないと思います。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません