ホームページ バックエンド開発 PHPチュートリアル PHP で SQL インジェクションを防ぐには、addslashes と mysql_real_escape_string をもう使用しないでください。

PHP で SQL インジェクションを防ぐには、addslashes と mysql_real_escape_string をもう使用しないでください。

Aug 08, 2016 am 09:30 AM
name pdo stmt string

このブロガーはさまざまなインターネット技術に熱心で、頻繁に強迫性障害を患っています。この記事が役立つと思われる場合は、私をフォローしてください。 転載する際は「Dark Blue Scythe」と明記してください


SQL インジェクションを防ぐために、多くの PHP Web サイトが依然として addlashes と str_replace を使用していることを確認しました、そして実際に私はそれを発見しました。 mysql_real_escape_string にも、ハッカーがそれをバイパスできる方法があります あなたのシステムがまだ上記の 3 つの方法を使用している場合、私の このブログ投稿は、このピットをバイパスすることをすべての人に思い出させる意味があります。

将来の世代に穴を掘るのではなく、木を植えるために、将来「問題」が「問題」でなくなるように、PHPとMYSQLのバージョン情報を与える。

str_replace とさまざまな PHP 文字置換関数は、インジェクションを防ぐために使用されることは言うまでもありませんが、この「ブラックリスト」タイプの防御は時の試練に耐えられないことが証明されています。

以下はaddlasherとmysql_real_escape_string(Trick)をバイパスする方法です。


-log の下のトリックは修正されましたが、まだ正確には解決されていませんインジェクションの問題については、多くの企業のシステムがまだ Mysql5.0 を使用しているため、すぐに改善することをお勧めします。プログラマーの能力を迅速に向上させるためのいくつかの方法についても説明します。 」で述べられている非常に重要な点。

注: システムが SQL インジェクション の危険にさらされているかどうかわからない場合は、次のデモをサーバーにデプロイしてください。実行結果が同じであれば、その後、最終的な完璧なソリューションを参照してください。

MYSQL:

mysql> select version();
+---------------------+
| version()           |
+---------------------+
| 5.0.45-community-ny |
+---------------------+
1 row in set (0.00 sec)
mysql> create database test default charset GBK;
Query OK, 1 row affected (0.00 sec)
mysql> use test;
Database changed
mysql> CREATE TABLE users (
    username VARCHAR(32) CHARACTER SET GBK,
    password VARCHAR(32) CHARACTER SET GBK,
    PRIMARY KEY (username)
);
Query OK, 0 rows affected (0.02 sec)
mysql> insert into users SET username='ewrfg', password='wer44';
Query OK, 1 row affected (0.01 sec)
mysql> insert into users SET username='ewrfg2', password='wer443';
Query OK, 1 row affected (0.01 sec)
mysql> insert into users SET username='ewrfg4', password='wer4434';
Query OK, 1 row affected (0.01 sec)=
ログイン後にコピー

PHP:

<?php
echo "PHP version: ".PHP_VERSION."\n";

