ホームページ  >  記事  >  バックエンド開発  >  PHPインジェクション攻撃防御事例分析、PHPインジェクション事例分析_PHPチュートリアル

PHPインジェクション攻撃防御事例分析、PHPインジェクション事例分析_PHPチュートリアル

WBOY
WBOYオリジナル
2016-07-13 10:15:24762ブラウズ

PHPインジェクション攻撃防御事例分析、PHPインジェクション事例分析

この記事では、例の形でインジェクション攻撃を防ぐ PHP の方法の詳細な分析を提供します。参考のためにみんなで共有してください。具体的な分析は次のとおりです:

PHP はlashes() 関数を追加します -- 単一のアポストロフィとスラッシュエスケープ

PHP文字列関数

定義と使用法

addslashes() 関数は、指定された定義済み文字の前にバックスラッシュを追加します。
これらの事前定義された文字は次のとおりです:
一重引用符 (')
二重引用符 (")
バックスラッシュ ()
ヌル
文法:

スラッシュ(文字列)を追加します

パラメータ 説明
文字列 必須。チェックする文字列を指定します。

ヒントとメモ

ヒント: この関数は、データベースに保存されている文字列やデータベース クエリ ステートメントに適切な文字列を準備するために使用できます。
注: デフォルトでは、PHP ディレクティブ magic_quotes_gpc がオンになっており、すべての GET、POST、COOKIE データに対して addslashes() が自動的に実行されます。 magic_quotes_gpc によってエスケープされた文字列に対して addslashes() を使用しないでください。二重エスケープが発生するためです。この状況が発生した場合は、関数 get_magic_quotes_gpc() を使用して検出できます。



この例では、文字列内の事前定義された文字にバックスラッシュを追加します。

コードをコピーします コードは次のとおりです:
$str = "ジョン アダムスとは誰ですか?";
echo $str . " これはデータベース クエリでは安全ではありません。
";
echo addedlashes($str) . " これはデータベース クエリでは安全です。";
?>

出力:
John Adams とは何ですか? これはデータベース クエリでは安全ではありません。
John Adams とは何ですか? これはデータベース クエリでは安全です。

get_magic_quotes_gpc 関数

コードをコピーします コードは次のとおりです:
function html($str)
{
$str = get_magic_quotes_gpc()?$str:addslashes($str);
$str;
を返します }

get_magic_quotes_gpc:
PHP 環境変数 magic_quotes_gpc の値を取得します。
構文: long get_magic_quotes_gpc(void);
戻り値: 長整数
関数の種類: PHP システム関数

コンテンツの説明:

この関数は、PHP環境に設定されている変数magic_quotes_gpc(GPC、Get/Post/Cookie)の値を取得します。 0 を返すとこの機能がオフになることを意味し、1 を返すとこの機能がオンになることを意味します。 magic_quotes_gpc が有効な場合、すべての ' (一重引用符)、" (二重引用符)、(バックスラッシュ)、およびヌル文字は、バックスラッシュを含むオーバーフロー文字に自動的に変換されます。

スラッシュを追加します -- バックスラッシュを使用して文字列を引用します

説明:

文字列はスラッシュを追加します (文字列 str)

データベースクエリステートメントなどの特定の文字の前にバックスラッシュを追加した文字列を返します。これらの文字は、一重引用符 (')、二重引用符 (")、バックスラッシュ ()、および NUL (NULL 文字) です。
addslashes() の使用例は、データベースにデータを入力する場合です。たとえば、O'reilly という名前をデータベースに挿入するには、エスケープする必要があります。ほとんどのデータベースはエスケープ文字として O'reilly を使用します。これにより、余分な .html を挿入することなく、データがデータベースに保存されます。 PHP ディレクティブ magic_quotes_sybase が on に設定されている場合、' の挿入は ' でエスケープされることを意味します。

デフォルトでは、PHP 命令 magic_quotes_gpc がオンになっており、主にすべての GET、POST、COOKIE データに対してaddslashes() が自動的に実行されます。 magic_quotes_gpc によってエスケープされた文字列に対して addslashes() を使用しないでください。二重エスケープが発生するためです。この状況が発生した場合は、関数 get_magic_quotes_gpc() を使用して検出できます。

例 1.addslashes() の例


コードをコピーします コードは次のとおりです:$str = "あなたの名前はオライリーですか?";
// 出力: あなたの名前はオライリーですか?
エコーはスラッシュを追加します($str);
?>
get_magic_quotes_gpc()

この関数は、PHP 環境設定の変数 magic_quotes_gpc (GPC、Get/Post/Cookie) の値を取得します。 0 を返すとこの機能がオフになることを意味し、1 を返すとこの機能がオンになることを意味します。 magic_quotes_gpc がオンになっている場合、すべての ' (一重引用符)、" (二重引用符)、(バックスラッシュ)、およびヌル文字は、バックスラッシュを含むオーバーフロー文字に自動的に変換されます。
magic_quotes_gpc

php.ini の magic_quotes_gpc については、オフまたはオンに設定する必要がありますか?
個人的な意見ですが、オンに設定する必要があります

要約は次のとおりです:

1. magic_quotes_gpc=on の場合、

入出力データベースの文字列データでは何もできません

addslashes() およびtripslashes() の操作では、データは通常どおり表示されます。

このとき入力データに対してaddslashes()を実行すると、
次に、出力時にstripslashes()を使用して余分なバックスラッシュを削除する必要があります。

2.magic_quotes_gpc=offの場合

入力データを処理するにはaddslashes()を使用する必要がありますが、出力のフォーマットにはstripslashes()を使用する必要はありません

addslashes() はデータベースにバックスラッシュを書き込まないため、mysql が SQL ステートメントの実行を完了するのに役立つだけです。

追加:

magic_quotes_gpc スコープは次のとおりです: WEB クライアント サーバー; アクションの時間: スクリプトの実行時など、リクエストの開始時。

magic_quotes_runtime スコープ: ファイルから読み取られたデータ、exec() の実行結果、または SQL クエリから取得されたデータ; アクションの時間: スクリプトが実行状態で生成されたデータにアクセスするたび

コード:


コードをコピーします

コードは次のとおりです:
/*
場合によっては、フォームに複数の変数 (場合によっては数十個) が送信されることがあります。では、addslashes() を何度もコピー&ペーストするのは少し面倒でしょうか?フォームやURLから取得したデータは$_POST、$_GETなどの配列の形で現れるので、「一掃」できる関数をカスタマイズします
*/
関数引用符($content)
{
//magic_quotes_gpc=Off の場合、処理を開始します
if (!get_magic_quotes_gpc()) {
// $content が配列かどうかを判断します
if (is_array($content)) {
// $content が配列の場合、その各要素を処理します
foreach ($content as $key=>$value) {
$content[$key] = ラッシュを追加します($value)
}
} その他 {
// $content が配列でない場合、一度だけ処理されます
追加スラッシュ($content)
}
} その他 {
//magic_quotes_gpc=On の場合、処理されません
}
// $content を返す
$content を返します。 }
?>
この記事で説明した内容が皆様の PHP プログラミング設計に役立つことを願っています。

PHPでのSQLインジェクションを防ぐ最善の方法は何ですか?

ユーザー入力が SQL ステートメントに直接挿入されるクエリである場合、アプリケーションは次の例のように SQL インジェクションに対して脆弱になります。 $unsafe_variable = $_POST['user_input']; mysql_query("INSERT INTO table ( column) VALUES ('" . $unsafe_variable . "')"); これは、ユーザーが VALUE"); のようなものを入力してクエリを作成できるためです: 準備されたステートメントとパラメータ化された SQL ステートメントを使用します。攻撃者が悪意を持って SQL を挿入することは不可能です。この目標を達成するには、基本的に 2 つのオプションがあります: 1. PDO (PHP データ オブジェクト) を使用します: $stmt = $pdo->prepare ('SELECT * FROM 従業員 WHERE name = :name'); $stmt->execute(array(':name' => $name)); foreach ($stmt as $row) { // $ で何かを行う行 }2. mysqli:$stmt = $dbConnection->prepare('SELECT * FROM 従業員 WHERE name = ?'); $stmt->bind_param('s', $name) ; を使用します。 (); $result = $stmt->get_result(); while ($row = $result->fetch_assoc()) { // $row で何かを行う }PDO(PHP Data Object ) 実際のプリペアド ステートメントはPDO を使用する場合、デフォルトでは使用されません! この問題を解決するには、PDO を使用して接続を作成する例を次に示します。 $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);エラー モード ERRMODE は、上記の例では厳密には必須ではありませんが、追加することをお勧めします。このメソッドは、致命的なエラーが発生した場合でもスクリプトを停止しません。そして、開発者にエラー (PDOException がスローされたとき) を捕捉する機会を与えます。 setAttribute() 行は必須で、エミュレートされたプリペアド ステートメントを無効にし、実際のプリペアド ステートメントを使用するように PDO に指示します。これにより、ステートメントと値が MySQL データベース サーバーに送信される前に PHP によって解析されなくなります (攻撃者が悪意のある SQL を挿入する機会はありません)。もちろん、特別な注意を払って、コンストラクター オプションで文字セット パラメーターを設定することもできます。 「古い」PHP バージョン (5.3.6) では、DSN の文字セット パラメータが無視されます。ここで最も重要なことは、パラメータ値が SQL 文字列ではなく、プリコンパイルされたステートメントと結合されることです。SQL インジェクションの動作原理は、欺瞞によって作成された SQL スクリプトに悪意のある文字列が含まれていることです。 >>


【再投稿】PHP SQLインジェクション攻撃を防ぐ方法

最も重要な点は、データ型をチェックしてエスケープすることだと思います。要約されたルールは次のとおりです。 php.ini の display_errors オプションは、display_errors = off に設定する必要があります。これにより、php スクリプトでエラーが発生した後は、Web ページにエラーが出力されなくなり、攻撃者による有用な情報の分析が防止されます。 mysql_query などの mysql 関数を呼び出すときは、mysql エラーが出力されないように、先頭に @ を追加する必要があります (@mysql_query(...))。攻撃者が有益な情報を分析できないようにする場合も同様です。さらに、一部のプログラマは、開発時に mysql_query エラーが発生したときにエラーと SQL ステートメントを出力することに慣れています。たとえば、 $t_strSQL = "SELECT a from b....";
if ( mysql_query($t_strSQL) ){// 正しい処理}else{echo "エラー! SQL ステートメント: $t_strSQL \r\nエラー メッセージ".mysql_query();exit;} このアプローチは非常に危険で愚かです。これを行う必要がある場合は、Web サイト設定ファイルでグローバル変数を設定するか、マクロを定義してデバッグ フラグを設定することをお勧めします。 グローバル設定ファイル内:
define("DEBUG_MODE",0); // 1: DEBUG MODE ; 0: RELEASE MODE
//呼び出しスクリプト内:

php /****************************** 説明: 決定渡された変数に $_POST、$_GET などの不正な文字が含まれているかどうか 関数: アンチインジェクション**************************/ // 不正な文字フィルタリングされる $ArrFiltrate=array ("'",";","union"); //エラー発生後にジャンプする URL がデフォルトで $StrGoUrl=""; //配列に値があるかどうか function FunStringExist($StrFiltrate ,$ArrFiltrate){ foreach ($ArrFiltrate as $key=>$value){ if (eregi($value,$StrFiltrate)){ returntrue; returnfalse; } // $_POST と $_GETif(function_exists(array_merge )){ $ArrPostAndGet=array_merge($HTTP_POST_VARS,$HTTP_GET_VARS) }else{ foreach($HTTP_POST_VARS as $key=>$value){ $ArrPostAndGet[ ]=$value; } foreach($HTTP_GET_VARS as $key=> ;$value){ $ArrPostAndGet[]=$value; } } //検証を開始します foreach($ArrPostAndGet as $key=>$value){ if ( FunStringExist($value,$ArrFiltrate)){ echo "alert(\ "不正な文字\");"; if (empty($StrGoUrl)){ echo &q...残りのテキスト>>

www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/904916.html技術記事 PHP によるインジェクション攻撃の防止例の分析、php インジェクション例の分析 この記事では、PHP がどのようにインジェクション攻撃を防止するかを例の形で詳しく分析します。参考のためにみんなで共有してください。具体的な分析は次のとおりです:...
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。