7

PHPを使用して、インジェクションを回避するために、MSQULデータベースに特殊文字(次のような)を格納するための最良の方法は何ですか。

« " ' é à ù

これが私が今それをする方法です:

$book_text=$_POST['book_text'];
$book_text=htmlentities($book_text, "ENT_QUOTES");
$query=//DB query to insert the text

それで:

$query=//DB query to select the text
$fetch=//The fetch of $book_text
$book_text=html_entity_decode($book_text);

このようにして、私のテキストはすべてHTMLエンティティでフォーマットされます。しかし、これは多くのデータベーススペースを占めると思います。それで、もっと良い方法はありますか?

4

4 に答える 4

6

utf8これらの値を格納するには、エンコーディングを使用します。

インジェクションを回避するには、 mysql_real_escape_string()(またはプリペアドステートメント)を使用します。

XSSから保護するには、を使用しますhtmlspecialchars

于 2012-04-11T20:23:35.410 に答える
1

あなたの質問は、PHPとMySQLでのUTF8の処理と保存に一般化できるようです。

SQLインジェクションから安全にするには、プリペアドステートメントを使用する必要があります。mysqliドライバーPDOドライバーはどちらもそれらをサポートしています。

プリペアドステートメントはドライバーによって自動的に引用されるため、これについて心配する必要はありません。

データベーステーブルは、文字セットutf8utf8_general_ci照合を使用して作成する必要があります。これらのmy.cnf設定により、MySQLサーバーが次のすべての方法でUTF8を実行できるようになります。

[mysqld]
default-character-set=utf8
default-collation=utf8_general_ci
character-set-server=utf8
collation-server=utf8_general_ci
init-connect='SET NAMES utf8'

[client]
default-character-set=utf8

PHPは一般にUTF-8を認識しないため、文字列の処理にはiconvまたはmbstringライブラリのいずれかを使用するように注意する必要があります。概要については、 PHPWACTを参照してください。

PHPの内部文字セットがUnicodeに設定されていることを確認してください

iconv_set_encoding('internal_encoding', 'UTF-8');
mb_internal_encoding('UTF-8');

また、正しいヘッダーを送信するか、<meta>charsetのタグを追加して、ブラウザがエンコーディングを認識していることを確認する必要があります。

それはそれをする必要があります。

于 2012-04-11T20:45:09.683 に答える
0

はいutf8エンコーディング...

また、インジェクションについて多くのことを心配している場合は、プリペアドステートメントを使用できます...

http://www.linearchat.co.uk/2011/08/why-prepared-statements-in-mysql-are-a-good-thing/

また

http://dev.mysql.com/doc/refman/5.0/en/sql-syntax-prepared-statements.html

于 2012-04-11T20:37:39.827 に答える
0

あなたの質問は混乱の素晴らしいコレクションです。あなたはなんとかすべてを混乱させました。
それを整理してみましょう。

PHPを使用して、インジェクションを回避するために、MSQULデータベースに特殊文字(次のような)を格納するための最良の方法は何ですか。

これらは比類のない問題です。特別な文字を保存することは1つの問題であり、注入を回避することは別の問題です。まったく違うもの。

$book_text=htmlentities($book_text, "ENT_QUOTES");

これは最も面白い部分です。クエリを保護することを目的としていますが、実際には何もしません。値が3の定数ENT_QUOTESの代わりに、数値が0の文字列ENT_QUOTESを使用しているため、フラグを設定していません。

ただし、このフラグを正しく設定しても、自動的に保護されるわけではありません。インジェクションコードには特別な文字が含まれていない可能性があるためです。

インジェクションを回避するには、1つの単純な関数「make_my_data_safe()」ではなく、一連のルール全体に従う必要があります。魔法の杖はありません。
詳細については、これが私の答えを参照してください。

スペシャルチャーは簡単です。固体の特殊文字が設定されていないという唯一の問題。環境ごとに異なる特殊文字 があります。

  • 'データベースとHTMLに意味があります
  • <>はHTMLに対してのみ意味があります
  • éàùはHTMLに対してのみ意味があり、エンコーディングによって異なります。

ケースごとに異なるフォーマットルールを使用する必要があります。異なる、すべてのための単一のものではありません。

HTMLでéàùcharsを使用するには、適切なHTTPヘッダーを設定する必要があります。データベースでéàùを使用するには、テーブルエンコーディングをutf8に設定し、接続エンコーディングをutf8に設定する必要があります。

于 2012-04-12T05:23:11.630 に答える