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

SQLインジェクション(SQLi)とは何ですか?

テクノロジーの進歩に伴い、セキュリティがすべてのビジネスおよびソーシャルメディアプラットフォームの基本的かつ重要な機能であることは誰もが知っています。ほとんどすべてのビジネスは、ビジネスデータを中継します。このデータはデータベースに保存されます。したがって、SQLは、ハッカーからデータを保存するための手法を提供します。さまざまな手法を使用して、Webサイトのデータがハッカーから侵入されるのを防ぐことができます。同様に、SQLインジェクションはハッキング手法です。ハッカーはデータにアクセスできます。また、データベースにコードを挿入することでサーバーをクラッシュさせる可能性があります。この方法は、傾斜したWebパッケージの不適切なコーディングのために実行可能になります。一部の新しい開発者はデータフィールドの空をチェックせず、空のフィールドがSQLインジェクションの原因です。

パラメータ化されたクエリによるSQLインジェクションの防止

このアプローチは、消費者提供の料金を挿入する必要があるたびに、クエリで疑問符のプレースホルダー(?)を使用して準備されたステートメントを使用することで構成されます。これは非常に効果的であり、JDBCの原動力の実装内にワームがない限り、エクスプロイトの影響を受けません。

この手法の簡単なサンプルコードは次のとおりです。

パブリックリストsafeFindAccountsByCustomerId(String customerId)

例外をスローします{

文字列sql = ‘select‘ + ‘customer_id、acc_number、branch_id、balance from Accounts‘ + ‘where customer_id =? ';

接続c = dataSource.getConnection();

PreparedStatement p = c.prepareStatement(sql);

p.setString(1、customerId);

ResultSet rs = p.executeQuery(sql));

//省略–行を処理してアカウントリストを返す

}

上記のコードでは、接続の例で使用可能なprepareStatement()メソッドを使用して、PreparedStatementを取得します。これにより、質問を実行する前に、質問に個人が提供した値を適切に挿入できます。

PDOで準備されたクエリの使用

PDOと準備されたクエリを使用します。

($ connはPDOオブジェクトです)

$ stmt = $ conn-> prepare( ‘INSERT INTO tbl VALUES(:Id、:name)‘);

$ stmt-> bindValue( ‘:id‘、$ id);

$ stmt-> bindValue( ‘:name‘、$ name);

$ stmt-> execute();

プリペアドステートメントはSQLインジェクションに対して回復力があります。これは、後で独自のプロトコルを使用して送信されるファクトパラメータ値を、正常にエスケープする必要がないためです。元の宣言テンプレートが外部のEnterから派生していない場合、SQLインジェクションは発生しません。

Rubyフレームワークのオブジェクトリレーショナルマッピング(ORM)による防止

多くの開発チームは、オブジェクトリレーショナルマッピング(ORM)フレームワークを使用して、SQL結果ユニットのコードオブジェクトへの変換をさらにシームレスにすることを選択しています。 ORMツールは、開発者がコードのSQLステートメントを作成することはめったにないことを示唆することがよくあります。これらのツールは、内部でパラメーター化されたステートメントを喜んで使用します。

def current_user(email)

#「User」オブジェクトは、メソッドを検索する必要があるActiveRecordオブジェクトです

#Railsによって自動的に生成されます。

User.find_by_email(メール)

終わり

上記のコードは、SQLインジェクションやハッカーの攻撃からあなたを救うでしょう。

暗号化されたデータベース

SQLデータベースが挿入されないようにするもう1つの簡単な方法は、暗号化されたデータベースまたはデータです。したがって、通常、データベースのクレデンシャルを別のレポートに保存し、安全に暗号化して、攻撃者が十分な利益を得られないようにします。