ネットワークセキュリティー
 Computer >> コンピューター >  >> ネットワーキング >> ネットワークセキュリティー

PHP SQL インジェクション:知っておくべきことすべて

インジェクション攻撃のクラスでは、PHP SQL インジェクション 攻撃が非常に顕著に出ています。ほとんどの Web サイトは脆弱です。調査によると、攻撃の 50% 以上が SQL インジェクションを使用して Web 上で行われました。この記事では、SQL インジェクションがどのように実行されるか、および PHP アプリケーションでこれを防ぐ方法について説明します。

SQL インジェクション (SQLi) とは?

まず、SQL インジェクションについて理解しましょう。 SQL インジェクション (SQLi) これは、ハッカーが実行された SQL コマンドを改ざんして、バックエンドで実行されている SQL ステートメントを変更するアプローチです。このような形式のインジェクションは、フォームの入力フィールドを介して実行され、データベースにひどい余波を引き起こします。最終的には、データベースから機密性の高い情報が漏洩することにつながります。ハッカーは、SQL コマンドを挿入してデータベースを制御できるようになると、データベースにデータを挿入、更新、さらには削除する権利を取得します。

コードが安全な方法で書かれていない場合、SQL インジェクション攻撃が発生します。安全なコーディングで書かれているように見えますが、それでも SQLi に取って代わられるものは次のとおりです。

  • 空白文字の不適切なフィルタリングとタイプ処理
  • サニタイズされていない、不適切にエンコードされたデータをデータベースに渡す
  • コードとデータの混合
  • 文字列を区切るための引用符の使用

つまり、ユーザー入力が適切に検証されない場合、ユーザー データがデータベースによって悪意を持って解釈されることにつながります。ユーザー入力がフロントエンドから直接取得され、クエリに挿入される場合も、妥協につながります。

SQLi につながるもう 1 つの問題は、エラーがユーザーに表示されることです。これは、悪意のあるユーザーがデータベースの種類とバージョンに関する詳細を取得するために悪用し、SQL インジェクション攻撃を引き起こすエクスプロイトを展開する可能性があります。

PHP SQL インジェクションとは

安全でないコードの例

次の脆弱な PHP コードを使用して、PHP SQL インジェクション攻撃の概念を理解しましょう:

<?php

