はい、MySQLはあらゆるタイプのテキストを技術的に安全に保存できます。つまり、MySQLはテキストをそのまま保存し、データを失うことなく再び返します。
Mysqlはテキストの内容に違いがないため、HTML、CSS、JSコード、または友達の最後のメールであるかどうかに違いはありません。
ただし、後でテキストを出力する場合は、mysqlからデータをプルした後に不要なコードインジェクションが発生しないように注意する必要があります。しかし、それは実際にはMySQLとは関係ありません。
SQLをより安全にするには、データベースハンドルを<に渡します。 code> mysql_real_escape_string
または、MySQLi
を使用することをお勧めします。 および/または
あなたのコード
あなたのコードは何かを防ぐために多くのことを試みているように見えますが、結局それはかなり役に立たないことがわかります:
function filter($data) {
$data = trim(htmlentities(strip_tags($data)));
if (get_magic_quotes_gpc())
$data = stripslashes($data);
$data= strip_tags($data);
$data = mysql_real_escape_string($data);
return $data;}
データを処理する前にデータを正規化する
まず、 get_magic_quotes_gpc
のチェックの位置を変更する必要があります 関数が処理しているデータを正規化します。アプリケーションがそれに依存せず、そのオプションが有効になっている場合は動作を拒否するだけでよい場合はさらに良いでしょう-これに関するこの重要な情報をここで参照してください
セキュリティを気にするなら。
ただし、投稿されたコードの安全性のために、関数への入力値を正規化してから、さらに処理してみましょう。これは、チェックを関数の先頭に移動することによって行われます。
function filter($data)
{
// normalize $data because of get_magic_quotes_gpc
$dataNeedsStripSlashes = get_magic_quotes_gpc();
if ($dataNeedsStripSlashes)
{
$data = stripslashes($data);
}
// normalize $data because of whitespace on beginning and end
$data = trim($data);
// strip tags
$data = strip_tags($data);
// replace characters with their HTML entitites
$data = htmlentities($data);
// mysql escape string
$data = mysql_real_escape_string($data);
return $data;
}
この変更された関数では、魔法の引用符(使用してはいけないもの)がその先頭に移動されました。これにより、そのオプションがオンかオフかに関係なく、データは常に同じように処理されます。あなたの関数はそうしませんでした、それは渡された同じデータに対して異なる結果を作成したでしょう。そのため、これは修正されました。
関数に関するその他の問題
機能は今では良く見えますが、それでも多くの問題があります。たとえば、関数が実際に何をするのかは不明です。それは一度に多くのことを行い、それらのいくつかは矛盾しています:
-
$ data
の兆候であるHTMLタグを削除します HTMLを含めるべきではありません - ただし、
$ data
のテキストを変換します 実際にHTMLエンティティが含まれている必要があります。
では、データはどうあるべきでしょうか? HTMLかどうか?状況が不明確になっても、セキュリティが強化されることはありません。これは、エラーがプログラムに発生し、最終的にはセキュリティ対策に合格するというメリットがあるためです。
したがって、コードを破棄して、次のことを検討する必要があります。
- アプリケーションへの入力が無効な場合は、フィルタリングしないでください。代わりに、無効な入力がそれ以上使用されないようにしてください。したがって、入力を使用する前に入力を検証する関数が必要です。
- 考えているからといってデータを変更しないでください これにより、何かがより安全になる可能性があります。代わりに、必要かつ適切な場所でデータを変更してエンコードします。
- アプリケーションが魔法の引用符をオフにしてのみ機能するようにします。この機能に依存することは強くお勧めしません。そして、コード全体でそれをチェックする必要はありません。
- データベース内に何かを安全に保存するには、クエリでのみ使用する前にデータをエスケープします。アプリケーションの他の場所ではありません。そのためにプリペアドステートメントを使用します。
- データが有効な場合は、データベースに入れる前にデータを整理する必要はありません。 ただし、ウェブページに出力するときは適切にエンコードする必要があります 。そして、アプリケーションがこれをどのエンコーディングにする必要があるかを知っているのはそこだけです。データをデータベースに入れるとき、それはわかりません。
したがって、コードをより安全にしたい場合、これは、セキュリティに関連していると思われるため、いくつかのデータに多数の関数をスローすることではありません。そうすることで、ソフトウェアの安全性は向上しませんが、安全性は低下します。
- ユーザーデータを絶対に信用しないでください。
- データが必要な形式であることを確認してください前処理 。
- 適切な場所で仕事に適したツールを使用します。
- 推測でツールを使用しないでください。 代わりに知識を取得してください。それはセキュリティの面でだけではありません。