2

現時点では、次のようなデータベースラッパー関数がいくつかあります。

function db_escape($str) {
    return mysql_real_escape_string($str);
}

function db_query($sql) {
    global $LINKID;
    return mysql_query ($sql, $LINKID);
}

function db_fetch_array($result) {
    return mysql_fetch_array ($result, MYSQL_ASSOC);
}

私のコードでは、次のようなことができます。

$result = db_query('SELECT userid, first_name, last_name FROM user 
                    WHERE email = "' . db_escape($email) . '"');

if ($result) {
    $user = db_fetch_array($result);
}

この背後にあるアイデアの 1 つは、mysql から mysqli に切り替えると、ラッパー関数を更新するのに数分しかかからず、何mysql_real_escape_string()mysql_query()ものmysql_fetch_array().

これに関する唯一の問題は、上記が標準の手続き型 mysqli 関数に十分に簡単に変換できるが、準備済みステートメントには変換できないことです。

これは問題ですか?すべてのチュートリアルでは、準備されたステートメントはセキュリティとパフォーマンスにとって重要であると述べているようですが、現時点では:

  1. 私のプロジェクトにはパフォーマンスの問題はありません。
  2. ユーザー入力を予想される型 (string、integer、float など) にキャストすること、およびクエリ内の任意の場所で使用されるユーザー入力を手動でエスケープすることについて、私は非常に神経質です。

これを念頭に置いて、過去または将来のプロジェクトのいずれかで、準備済みステートメントに切り替えることが本当に必要ですか?

4

2 に答える 2

2

長期的な利益を考える必要があると思います。たとえば、将来、あなたがそのプロジェクトの開発者ではなくなった場合、準備されていないステートメントを使用する習慣は次の開発者に引き継がれ、次のようになります。

ユーザー入力を予想される型 (string、integer、float など) にキャストすること、およびクエリ内の任意の場所で使用されるユーザー入力を手動でエスケープすることについて、私は非常に神経質です。

もう真実ではないかもしれません。そして、あなたが非常に慎重であると言うとしても、ある時点であなたは間違いを犯したり忘れたりするでしょう (そうです、人々はそうしました! そしてそれが物事が壊れる理由です)、それは問題になるでしょう.

以下の場合を例に考えてみましょう。安全だと思いますか?

$id = $_POST['id'];
$result = db_query('SELECT userid, first_name, last_name FROM user 
                WHERE userid = ' . db_escape($id) );
于 2013-09-12T01:31:20.640 に答える
0

Perpetuum Mobileを思いついた Smart 氏がまた一人増えたのを見て、少し苛立ちを感じますが、彼のアイデアはある程度理不尽とは言えません。しかし、残念なことに、それらはすべて間違った仮定に基づいています。

どれが

  • SQL フォーマット ルールは、エスケープとキャストに限定されます
  • SQL インジェクションからの保護が必要な場合
  • このような保護をユーザー入力に適用する必要があります
  • すべての PHP アプリケーションは小さく、観察可能です
  • 他の回答で述べたように、すべてのコードを頭に入れている開発者は 1 人だけで、プロジェクトに取り組んでいます。

しかし、繰り返しになりますが、これらの仮定はすべて間違っています。

それらを再考するとすぐに、パラメーター化されたクエリだけが保険料を請求できるという結論に達するでしょう。mysqli で使用される特定の実装ではなく、パラメーターを使用する一般的な考え方について話していることに注意してください。古いmysql extでも問題なく実装できます。

もう 1 つ考慮すべきことは、コードの美しさとサイズです。あなたが今持っているものを見てください

$result = db_query('SELECT userid, first_name, last_name FROM user 
                    WHERE email = "' . db_escape($email) . '"');
if ($result) {
    $user = db_fetch_array($result);
}

パラメータを使用して何ができるか

$sql = 'SELECT userid, first_name, last_name FROM user WHERE email = ?';
$user = db_fetch_array($sql, $email);
于 2013-09-12T06:28:16.753 に答える