PHP で SQL インジェクションを防ぐにはどうすればよいですか? , php_PHP チュートリアルに SQL を挿入する方法
PHP で SQL インジェクションを防ぐにはどうすればよいですか? 、SQL を php に挿入する方法
問題の説明:
ユーザーが入力したデータが処理されずに SQL クエリ ステートメントに挿入された場合、次の例に示すように、アプリケーションは SQL インジェクション攻撃を受ける可能性があります。
$unsafe_variable = $_POST [ 'user_input' ];
mysql_query( "INSERT INTO `table` (`column`) VALUES ('" . $unsafe_variable . "')" );
|
value'); DROP TABLE table;--
|
INSERT INTO ` table ` (` column `) VALUES ( 'value' ); DROP TABLE table ; --')
|
ベストアンサー(テオさんから):
準備されたステートメントとパラメータ化されたクエリを使用します。準備されたステートメントとパラメーターはそれぞれ解析のためにデータベース サーバーに送信され、パラメーターは通常の文字として扱われます。このアプローチにより、攻撃者による悪意のある SQL の挿入が防止されます。 このメソッドを実装するには 2 つのオプションがあります:
1. PDOを使用します:
$stmt = $pdo ->prepare( 'SELECT * FROM employees WHERE name = :name' );
$stmt ->execute( array ( 'name' => $name ));
foreach ( $stmt as $row ) {
// do something with $row
}
|
2. mysqliを使用します:
$stmt = $dbConnection->prepare( 'SELECT * FROM employees WHERE name = ?' );
$stmt->bind_param( 's' , $name);
$stmt->execute();
$result = $stmt->get_result();
while ($row = $result->fetch_assoc()) {
// do something with $row
}
|
1 2 3 4 |
$dbConnection = new PDO( 'mysql:dbname=dbtest;host=127.0.0.1;charset=utf8' , 'user' , 'pass' );
$dbConnection ->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
$dbConnection ->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
|
上記の例では、エラー報告モード(ATTR_ERRMODE)は必要ありませんが、追加することをお勧めします。このようにして、致命的なエラー (Fatal Error) が発生した場合、スクリプトの実行は停止されませんが、プログラマは PDOException をキャッチしてエラーを適切に処理できるようになります。 ただし、最初の setAttribute() 呼び出しが必要です。これにより、PDO によるプリペアド ステートメントのシミュレーションが無効になり、実際のプリペアド ステートメントが使用されます。つまり、MySQL がプリペアド ステートメントを実行します。これにより、ステートメントとパラメータが MySQL に送信される前に PHP によって処理されていないことが保証され、攻撃者による悪意のある SQL の挿入が防止されます。理由を理解するには、このブログ記事「PDO の抗注射原理の分析と PDO 使用時の注意事項」を参照してください。 PHP の古いバージョン (5.3.6 未満) では、PDO のコンストラクターの DSN に charset を設定できないことに注意してください。「charset パラメータをサイレントに無視する」を参照してください。
分析
前処理と解析のために SQL ステートメントをデータベース サーバーに送信するとどうなりますか?プレースホルダ (上記の例のように ? または :name) を指定して、データベース エンジンにフィルタリングする場所を伝えます。 execute を呼び出すと、準備されたステートメントは指定したパラメーター値と結合されます。 重要な点はここです。パラメータ値は SQL 文字列ではなく、解析された SQL ステートメントと結合されます。 SQL インジェクションは、SQL ステートメントの作成時に悪意のある文字列を含むスクリプトによってトリガーされます。したがって、SQL ステートメントとパラメーターを分離することで、SQL インジェクションのリスクを回避できます。送信するパラメータ値は通常の文字列として扱われ、データベース サーバーによって解析されません。上記の例に戻ると、$name 変数の値が 'Sarah'; DELETE FROM 従業員の場合、実際のクエリは、name フィールドの値が 'Sarah' である従業員内のレコードを検索することになります。 プリペアド ステートメントを使用するもう 1 つの利点は、同じデータベース接続セッションで同じステートメントを何度も実行した場合、解析されるのは 1 回だけになるため、実行速度が少し向上することです。 挿入方法を知りたい場合は、次の例を参照してください (PDO を使用):
1 2 3 |
$preparedStatement = $db->prepare( 'INSERT INTO table (column) VALUES (:column)' );
$preparedStatement->execute(array( 'column' => $unsafeValue));
|
元リンク: StackOverflow 翻訳: Bole Online - rokety
「いいね!」の多かった質問と回答を翻訳しました。質問: ユーザー入力を SQL ステートメントに直接挿入できる場合、アプリケーションは SQL インジェクション攻撃に対して脆弱になります。例: $unsafe_variable = $_POST['user_input']; INSERT INTO table (column) VALUES ( '" . $unsafe_variable . "')"); ユーザーは次のような値を入力できます: value'); DROP TABLE table;-- 、SQL ステートメントは次のようになります: INSERT INTO table (column) VALUES('value ') ; DROP TABLE table;-') (翻訳者注: この結果、テーブルが削除されます) この状況を防ぐにはどうすればよいでしょうか?回答: プリペアド ステートメントとパラメータ化されたクエリを使用します。これらの SQL ステートメントはデータベース サーバーに送信され、そのパラメーターはすべて個別に解析されます。この方法を使用すると、攻撃者が悪意のある SQL を挿入することは不可能になります。これを実現するには、主に 2 つの方法があります。 1. PDO を使用します。 $stmt = $pdo->prepare('SELECT * FROM従業員 WHERE name = :name'); $stmt->execute(array(':name') => $name)); foreach ($stmt as $row) { // $row を使用します: $stmt = $dbConnection->prepare('SELECT * FROM 従業員 WHERE name = ?' ); $stmt->bind_param('s', $name); $stmt->get_result(); $row = $result->fetch_assoc( )) { // $row で何かを行う } PDO PDO を使用して MySQL データベースにアクセスする場合、デフォルトでは実際のプリペアド ステートメントは使用されないことに注意してください。この問題を解決するには、シミュレートされた準備済みステートメントを無効にする必要があります。以下は、PDO を使用して接続を作成する例です。 $dbConnection = new PDO('mysql:dbname=dbtest;host=127.0.0.1;charset=utf8', 'user', 'pass'); ;setAttribute( PDO::ATTR_EMULATE_PREPARES, false); $dbConnection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 上の例では、エラー報告モードは必須ではありませんが、使用することをお勧めします。まだ追加します。このようにして、何か問題が発生した場合でもスクリプトは致命的なエラーで終了せず、PDO 例外をスローするため、開発者はエラーをキャッチする機会が得られます。ただし、最初の行の setAttribute() は必須であり、これにより PDO はシミュレートされた準備済みを無効にします... テキストの残りの部分>>
より効果的な方法は、公開設定ファイルに置くことです。 360safe.php
エラー番号: [$errno],error on $errfile の $errline 行
"; die();}set_error_handler("customError",E_ERROR);$getfilter="'|(and|or)\\b.+?(>|< |=|in|like)|\\/\\*.+?\\*\\/|<\\s*script\\b|\\bEXEC\\b|UNION.+?SELECT|UPDATE。 +?SET|INSERT\\s+INTO.+?VALUES|(SELECT|DELETE).+?FROM|(CREATE|ALTER|DROP|TRUNCATE)\\s+(TABLE|DATABASE)";$postfilter="\\ b(および|または)\\b.{1,6}?(=|>||<|\\bin\\b|\\blike\\b)|\\/\\*.+?\\*\\/|>

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック











