2010-12-12 5 views
2

コンテンツページがmod_rewriteで処理されているサイトで作業していて、mod_rewriteでURLを管理するようにしようとしています。SQL injectionsユーザーは、このようなページの内容を作成することができますので、私は名前を持つことができるので、私は'文字を挿入する必要がURLとmod_rewrite:多くの特殊文字を使用して攻撃からデータを保護する

http://site.com/architect/Giovanni+Dall'Agata 

http://site.com/content-type/Page-created-by-user 

を、彼らはのようなものを挿入したときに私の疑問が来ます有名な建築家のようなこのようなものですが、データを安全に保つことができるかどうか、そしてどのようにしてこの文字と一緒にSQL injectionsを防ぐのか分かりません。

攻撃を防ぐために特に必要な作業はありますか?

私はこのようなPHPPDO classを使用しています:

$architect = strip_tags (trim ($_REQUEST["architect"])); 

// pdo class etc.. 
$pdo_stmt->bindParam (":arch", $architect, PDO::PARAM_STR); 
// and the other code here... 

ユーザーは、これらの文字を持つページを作成することはできません。< >/\ * ? =は、私はあまりにも'"を禁止すべきか? '"のいずれか1つのみを許可する必要がありますか、それらを一緒に使用してサーバーを安全に保つことはできますか?

+3

デザインの観点からは、アプリケーションの他のレイヤー(mod_rewriteルールなど)に頼るのではなく、可能な限りデータベースに近いSQLインジェクションを防ぐ必要があります。この点については、PDOでのバインドされたパラメータの使用を強くお勧めします。 – Schwartzie

答えて

2

$stmt->bindParam(およびbindValue、および一般にprepared statements)は、SQLインジェクションに対して安全です。すべての深刻なSBフレームワークは、クエリにパラメータを追加する方法をサポートし、そのように追加された値はサニタイズされます。常にそれを行い、 変数 のデータを(コメントを参照)から手動でSQLクエリ文字列に挿入しないでください。

それでもXSS注射の問題は残されていますが、それは見逃しやすい(危険性は低いですが)。それらを避けるには、常にhtmlspecialchars($var,ENT_QUOTES)(または、コンテキストに応じてurlencode)を必ず使用してください。

+0

しかし、ときどき変数に1つまたは2つをクエリに直接追加する必要があります。そのような場合には、ただそれを禁止するのではなく、武装させる方が良いでしょう。 –

+0

私は原則として、それが定数であるか、そうでなければ明らかにユーザーが妥協しない限り、避けるでしょう。コードが安全であることは十分ではありません。それは*見て*安全です。偶発的なスリップアップの可能性をはるかに小さくします。 – Tgr

+0

だから、それを答えに追加するか、少なくともあなたがデータだけを話していることを言及することをお勧めします。プリペアドステートメントはデータのみを保護することができ、他のクエリの部分には役立ちません。 –

0

PDOは自動的ので、あなたがちょうどあなたがregister_globalsmagic_quotesがオフになって、常にあなたのクエリにbindParamを使用していることを確認してください、[OK]をする必要があり'のような文字をエスケープします。

ダイナミックURLを作成する場合は、とにかく'文字を使用しないでください。私はいつも使用します:

$str = preg_replace("([^0-9a-zA-Z\-])", "", $str); 

文字列から0-9、a-zまたはダッシュ以外のものを削除します。

+0

私はまだstrip_tags(trim( "..."))を使用してください、あなたの答えをありがとう私はPDOクラスを使用している場合? – vitto

+0

実際、PDOは何もエスケープしません。少なくとも互換モードではありません。それは別のメカニズムを使用します –

関連する問題