5

共有ホスティングでホストされている Web サイトがあります。PHP 5.2.13 がインストールされています。

SQL インジェクションの脆弱性を知っており、それを防止したいと考えています。

だから私はそれを防ぐためにPDOまたはmysqliを使いたいです。

phpinfo();しかし、ホスティング環境の php セットアップ情報を表示していたときの問題
は、PDO 用の mysql ドライバーがなく、mysqli のサポートがないことがわかりました。

そのため、その古い mysql_* 関数を ( のような関数と一緒にmysql_real_escape_string) 使用しても安全かどうかを知りたかったのです。

SOでこれを見ましたが、あまり役に立ちませんでした。 mysqli と PDO が利用できない場合、準備されたステートメントは可能ですか?

アップデート:

ほとんどのクエリは単純であることを忘れていました。フォームは使用されないため、クエリを作成するためにユーザー入力は使用されません。すべてのクエリは、必要なパラメーターでハードコーディングされ、一度設定すると変更されません。

4

3 に答える 3

4

いいえ。より安全なソリューションがないからといって、安全性の低いソリューションやより脆弱なソリューションに戻る正当な言い訳にはなりません。

共有ホスティング パッケージであっても、任意の PHP 機能を無効にしない別のホスティング プロバイダーを見つける方がはるかに優れています。ああ、PHP 5.3、またはできれば PHP 5.4 を使用するものを入手してください。

于 2012-11-06T08:52:52.230 に答える
1

ユーザーが提供するすべての入力を常に使用することに本当に厳密である場合はmysql_real_escape_string()、準備されたステートメントが保護する SQL インジェクションから安全であるべきだと思います。

あなたはこれでどれほど完璧ですか?バッファ オーバーフローの脆弱性のほとんどは、入力をチェックするのが得意だと思っていたプログラマによって作成されたに違いありません....

于 2012-11-06T08:57:52.027 に答える
0

そのための良い方法は、mysql_ *関数を使用するためのWrapperクラスを実装し、プリペアドステートメントを作成するためのいくつかのメソッドを使用することです。

アイデアは、クエリで強く型付けされたパラメーターを渡す必要があるということです。

たとえば、ここに一般的な考え方のコードがあります。もちろん、もっと作業が必要です。ただし、適切に実装されていれば、SQLインジェクション攻撃を防ぐことができます。

これは一般的であるため、すでにそれを実装しているサードパーティのライブラリを検索することもできます。

<?php

class MyDb
{
  protected $query;

  public function setQuery($query)
  {
    $this->query = $query;
  }

  public function setNumericParameter($name, $value)
  {
    if (is_numeric($value)) // SQL Injection check, is the value really an Int ?
    {
       $this->query = str_replace(':'.$name, $value);
    }
    // else, probably an intent of SQL Injection
  }

  // Implement here the methods for all the types you need, including dates, strings, etc

  public function fetchArray()
  {
     $res = mysql_query($this->query);
     return mysql_fetch_array($res);
  }
}


MyDb $db = new MyDb();
$db->setQuery('SELECT * FROM articles WHERE id = :id');
$db->setNumericParameter('id', 15);

while ($row = $db->fetchArray())
{
// do your homework
}
于 2012-11-06T08:59:49.220 に答える