PHP で SQL インジェクションを防ぐ方法、phpsql インジェクション_PHP チュートリアル

WBOY
リリース: 2016-07-13 10:18:41
オリジナル
1247 人が閲覧しました

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

【1.サーバー側の設定】

セキュリティ、PHP コード作成は 1 つの側面であり、PHP 構成は非常に重要です。

PHP を手動でインストールしました。PHP のデフォルト設定ファイルは /usr/local/apache2/conf/php.ini にあります。最も重要なことは、PHP をより安全に実行できるように php.ini の内容を設定することです。 PHP全体のセキュリティ設定は主にphpshellとSQLインジェクションによる攻撃を防ぐためのものです。ゆっくり説明していきます。まず、編集ツールを使用して /etc/local/apache2/conf/php.ini を開きます。他の方法でインストールした場合は、設定ファイルがこのディレクトリにない可能性があります。

(1) PHP のセーフ モードをオンにする

PHP のセーフ モードは、system()、

などの PHP の一部の関数を制御できる非常に重要な組み込みのセキュリティ メカニズムであり、同時に多くのファイル操作に対するアクセス許可を付与します。関数を制御し、/etc/passwd などの特定のキー ファイルを許可しません

しかし、デフォルトの php.ini はセーフ モードを開きません。セーフ モードをオンにします:

safe_mode = on

(2) ユーザー グループ セキュリティ

safe_mode がオンで、safe_mode_gid がオフの場合、php スクリプトはファイルにアクセスでき、同じ

グループ内のユーザーもファイルにアクセスできます。

次のように設定することをお勧めします:

safe_mode_gid = off

これが設定されていない場合、例えば、

操作する必要がある場合に、サーバー Web サイトのディレクトリ内のファイルを操作できない可能性があります。ファイル。

(3) セーフ モードでプログラムを実行するためのホーム ディレクトリ

セーフ モードがオンになっているが、特定のプログラムを実行したい場合は、プログラムを実行するためのホーム ディレクトリを指定できます:

safe_mode_exec_dir = D:/usr/bin

通常、プログラムを実行する必要はないため、システム プログラム ディレクトリを実行しないことをお勧めします。

次に、実行する必要があるプログラムをコピーします (例:

safe_mode_exec_dir)。 = D:/tmp/cmd

ただし、プログラムは実行しないことをお勧めします。その場合は、Web ページのディレクトリを指定できます:

safe_mode_exec_dir = D:/usr/www

(4) ファイルをセーフ モードでインクルードします

特定のファイルをセーフ モードのパブリック ファイルに含めたい場合は、オプションを変更します:

safe_mode_include_dir = D:/usr/www/include/

実際、通常、php スクリプトに含まれるファイルはプログラムに記述されています。これは特定のニーズに応じて設定できます。

(5) PHP スクリプトがアクセスできるディレクトリを制御します

open_basedir オプションを使用して、指定されたディレクトリにのみアクセスするように PHP スクリプトを制御します。これにより、PHP スクリプトがアクセスすべきでないファイルにアクセスするのを防ぐことができ、phpshell の害を制限できます。

open_basedir = D:/usr/www

(6) 危険な機能をオフにする

セーフモードがオンになっている場合は、機能を禁止します。必須ではありませんが、安全のために考慮する必要があります。たとえば、

コマンドを実行できる system() などの php 関数、または

phpinfo() や php 情報を表示できるその他の関数を実行したくない場合は、それらを無効にすることができます:

disable_functions = system ,passthru,exec,shell_exec,popen,phpinfo

ファイルやディレクトリの操作を禁止したい場合は、多くのファイル操作を無効にすることができます

disable_functions = chdir,chroot,dir,getcwd,opendir,readdir,scandir,fopen ,unlink ,delete,copy,mkdir, rmdir,rename,file,file_get_contents,fputs,fwrite,chgrp,chmod,chown

上記は一般的に使用されるファイル処理関数の一部です。また、上記の実行コマンド関数を組み合わせることもできます。この関数を組み合わせると、

はほとんどの phpshell に耐えることができます。

(7) http ヘッダーの PHP バージョン情報の漏洩をオフにする

ハッカーがサーバー内の PHP バージョン情報を取得するのを防ぐために、http ヘッダーの情報をオフにすることができます:

expose_php = Off