$username = $_POST[‘uname'];

$pass = $_POST[‘password'];

$sql = "SELECT * FROM user_table WHERE username='".$username."' AND userpwd='".$pass"';";

?>

上記のコードは、検証なしでユーザー入力を直接受け入れ、データベースに対して実行される SQL クエリに直接挿入します。ハッカーは、結果を true にする論理クエリを挿入することもできます。つまり、変数 $password が ” または ‘1’=’1’ として値を取得した場合、値は常に true である 1=1 になります。これにより最終的にログインが成功し、深刻なセキュリティ侵害につながります.

また、エラーがユーザーに表示される別のシナリオを考えてみましょう

<?php

elseif($mysqli->error)

{

print($mysqli->error);

}

?>

このシナリオでは、エラー ログをユーザー画面に出力する代わりに、エラー ログを記録し、後で Web サイトが にさらされた回数を確認するために使用できるデータベースを保持することをお勧めします。 SQLi .

セキュア コードの例

PHP SQL インジェクションを回避するための安全なコーディングの例 次の方法で、そのような論理クエリのユーザー名とパスワードを検証できます:

<?php

Function checkUserInput($str)

{

return

str_replace(array("‘",""", "'", ‘"‘),array("‘","&quot;"'","&quot;",$str));

}

$username = checkUserInput($_POST[‘uname']);

$pass = checkUserInput($_POST[‘password']);

?>

このようにして、ユーザー入力を SQL クエリに追加する前に検証できます。 PHP SQL インジェクションを防ぐもう 1 つの方法は、準備済みステートメント (PHP データ オブジェクト (PDO)) を使用することです。これは、SQL ステートメントを繰り返し実行できる効率的な方法です。 PDO は、パラメーター化されたクエリを使いやすくするメソッドを提供します。また、コードの可読性と移植性を向上させ、MySQL データベースだけでなく他のタイプのデータベースでも機能します。 PDO は、どの部分をユーザー入力として扱い、残りの部分をデータベース コマンドとして扱うかを定義します。

PDO for MySQL データベースのコード スニペットの例:

//DB credentials

define(‘DB_HOST','localhost');

define(‘DB_USER','John_Reaper');

define(‘DB_PASS','[email protected]@$$w0rd$');

define(‘DB_NAME','users');

if(isset($_GET[‘id']))

{

$id = $_GET[‘id'];

if(is_numeric($id) == true)

{

try

{

$dbh = new PDO(‘DBHOST;DB_NAME','DB_USER','DB_PASS');

$dbh->setAttribute(PDO::AFTER_ERRMODE, PDO::ERRMODE_EXCEPTION);

$q = "SELECT username FROM users WHERE id = :id";

$sth = $dbh->prepare($q);

$sth->bindParam(‘:id',$id);

$sth->execute();

$sth->setFetchMode(PDO::FETCH_ASSOC);

$res = $sth->fetchColumn();

print(htmlentities($res));

$dbh = null;

}

catch(PDOException $e)

{

error_log(‘PDOException - ‘.$e->getMessage(),0);

http_response_code(500);

die(‘Connection to database unsuccessful');

}

}

else

{

http_response_code(400);

die(‘Error processing malformed request');

}

}

PHP SQL インジェクションを防ぐ方法

したがって、次のベスト プラクティスを実装することで、Web サイトを SQL インジェクションから保護できます。

<オール>
  • JavaScript を使用してフロントエンドで、または PHP を使用してバックエンドでユーザー入力を検証する
  • ユーザーにエラーを表示しない。代わりに、エラーをファイルに記録し、攻撃者がアクセスできないようにします。また、ユーザーに表示されるエラー メッセージは非常に一般的で、データベースに関する情報を明らかにしないものでなければなりません。
  • ユーザー入力として処理する必要がある SQL クエリの部分を指定するパラメータ化されたクエリを使用する。
  • 未使用のストアド プロシージャは悪用されやすく、SQL インジェクションを防止できるため、それらを削除します。
  • 攻撃者が認証をバイパスした場合に侵害を回避するために、適切なユーザーに適切な権限を付与する
  • PHP SQL インジェクションからの究極の保護

    Astra のようなファイアウォールを使用すると、SQLi に対する耐性を高めることができます。 SQLi に加えて、Astra Security Suite は 100 以上の攻撃から Web サイトを保護します。そのうちのいくつかは悪意のあるボット、XSS、CSRF などです。

    PHP SQL インジェクション:知っておくべきことすべて

    当社のマルウェア スキャナーは、Web サイトを 10 分以内にスキャンすることが知られています。また、後続のスキャンにかかる時間はさらに短縮されます (<1 分)。当社のセキュリティ監査およびペンテスティング サービスでは、Astra のエンジニアがコードの各行を手動でスキャンして、Web サイトの脆弱性を見つけて修復し、セキュリティを侵入不可能にします。

    PHP SQL インジェクション:知っておくべきことすべて

    今すぐ Astra のデモをお試しください!


    1. BIM について知っておくべきことすべて

      デジタル時代はさまざまな分野でさまざまな変化をもたらしましたが、建設業界も他の業界と何ら変わりはありません。路地を下ると、建物の設計と建設に使用されるツールは鉛筆と紙から始まりました。その後、労働集約的な製図を効率的な電子文書に変換した CAD が登場しました。その後すぐに CAD は 3D になり、現在は BIM、つまりビルディング インフォメーション モデリングがすべてです。 建設業界を変革する主要なテクノロジー トレンドの 1 つは、一般に「BIM」として知られるビルディング インフォメーション モデリングです。これは、施設の機能的および物理的特徴のデジタル表現です。ライフサイクル全体

    2. ビーコン テクノロジーについて知っておくべきことすべて

      2016 年、私たちのニュース フィードを支配し、あらゆる年齢層の人々に参加を促したストーリーは、オフラインとオンラインの世界が協力して私たちの街に侵入したポケモン GO でした。ただし、このゲームの本当の功績は、現実世界とデジタル世界を結びつけ、リアルタイムの相互作用を支援したビーコン テクノロジにあります。 ビーコン技術とは これは、壁またはカウンターに取り付けられ、Bluetooth テクノロジを使用して近くのモバイル デバイスを検出し、メッセージをスマートフォンまたはタブレットに直接送信するハードウェアです。メッセージは、主に広告およびその他の関連コンテンツの形式です。彼らは、イベン