-3

安全なデータベースを維持するためのチュートリアルをかなり調べましたが、SQL インジェクションやハッカーからデータベースを保護するために必要なアクションはまだわかりません。

これは、ユーザー入力を一掃するために私が使用してきた機能ですが、これがすべてではないように感じます。他に見落としていることはありますか?

function CleanInput($value) {
    stripslashes($value);
    if(!is_numeric($value)) {
        mysql_real_escape_string($value);
    }
    return $value;
}
4

5 に答える 5

0

作業のバックエンド (データベース、MySQL など) とフロントエンド (php など) の両方でパスワードに MD5 関数を使用します。

非常にシンプルですが、作業を保護するための良いスタートです。

私の教授は、それを私のプロジェクトに含めたことを褒めてくれました。

于 2013-05-03T00:50:09.283 に答える
0

ベストプラクティスは使用することですprepared statements

mysql_queryドキュメントを確認するとわかるように、非推奨であるため、use を使用することも悪い習慣です。

を使用mysql_real_escape_stringすることも推奨されていないため、悪い習慣であり、あなたを救うことはできませんlogical sql injections

PDOorを使用することをお勧めしmysqliます。これらの実装はどちらも準備済みステートメントをサポートしています。

プリペアド ステートメントは、ハッカーがインジェクションを引き起こす可能性のあるコマンドをシステムに挿入することを回避しますが、代わりにデータベースに影響を与えない定数のテンプレートを作成します。パフォーマンスにも優れています。

クライアント側とサーバー側の両方で、すべての入力を検証することも賢明です。

于 2013-05-02T21:27:39.683 に答える
0

まず第一に、セキュアな mySQL の万能薬はありません。もう少し詳しく説明する必要があります。ログインと、ほとんどの (すべてではないにしても) SQL インジェクションのトリックなどを回避する方法に関心がある場合は、mySQL 内でストアド プロシージャを使用してください。PHP がすべてを提供してくれるとは思いません。たとえば、実際の/本番DBに接続する代わりに、ユーザーがストアドプロシージャへの読み取り専用アクセスのみを持つ別のDBに接続すると考えてください(PHPの方が機能が優れています)。そうすれば、誰もあなたのデータをこのDBで見ることはできません!! 彼があなたのデータベース名、ユーザー名、およびパスワードを知っていたとしても、彼はどのテーブルからも SELECT できません。ストアド プロシージャを使用して、ユーザーのユーザー名とパスワードを送信 (もう一度 SELECT) し、新しいデータベース名、ホスト、ユーザー名、およびパスワードを受け取ります。これを使用して、実際のデータを取得するために再度接続します。

パフォーマンスや mySQL のオーバーロードをあまり気にしないのであれば、DB へのあらゆる接続に同じトリックを使用できます。

于 2013-05-02T21:28:33.170 に答える
0
  1. サーバーを安全に保ちます。あなたのサーバー上の誰かが非常に大きなものであることは明らかです。
  2. 絶対に必要な場合にのみ、データベースへのリモート アクセスを許可します。
  3. MySQL の強力なログイン パスワードを使用します。
  4. PHP スクリプトが使用するユーザーを、必要最小限の権限に制限します。たとえば、スクリプトに読み取り権限のみを付与します。
  5. SQL インジェクションを防ぐには、従来の MySQL 関数の代わりに PHP PDO または MySQLi を使用します。
  6. ユーザーを信用しないでください。
于 2013-05-02T21:25:45.437 に答える
-1

悪いスタートではありませんが、本当に役立つ情報へのリンクを次に示します。

http://simon.net.nz/articles/protecting-mysql-sql-injection-attacks-using-php/

最善の解決策は?バインドされたパラメーターを使用します。これらを使用するには、PHP5 に付属する改良された mysqli ライブラリを使用する必要があります。この手法は、最初にプレースホルダーを使用してクエリの「テンプレート」を定義し、次にパラメーターをそれに「バインド」し、mysqli ライブラリが適切なエスケープを処理するという点で若干異なります。

$query = $mysqli->prepare( "UPDATE tablename SET favorite_color = ?, age = ?, description = ? WHERE user = ?" );
// we would have a bind looking like this:
$query->bind_param( 'sibs', 'red', 27, $some_blob, $variable );
$query->execute();
于 2013-05-02T21:26:23.753 に答える