1

基本的なページを作成しているとしましょう。このページのテキストは、GET 変数を介して渡される内容によって異なります。

ページの上部に次のようなヘッダーがあります。

<?php 
mysql_connect("stuff", "stuff", "stuff");
mysql_select_db("dbname");
mysql_query("SELECT * FROM table WHERE ID = '{$_GET['url']}'");

//Now we have connected to the SQL database.
?>

そこでコーディングを続けたと仮定すると、ヘッダー テキストは URL に渡された内容によって異なります (ただし、これは関係ありません。質問したいのは次の部分です)。

ここで、ページのさらに下に PHP コードがいくつかありますが、その間にも HTML コードがあるとします。この 2 番目の PHP スニペットでデータベースに再度アクセスしたい場合、データベースに再接続する必要がありますか? または、まったく別の<?php ?>場所であっても、接続セッションが開いたままになるようにする方法はありますか? <?phpタグを終了したときに SQL 接続が切断されないようにするにはどうすればよいですか?

4

2 に答える 2

1

一度にいくつかの問題に対処しましょう:-)

  1. 明示的に自分で行わない限り、接続は切断されません。もちろん、スクリプトが終了すると削除されます。それでも、オーバーヘッドを回避するのに役立つ持続的接続接続プールの手法があります。

  2. 機能のmysql_*ファミリーは廃止され、まもなく完全に機能しなくなる可能性があります。より強力で安全なPDO関数などに移行することで、はるかに良い結果が得られます。

  3. チェック/検証せずにSQLクエリ(または他のサーバーコード)内にパラメーターを直接配置する_GETと、そのパラメーターに厄介な驚きが含まれる危険性にさらされます。XKCD以外の典型的な例は、$_GET['password']フィールドに対応することを確認する場合ですpassword。あなたがそれを次のようにコーディングするだけなら

    WHERE ... password ='$_GET[パスワード]'

そして誰かがそのフィールドに値を置きます

' OR ''=='

SQLサーバーは

WHERE ... password = '' OR ''==''

また、''実際に''と等しいため、そのクエリはtrueを返し、ユーザーはパスワードを知らなくてもログインします。このような「SQLインジェクション」は、可能であれば、攻撃者がサイトの管理者として認識されるように調整することができます。そのため、クライアント側のパラメータを「そのまま」使用したくないのです。PDOのプリペアドステートメントもそこで役立ちます。

于 2013-01-27T22:58:34.780 に答える
1

送信元: http://php.net/manual/en/function.mysql-connect.php

注: サーバーへのリンクは、明示的に mysql_close() を呼び出して以前に閉じていない限り、スクリプトの実行が終了するとすぐに閉じられます。

編集

申し訳ありませんが、間違った言語:)

于 2013-01-27T22:46:25.240 に答える