PHP SQL インジェクションの脆弱性の検出と修復の概要: SQL インジェクションとは、攻撃者が Web アプリケーションを使用して SQL コードを入力に悪意を持って挿入する攻撃方法を指します。 PHP は、Web 開発で広く使用されているスクリプト言語として、動的な Web サイトやアプリケーションの開発に広く使用されています。ただし、PHP の柔軟性と使いやすさにより、開発者はセキュリティを無視することが多く、その結果、SQL インジェクションの脆弱性が存在します。この記事では、PHP の SQL インジェクションの脆弱性を検出して修正する方法を紹介し、関連するコード例を示します。チェック

Nginx は高速、高性能、スケーラブルな Web サーバーであり、そのセキュリティは Web アプリケーション開発において無視できない問題です。特に SQL インジェクション攻撃は、Web アプリケーションに多大な損害を与える可能性があります。この記事では、Nginx を使用して SQL インジェクション攻撃を防ぎ、Web アプリケーションのセキュリティを保護する方法について説明します。 SQL インジェクション攻撃とは何ですか? SQLインジェクション攻撃とは、Webアプリケーションの脆弱性を悪用する攻撃手法です。攻撃者は悪意のあるコードを Web アプリケーションに挿入する可能性があります

Laravel 開発ノート: SQL インジェクションを防ぐ方法とテクニック インターネットの発展とコンピューター技術の継続的な進歩に伴い、Web アプリケーションの開発はますます一般的になりました。開発プロセスにおいて、セキュリティは常に開発者にとって無視できない重要な問題でした。中でも SQL インジェクション攻撃の防止は、開発プロセスにおいて特に注意が必要なセキュリティ課題の 1 つです。この記事では、開発者が SQL インジェクションを効果的に防止できるように、Laravel 開発で一般的に使用されるいくつかの方法とテクニックを紹介します。パラメータバインディングの使用 パラメータバインディングはLarです