たとえば、ハッカーが Telnet www.12345.com 80 を使用すると、PHP 情報を見ることができなくなります。

(8) グローバル変数の登録をオフにする

POST または GET を使用して送信された変数を含む、PHP で送信された変数は、グローバル変数として自動的に登録され、直接アクセスできます

これはサーバーにとって非常に安全ではありません。グローバル変数として登録させることはできないので、グローバル変数の登録オプションをオフにします:

register_globals = Off

もちろん、このように設定されている場合は、対応する変数を取得するために合理的な方法を使用する必要があります。 GET var によって送信された変数を取得する場合など、変数を取得するには $_GET['var'] を使用する必要があります。PHP プログラマはこれに注意する必要があります。

(9) SQL インジェクションを防ぐために、magic_quotes_gpc をオンにします

SQL インジェクションは、Web サイトのバックエンドに侵入したり、サーバー全体がダウンしたりする可能性があるため、注意してください。 php.ini には次の設定があります:

magic_quotes_gpc = Off

これがオンになっている場合、ユーザーが送信した SQL クエリが自動的に変換されます (例: ' を ' に変換します)。 SQL インジェクションを防ぐための重要な役割を果たします。したがって、次のように設定することをお勧めします:

magic_quotes_gpc = On

(10) エラー メッセージ制御

通常、PHP はデータベースに接続されていない場合、またはその他の状況下でエラーを表示します。一般的なエラー メッセージには、PHP スクリプトまたは SQL の現在のパス情報が含まれます。クエリのステートメントなどの情報。この種の情報はハッカーに提供された後は安全ではないため、一般的にサーバーはエラー プロンプトを無効にすることをお勧めします:

display_errors = Off

エラー メッセージを表示したい場合は、警告の上に情報のみを表示するなど、表示エラーのレベルを設定するには:

error_reporting = E_WARNING & E_ERROR

もちろん、それでもエラー プロンプトをオフにすることをお勧めします。

(11) エラーログ

サーバー動作の原因を見つけやすくするために、display_errors をオフにしてエラー情報を記録することをお勧めします:

log_errors = On

同時に、エラーログが保存されているディレクトリstorage も設定する必要があります。Apache ログも一緒に存在することをお勧めします:

error_log = D:/usr/local/apache2/logs/php_error.log

注: Apache ユーザーを許可するには、このファイルを指定する必要があります。およびグループに書き込み権限を与えます。

権限を減らして実行する MYSQL

mysqlstart のような新しいユーザーを作成します

net user mysqlstart funkmicrosoft /add

net localgroup users mysqlstart /del

どのグループにも属していません

MYSQL が d:mysql にインストールされている場合, 次に、mysqlstart にフル コントロール権限を与えます

次に、システム サービスで MYSQL サービス プロパティを設定し、ログイン プロパティでこのユーザー mysqlstart を選択し、パスワードを入力して確認します。

MYSQL サービスを再起動すると、MYSQL は低い特権で実行されます。

Apache が Windos プラットフォーム上に構築されている場合、Apache はデフォルトでシステム権限で実行されるため、非常に不快に感じます。次に、Apache の権限を下げてみましょう。

net user apache funcmicrosoft /add

net localgroup users apache /del

ok どのグループにも属さないユーザー apche を作成しました。

コンピューターマネージャーを開き、サービスを選択し、Apacheサービスのプロパティをクリックし、ログオンを選択し、このアカウントを選択し、上で作成したアカウントとパスワードを入力します。

Apacheサービスを再起動します。OK、Apacheが実行されます低い権限で降りました。

実際、Apache ユーザーが実行したいことのみを実行できるように各フォルダーの権限を設定し、ディレクトリごとに個別の読み取り/書き込みユーザーを作成することもできます。

これは、現在の多くの仮想ホスティングプロバイダーの間で一般的な構成方法でもありますが、この方法をこれを防ぐために使用すると過剰になります。



【2.PHPコードの書き方】


多くの国内 PHP プログラマーは依然として SQL インジェクションを防ぐために addslashes に依存していますが、中国語での SQL インジェクションを防ぐために全員がチェックを強化することをお勧めします。 addslashes の問題は、ハッカーが 0xbf27 を使用して一重引用符を置き換えることができるのに対し、addslashes は 0xbf27 を 0xbf5c27 に変更するだけで、有効なマルチバイト文字になる 0xbf5c は依然として一重引用符とみなされ、そのため addslashes は正常にインターセプトできないことです。

