ユーザーが入力するテキストのブロックにこれを使用するつもりです。もちろん、悪意のあるサイトの悪用は避けたいと思います。
MYSQL インジェクションとXSSについて読んだことから、単純なテキストのみを許可し、HTML タグやリンクは許可せず、特別なものはプレーンテキストだけで、いくつかのリテラル リンクは許可しません。
これで十分でしょうか?
mysql_real_escape_string(strip_tags($_POST['datablock']));
短い答え:いいえ。
長い答えはもっと複雑です。
インジェクション バグから SQL クエリを確実に保護する必要があります。これを行う最善の方法は、ユーザー データをクエリに直接挿入するのではなく、代わりにデータベース ドライバーの SQL プレースホルダーを使用して挿入を行うことです。これは最も安全な方法です。クエリは次のようになります。
INSERT INTO table_name (user_id, comment) VALUES (:user_id, :comment)
次に、データは、ドライバーが正しくエンコードできるように、さまざまなプレースホルダーにバインドされます。これについて規律を守ることで、ほとんどすべての SQL インジェクションの問題を回避できます。
また、スクリプトを含む任意の HTML をユーザーがページに挿入できないようにすることで、HTML をXSS 攻撃から保護する必要があります。このユーザー コンテンツに<script>
タイプ タグや JavaScript がさまざまな要素に組み込まれていないことが確実でない限り、ユーザー入力は常に HTML 実体化された同等のものとしてレンダリングする必要があります。JavaScript はスクリプト タグにまったく限定されていないため、これを正しく行うのは非常に難しいことに注意してください。HTML 要素の属性として、または CSS スタイル定義でさえも表示できます。
さらに、新しいアプリケーションでは、または関連する機能を使用しないでください。mysql_query
これらのメソッドはデフォルトでは危険であり、変数を 1 つでも見逃すと深刻な被害をもたらします。自動化された SQL インジェクション ツールには恐ろしい機能のリストがあり、これらのツールが必要とするのはエスケープされていない1 つの変数だけです。
ありがたいことmysql_query
に、PHP 5.5.0 で警告が生成され、PHP の将来のバージョンでは完全に削除される予定です。
少なくとも、データベース アクセスにはPDOを使用する必要があります。名前付きプレースホルダーをサポートし、データベース インターフェイス コードを監査して安全であることを確認することが非常に簡単になります。ミスが目立ちます。安全対策として、クエリ文字列を一重引用符で定義する'INSERT INTO ...'
ことをお勧めします。変数を誤って挿入した場合、誤って補間されず、最終的に無害な SQL エラーが発生するようにします。
理想的には、PHP フレームワークを使用してアプリケーションを構築する必要があります。これらのほとんどは、安全なデータベース アクセス、HTML エスケープ、および XSS 保護のための標準化された方法を備えています。1 年かけて独自のフレームワークを書きたいと思わない限り、自分でできることではありません。
SQL 文字列を手動で作成するのではなく、SQL パラメータをバインドすることも良い方法です ( Little Bobby Tables の xkcd を参照してください)。