ネットワーク セキュリティの分野では、SQL インジェクション攻撃が一般的な攻撃方法です。悪意のあるユーザーが送信した悪意のあるコードを悪用して、アプリケーションの動作を変更し、安全でない操作を実行します。一般的な SQL インジェクション攻撃には、クエリ操作、挿入操作、削除操作が含まれます。その中で、クエリ操作が最もよく攻撃されており、SQL インジェクション攻撃を防ぐ一般的な方法は PHP を使用することです。 PHP は、Web アプリケーションで広く使用されているサーバー側スクリプト言語です。 PHP は MySQL などに関連付けることができます。

0x01 はじめに 概要 編集者は、MySQL で別の Double データ オーバーフローを発見しました。 MySQL で関数を取得する場合、エディターは数学関数に関心があり、値を保存するためのいくつかのデータ型も含まれている必要があります。そこでエディターは、どの関数がオーバーフロー エラーを引き起こすかを確認するテストを実行しました。その後、編集者は、709 より大きい値が渡されると、関数 exp() がオーバーフロー エラーを引き起こすことを発見しました。 mysql>selectexp(709);+----------------------+|exp(709)|+---------- - -----------+|8.218407461554972

PHP プログラミングのヒント: SQL インジェクション攻撃を防ぐ方法 データベース操作を実行する場合、セキュリティは非常に重要です。 SQL インジェクション攻撃は、アプリケーションによるユーザー入力の不適切な処理を悪用し、悪意のある SQL コードが挿入されて実行される一般的なネットワーク攻撃です。 SQL インジェクション攻撃からアプリケーションを保護するには、いくつかの予防策を講じる必要があります。パラメータ化されたクエリの使用 パラメータ化されたクエリは、SQL インジェクション攻撃を防ぐための最も基本的かつ効果的な方法です。ユーザーが入力した値を SQL クエリと比較することで機能します

PHP フォーム フィルタリング: SQL インジェクションの防止とフィルタリング はじめに: インターネットの急速な発展に伴い、Web アプリケーションの開発はますます一般的になりました。 Web 開発では、フォームはユーザー対話の最も一般的な方法の 1 つです。ただし、フォーム送信データの処理にはセキュリティ上のリスクがあります。その中でも、最も一般的なリスクの 1 つは SQL インジェクション攻撃です。 SQL インジェクション攻撃は、Web アプリケーションを使用してユーザー入力データを不適切に処理し、攻撃者が不正なデータベース クエリを実行できるようにする攻撃手法です。攻撃者は、

システム セキュリティの向上: SQL インジェクション攻撃を防ぐための MyBatis のヒント 情報技術の継続的な発展に伴い、データベース アプリケーションは現代のソフトウェア システムに不可欠な部分となっています。ただし、次に説明するのはデータベースのセキュリティ問題で、最も一般的かつ深刻なものはおそらく SQL インジェクション攻撃です。 SQL インジェクション攻撃とは、攻撃者が悪意のある SQL コードを入力フィールドに挿入して、データベース内の情報を不正に取得したり、データベースの整合性を破壊したりすることを指します。 SQL から保護するには