もちろん、addslashes はマルチバイト文字の処理に使用されます。mysql_real_escape_string を使用します。

PHP マニュアルの get_magic_quotes_gpc の例も:
if (!get_magic_quotes_gpc()) {$lastname =addslashes($_POST['lastname']);
} else {$lastname = $_POST['lastname ] ;
}



magic_quotes_gpc がすでに開いているときに $_POST['lastname'] を確認するのが最善です。
2 つの関数 mysql_real_escape_string と mysql_escape_string の違いについて話しましょう:
mysql_real_escape_string は (PHP 4 >= 4.3.0、PHP 5) で使用する必要があります。それ以外の場合は、mysql_escape_string のみを使用できます。この 2 つの違いは、mysql_real_escape_string は接続の現在の文字セットを考慮するのに対し、mysql_escape_string は考慮しないことです。
要約すると:
* addedlashes() は強制的な追加です。
* mysql_real_escape_string()
は文字セットを決定しますが、PHP バージョンの要件があります。 * mysql_escape_string は接続の現在の文字セットを考慮しません。
------------------------------------------------- --------------------------------------
PHPでコーディングする際に考慮すると基本的なセキュリティの問題について、まず第一に:
1. 変数を初期化します
なぜこれを言うのですか?以下のコードを見てみましょう:
PHP コード


if ($admin)
{
echo 'ログイン成功! ';
include('admin.php'); 'あなたは管理者ではないので管理できません。 ';
}
?> さて、上記のコードは正常に実行されているようで問題はないので、それに不正なパラメータを送信してみましょう。たとえば、私たちのページが http://daybook.diandian.com/login.php である場合、次のように送信します: http://daybook.diandian.com/login.php?admin=1、はは、考えてみてください。あなたが直接管理者であるか、直接管理します。
もちろん、このような単純な間違いはしないかもしれません。また、非常に秘密の間違いによってこの問題が発生する可能性もあります。たとえば、phpwind フォーラムには脆弱性があり、これにより管理者権限を直接取得できます。 $skin 変数。初期化が行われないため、後で一連の問題が発生します。では、上記の問題を回避するにはどうすればよいでしょうか?まず、php.ini から始めて、php.ini で register_global =off を設定します。これは、登録されているすべての変数がグローバルであるわけではないため、これを回避できることを意味します。ただし、私たちはサーバー管理者ではないので、コードからしか改善できません。では、上記のコードをどのように改善すればよいでしょうか。これを次のように書き換えます。 PHP コード
{
// 送信された管理者のユーザー名とパスワードが正しいかどうかを確認し、対応する処理コード
// ...

$admin = 1; }

{
echo 'ログインに成功しました! ';
include('admin.php'); 'あなたは管理者ではないので管理できません。 '; 変数が $admin = 0 に初期化されると、この脆弱性を通じて管理者権限を取得できなくなります。 2. SQL インジェクション (SQL インジェクション) を防ぐ
SQL インジェクションは、基本的に過去 2 年間で中国で普及したテクノロジである asp から php までを含め、現時点で最も有害なプログラムであるはずです。変数フィルターに失敗すると、注入ポイントが作成され、悪意のあるユーザーが一部の SQL クエリ ステートメントを送信できるようになり、その結果、重要なデータが盗まれたり、データが失われたり破損したり、バックエンド管理に侵入されたりする可能性があります。
基本的な注射侵入方法は理解できたので、どうすればそれを防ぐことができるでしょうか?コードから始めましょう。 Web 上でデータを送信するには 2 つの方法があることはわかっています。1 つは get で、もう 1 つは post です。そのため、一般的な SQL インジェクションの多くは get メソッドから始まり、インジェクション ステートメントにはいくつかの SQL ステートメントが含まれている必要があります。 SQL ステートメントがない場合は、select、update、delete、insert という 4 つの主要な SQL ステートメントがあるので、送信するデータをフィルタリングすれば、これらの問題を回避できるでしょうか。
そこで、正規表現を使用して次の関数を構築します: PHP code
function inject_check($sql_str)
{ eregi('select|insert|update|delete|'|
function verify_id($id=null)
{
if (!$id) { exit('パラメータが送信されていません!') } // 空かどうか
elseif (inject_check($ ID )) { exit('提出されたパラメータが不正です!') } // インジェクション判定
elseif (!is_numeric($id)) { exit('提出されたパラメータが不正です!' } // 数値判定 ; $id = intval($id); // 整数化
return $id;

?>
なるほど、それでは上記のプログラムは次のようになります: PHP code

if (inject_check($_GET['id']))
{ 送信されたデータは不正です。$id フィルターに再送信してください ');データは合法です。続行してください。 ';
}
?> さて、問題はここで解決されたようですが、郵送で送信されたデータと大量のデータについて考慮しましたか?
たとえば、「_」、「%」など、一部の文字はデータベースに悪影響を与える可能性があります。これらの文字は特別な意味を持っているため、これらを制御するとどうなるでしょうか?もう 1 つのポイントは、php.ini で magic_quotes_gpc = off に設定すると、データベースのルールに準拠していない送信されたデータの前に ' ' が自動的に追加されないことです。この場合、これらの問題を制御する必要があるため、次のように構築します。 PHP コード function str_check( $str )
if (!get_magic_quotes_gpc() ) // magic_quotes_gpc が開いているかどうかを判断します
{
$str =addslashes($str); //フィルターで除外
}
$str = str_replace("_", "_", $str); // '_' をフィルターで除外
$str = str_replace( "%", "%", $ str); // '%' を除外します


return $str; サーバーが侵害される危険を再び回避しました。
最後に、投稿や記事やニュースの作成など、大量のデータを送信することを検討します。上記の関数に基づいて、次の関数を構築します。
PHP コード

function post_check($post)
{
if (!get_magic_quotes_gpc()) // magic_quotes_gpc が開いているかどうかを判断します
{
$post = ラッシュを追加($ post); // magic_quotes_gpc が開かれていない場合に送信されたデータをフィルターします
}
$post = str_replace("_", "_", $post) // '_' をフィルターします
$post = str_replace( "%", "%", $post); // ' % ' を除外します
$post = nl2br($post) // 変換を入力します
$post= htmlspecialchars ($post);タグ変換
return $post;
}
?>
笑、基本的にはいくつかの状況について話しましたが、実際にはまだほとんど話していないと思います。少なくとも 2 つの側面についてのみ説明しており、セキュリティ全体についてはほとんど内容がありません。次回は、PHP のセキュリティ構成や Apache のセキュリティなどを含めて、全体的なセキュリティが正しくなるように詳しく説明する予定です。 、最も安全なものにします。
最後に、上記の内容を説明します: 1. 変数を初期化する 2. 必ず変数をフィルター処理する

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インジェクションを防ぐ方法

ええと、これは私の先生がくれた答えです

答え: 一般的なデータベース操作キーワード、
select、insert、update、delete、* などをフィルターするか、PHP のシステム関数 addlashes
を使用してコンテンツをフィルターします。設定ファイル register_globals=off; オフ状態に設定します (登録されたグローバル変数をオフにします)。これが ON に設定されている場合は、$_POST['user'] を使用します。 , $user が値を受け取ります。SQL ステートメントを記述するときは、小さな引用符 (タブの上にある引用符) と一重引用符を省略しないように注意してください。データベースの特性に応じて、いくつかの重要なフィールドに名前を付けます。推測されにくくするためのプログラムです
SQL ステートメントの直接公開を避けるために一般的なメソッドをカプセル化します
PHP セーフ モードをオンにします。safe_mode=on
SQL インジェクションを防ぐために、magic_quotes_gpc をオンにします。オンにすると、デフォルトは自動的にオフになります。ユーザーが送信した SQL クエリ ステートメントを変換し、「'」を「\'」に変換します
エラー メッセージの出力を制御し、エラー メッセージ プロンプトをオフにし、エラー情報をシステム ログに書き込みます
MYSQLI または PDO 前処理を使用します


http://www.bkjia.com/PHPjc/882620.html

tru​​ehttp://www.bkjia.com/PHPjc/882620.html技術記事 PHP の SQL インジェクションを防ぐ方法、phpsql インジェクション [1. サーバー側の設定] セキュリティ、PHP コードの記述は 1 つの側面であり、PHP の設定は非常に重要です。 PHP を手動でインストールしました...
関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート