ホームページ  >  記事  >  バックエンド開発  >  PHP 言語開発における SQL キーワード インジェクション攻撃を回避するにはどうすればよいですか?

PHP 言語開発における SQL キーワード インジェクション攻撃を回避するにはどうすればよいですか?

WBOY
WBOYオリジナル
2023-06-10 17:41:511276ブラウズ

インターネットの発展に伴い、SQL インジェクション攻撃がネットワーク セキュリティにおける深刻な問題となっています。 SQL インジェクション攻撃とは、攻撃者が Web アプリケーションの脆弱性を利用して悪意のある SQL ステートメントをサーバーに送信し、不正アクセスを実行して機密データを盗む攻撃方法を指します。 Web 開発で最も広く使用されているプログラミング言語の 1 つである PHP 言語は、SQL インジェクション攻撃のリスクにも直面しています。この記事では、PHP言語開発におけるSQLキーワードインジェクション攻撃を回避する方法を紹介します。

1. SQL インジェクション攻撃を理解する

SQL インジェクション攻撃を防ぐ前に、まず SQL インジェクション攻撃の基本概念と原則を理解する必要があります。 SQL インジェクション攻撃は主に Web アプリケーションを使用してユーザー入力データを誤ってフィルタリングし、ユーザー入力を SQL ステートメントの一部としてバックエンド データベースに直接渡し、攻撃者が悪意のある SQL ステートメントを通じてデータベースを攻撃し、制御できるようにします。たとえば、次のコード スニペットは SQL インジェクション攻撃の危険にさらされている可能性があります:

<?php
//连接数据库
$con=mysqli_connect("localhost","username","password","my_db");

//获取用户提交的用户名和密码
$username=$_POST['username'];
$password=$_POST['password'];

//构造SQL语句
$sql="SELECT * FROM users WHERE username='".$username."' AND password='".$password."'";

//执行SQL语句
$result=mysqli_query($con,$sql);

// 输出查询结果
while($row=mysqli_fetch_array($result,MYSQLI_ASSOC)){
    echo $row['username']. " " . $row['password'];
}

//关闭数据库连接
mysqli_close($con);
?>

上記のコードでは、ユーザーが送信したデータは SQL ステートメントの一部として SQL データベースに直接渡される可能性があります。攻撃者は、何らかの手段を使用して、悪意のある SQL ステートメントをデータベースに渡して、データベースを攻撃し、制御することができます。たとえば、ユーザーが送信したパスワードが「123' OR 1=1--」の場合、データベースは次の SQL ステートメントを実行します。

SELECT * FROM users WHERE username='user' AND password='123' OR 1=1--'

この SQL ステートメントは、データベース内のすべてのユーザーの情報をクエリします。データベースでは、「 1=1」が常に true になるためです。

2. SQL インジェクション攻撃を回避する方法

SQL インジェクション攻撃を回避するには、Web アプリケーションを攻撃から保護するための対策を講じる必要があります。一般的な方法をいくつか示します。

  1. パラメータ化されたクエリを使用する

パラメータ化されたクエリは、SQL インジェクション攻撃を回避する効果的な方法です。このメソッドは、事前定義された SQL ステートメントとパラメーターを使用し、パラメーター値を入力としてデータベースに渡して実行します。この方法により、ユーザーが入力したデータが SQL ステートメントに直接結合されるのを防ぐことができるため、Web アプリケーションを SQL インジェクション攻撃から保護できます。たとえば、次のコードではパラメータ化されたクエリを使用しています。

<?php
//连接数据库
$con=mysqli_connect("localhost","username","password","my_db");

//获取用户提交的用户名和密码
$username=$_POST['username'];
$password=$_POST['password'];

//构造SQL语句
$sql="SELECT * FROM users WHERE username=? AND password=?";

//创建预处理语句
$stmt=mysqli_prepare($con,$sql);

//绑定参数值
mysqli_stmt_bind_param($stmt,"ss",$username,$password);

//执行SQL语句
mysqli_stmt_execute($stmt);

// 迭代查询结果
$result=mysqli_stmt_get_result($stmt);
while($row=mysqli_fetch_array($result,MYSQLI_ASSOC)){
    echo $row['username']. " " . $row['password'];
}

//关闭数据库连接
mysqli_close($con);
?>
  1. 入力データのフィルタリング

ユーザー入力データを処理する前に、データをフィルタリングして、そのセキュリティを確保できます。たとえば、PHP の組み込み関数strip_tags()、addslashes()などを使用して、ユーザー入力データをフィルタリングできます。これらの関数は、ユーザー入力内の HTML タグをフィルターで除外したり、特殊文字をエスケープしたりできるため、SQL インジェクション攻撃のリスクを軽減できます。例:

<?php
//连接数据库
$con=mysqli_connect("localhost","username","password","my_db");

//获取用户提交的用户名和密码
$username=$_POST['username'];
$password=$_POST['password'];

//过滤用户输入数据
$username=mysqli_real_escape_string($con,strip_tags($username));
$password=mysqli_real_escape_string($con,strip_tags($password));

//构造SQL语句
$sql="SELECT * FROM users WHERE username='".$username."' AND password='".$password."'";

//执行SQL语句
$result=mysqli_query($con,$sql);

// 输出查询结果
while($row=mysqli_fetch_array($result,MYSQLI_ASSOC)){
    echo $row['username']. " " . $row['password'];
}

//关闭数据库连接
mysqli_close($con);
?>

上記のコードでは、関数 mysqli_real_escape_string() およびstrip_tags() を使用してユーザー入力データをフィルタリングし、そのセキュリティを確保します。

3. 概要

SQL インジェクション攻撃は、Web アプリケーションにおける一般的なセキュリティ問題であり、データベースやユーザー データに計り知れない損失を引き起こす可能性があります。 SQL インジェクション攻撃を回避するには、入力データの正確性を確保し、ユーザー入力データをフィルタリングし、パラメータ化されたクエリやその他の方法を使用して Web アプリケーションのセキュリティを強化する必要があります。開発者として、私たちは Web アプリケーションのセキュリティを確保するために、最新のセキュリティ テクノロジを常に学び、理解する必要があります。

以上がPHP 言語開発における SQL キーワード インジェクション攻撃を回避するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。