mysql_connect(&#39;servername&#39;,&#39;username&#39;,&#39;password&#39;);
mysql_select_db("test");
mysql_query("SET NAMES GBK");

$_POST[&#39;username&#39;] = chr(0xbf).chr(0x27).&#39; OR username = username /*&#39;;
$_POST[&#39;password&#39;] = &#39;guess&#39;;

$username = addslashes($_POST[&#39;username&#39;]);
$password = addslashes($_POST[&#39;password&#39;]);
$sql = "SELECT * FROM  users WHERE  username = &#39;$username&#39; AND password = &#39;$password&#39;";
$result = mysql_query($sql) or trigger_error(mysql_error().$sql);

var_dump(mysql_num_rows($result));
var_dump(mysql_client_encoding());

$username = mysql_real_escape_string($_POST[&#39;username&#39;]);
$password = mysql_real_escape_string($_POST[&#39;password&#39;]);
$sql = "SELECT * FROM  users WHERE  username = &#39;$username&#39; AND password = &#39;$password&#39;";
$result = mysql_query($sql) or trigger_error(mysql_error().$sql);

var_dump(mysql_num_rows($result));
var_dump(mysql_client_encoding());

mysql_set_charset("GBK");
$username = mysql_real_escape_string($_POST[&#39;username&#39;]);
$password = mysql_real_escape_string($_POST[&#39;password&#39;]);
$sql = "SELECT * FROM  users WHERE  username = &#39;$username&#39; AND password = &#39;$password&#39;";
$result = mysql_query($sql) or trigger_error(mysql_error().$sql);

var_dump(mysql_num_rows($result));
var_dump(mysql_client_encoding());
ログイン後にコピー

結果:
PHP version: 5.2.5
int(3)
string(6) "latin1"
int(3)
string(6) "latin1"
int(0)
string(3) "gbk" 
ログイン後にコピー
addslashes を使用しても、mysql_real_escape_string を使用しても、コーディングの脆弱性を利用して、任意のパスワードを入力してサーバーにログインできるインジェクション攻撃を実行できることがわかります。 ! ! ! (攻撃の原理については詳しく説明しません。興味のある学生は、文字エンコーディングにおけるシングルバイトとマルチバイトの問題を学ぶことができます) 注: 3 番目の mysql_real_escape_string がインジェクションを防止できる理由mysql_escape_string 自体は現在のエンコーディングを決定できないため、サーバー側のエンコーディングとクライアント側のエンコーディングの両方を指定する必要があります。これにより、エンコーディングの問題の発生を防ぐことができます。 SQL インジェクションはある程度防ぐことができますが、それでも次のような完全な解決策をお勧めします。

完璧な解決策は、PDO とプリペアド ステートメント メカニズムを備えた MYSQLi を使用して mysql_query を置き換えることです (注: mysql_query は PHP 5.5.0 以降非推奨になり、将来削除される予定です):

PDO :

$pdo = new PDO(&#39;mysql:dbname=dbtest;host=127.0.0.1;charset=utf8&#39;, &#39;user&#39;, &#39;pass&#39;);

$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$stmt = $pdo->prepare('SELECT * FROM employees WHERE name = :name');
$stmt->execute(array('name' => $name));

foreach ($stmt as $row) {
    // do something with $row
}
ログイン後にコピー
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
}
ログイン後にコピー
上記では、Addslashes と mysql_real_escape_string を使用しないで、PHP で SQL インジェクションを防ぐ方法を紹介しました。PHP チュートリアルに興味のある友人にとって役立つことを願っています。

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

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

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

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

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

PHP 致命的エラーの解決策: 未定義メソッド PDO::prepare() の呼び出し PHP 致命的エラーの解決策: 未定義メソッド PDO::prepare() の呼び出し Jun 22, 2023 pm 06:40 PM

PHP は、長い間使用されている人気のある Web 開発言語です。 PHP に統合された PDO (PHP Data Object) クラスは、Web アプリケーションの開発中にデータベースと対話する一般的な方法です。ただし、一部の PHP 開発者がよく遭遇する問題は、PDO クラスを使用してデータベースと対話するときに、次のようなエラーが表示されることです。

Java の String.valueOf() 関数を使用して基本データ型を文字列に変換する Java の String.valueOf() 関数を使用して基本データ型を文字列に変換する Jul 24, 2023 pm 07:55 PM

Java の String.valueOf() 関数を使用して基本データ型を文字列に変換する Java 開発で基本データ型を文字列に変換する必要がある場合、一般的な方法は String クラスの valueOf() 関数を使用することです。この関数は、基本データ型のパラメータを受け入れ、対応する文字列表現を返すことができます。この記事では、基本的なデータ型変換に String.valueOf() 関数を使用する方法を検討し、いくつかのコード例を提供します。

char配列を文字列に変換する方法 char配列を文字列に変換する方法 Jun 09, 2023 am 10:04 AM

char配列をstringに変換する方法:代入によって実現できます {char a[]=" abc d\0efg ";string s=a;} 構文を使用して、char配列にstringに値を直接代入させて実行します変換を完了するためのコード。

PHP と PDO: 一括挿入と更新を実行する方法 PHP と PDO: 一括挿入と更新を実行する方法 Jul 28, 2023 pm 07:41 PM

PHP と PDO: バッチ挿入およびバッチ更新を実行する方法 はじめに: PHP を使用してデータベース関連アプリケーションを作成する場合、データをバッチ挿入および更新する必要がある状況によく遭遇します。従来のアプローチでは、ループを使用して複数のデータベース操作を実行しますが、この方法は非効率的です。 PHP の PDO (PHPDataObject) は、バッチ挿入および更新操作を実行するためのより効率的な方法を提供します。この記事では、PDO を使用してバッチ挿入および更新操作を実装する方法を紹介します。 1. PDO の概要: PDO は PH です

PHP PDO と mysqli: 比較対照 PHP PDO と mysqli: 比較対照 Feb 19, 2024 pm 12:24 PM

PDOPDO は、PHP に統合インターフェイスを提供するオブジェクト指向のデータベース アクセス抽象化レイヤーであり、同じコードを使用して異なるデータベース (Mysql、postgresql、oracle など) と対話できるようにします。 PDO は、基礎となるデータベース接続の複雑さを隠し、データベース操作を簡素化します。長所と短所 長所: 統一されたインターフェイス、複数のデータベースのサポート、データベース操作の簡素化、開発の困難さの軽減、プリペアドステートメントの提供、セキュリティの向上、トランザクション処理のサポート 短所: パフォーマンスはネイティブ拡張よりわずかに低い場合があり、外部ライブラリに依存し、オーバーヘッドが増加する可能性があります。デモ コードでは PDO を使用します。 mysql データベースに接続します: $db=newPDO("mysql:host=localhost;dbnam

Java の String.replace() 関数を使用して、文字列内の文字 (文字列) を置換します。 Java の String.replace() 関数を使用して、文字列内の文字 (文字列) を置換します。 Jul 25, 2023 pm 05:16 PM

Java の String.replace() 関数を使用して文字列内の文字 (文字列) を置換する Java では、文字列は不変オブジェクトです。つまり、文字列オブジェクトが作成されると、その値は変更できません。ただし、文字列内の特定の文字または文字列を置換する必要がある状況が発生する場合があります。現時点では、Java の String クラスの replace() メソッドを使用して文字列置換を実装できます。 String クラスの replace() メソッドには 2 つのタイプがあります。

プログラミングにおける $stmt php の重要性と実践方法 プログラミングにおける $stmt php の重要性と実践方法 Feb 27, 2024 pm 02:00 PM

プログラミングにおける $stmtPHP の重要性と実践方法 PHP プログラミングのプロセスにおいて、$stmt オブジェクトを使用してプリペアド ステートメント (PreparedStatement) を実行することは、非常に価値のあるテクノロジです。このテクノロジーは、プログラムのセキュリティを向上させるだけでなく、SQL インジェクション攻撃を効果的に防止し、データベース操作をより効率的にすることができます。プリペアド ステートメントのプログラミングにおける $stmtPHP の重要性は、SQL ステートメントを実行する前に 2 つの部分に分割することを指します。 SQ

PHP と PDO: ページング クエリを実行してデータを表示する方法 PHP と PDO: ページング クエリを実行してデータを表示する方法 Jul 29, 2023 pm 04:10 PM

PHP と PDO: ページ内のデータをクエリして表示する方法 Web アプリケーションを開発する場合、ページ内のデータをクエリして表示することは非常に一般的な要件です。ページングにより、一度に一定量のデータを表示できるため、ページの読み込み速度とユーザー エクスペリエンスが向上します。 PHP では、PHP データ オブジェクト (PDO) ライブラリを使用して、ページング クエリとデータの表示の機能を簡単に実現できます。この記事では、PHP で PDO を使用してページごとにデータをクエリおよび表示する方法と、対応するコード例を紹介します。 1. データベースとデータテーブルを作成する

See all articles