いhtmlspecialcharsとmysql_real_escape_string守るPHPのコードからの注射
-
02-07-2019 - |
質問
前の今日という問に関して 入力の検証戦略のwebアプリ.
トップ答時間の書面に対応するものとして提示することに PHP
だけを使用 htmlspecialchars
や mysql_real_escape_string
.
私の質問はこのずれやすくないでしょうか?がありますか。がこれらの機能休みは、下記のうちどれですか。
解決
ではデータベースのクエリーのようにしてい用意parameterisedます。の mysqli
や PDO
図書館を支援す。これは無限により脱出などの機能を mysql_real_escape_string
.
あり mysql_real_escape_string
が効果的にただの文字列が逃げます。な魔法の弾です。●すべてまたは脱出の危険な文字にするためにできる安全に使用単一クエリ文字列です。しかし、ない場合はsanitiseご入力前に、その脆弱性が存在します。特定の攻撃ベクトル.
想像以下のSQL:
$result = "SELECT fields FROM table WHERE id = ".mysql_real_escape_string($_POST['id']);
対応することができるでしょうを見ることが脆弱なを.
想像の id
に含まれるパラメータの一般的な攻撃ベクトル:
1 OR 1=1
が危険な文字数がコード化し、そのまっすぐ通に逃げます。な:
SELECT fields FROM table WHERE id= 1 OR 1=1
でもSQLインジェクションベクターによって攻撃者が返還すべてにされています。または
1 or is_admin=1 order by id limit 1
を生み出す
SELECT fields FROM table WHERE id=1 or is_admin=1 order by id limit 1
できることで攻撃者の最初の管理者の詳細につきましては、この架空の例です。
ながらこれらの機能を有、使用する必要がある。することを確実にしなければならなすべてのウェブ入力が検証される少が下げ止まりつつあります。この場合には、それまで活用できるのではないていることを確認する変数を使用していました数値として、実際の数値配列となる。PHPば幅広く使用の機能をチェックが入力整数、浮き、英数字等ったものであり、それをSQLでは、耳ものの価値はます。上記のコードされてい安心あった場合は、準備書にはデータベース機能が知られてい 1 OR 1=1
は有効なリテラルです。
として htmlspecialchars()
.ことになるminefield。
が現実問題としてはPHPで全体の選択は異なるhtmlの関連逃げ機能の明確な指導を行う機能だいてどのようにお考えですか。
まず、場内のHTMLタグは、実際のトラブルが。見
echo '<img src= "' . htmlspecialchars($_GET['imagesrc']) . '" />';
いていてドキュメントを編集するには、タグではないと思います < 以上のような危険です。当社の攻撃ベクトルができ javascript:alert(document.cookie)
今の結果はHTMLのように見え
<img src= "javascript:alert(document.cookie)" />
攻撃が直進します。
れが悪くなることがあります。なぜですか?ので htmlspecialchars
(呼び出された場合このようにのみコードをダブルクォートしないシングルです。場しました
echo "<img src= '" . htmlspecialchars($_GET['imagesrc']) . ". />";
当社の悪攻撃者が現在入また全く新しいパラメータ
pic.png' onclick='location.href=xxx' onmouseover='...
私
<img src='pic.png' onclick='location.href=xxx' onmouseover='...' />
この場合、人数に制限はありません、すぐにsantiseを入力します。っている場合、フィルターの出は悪い文字をまず失敗します。取whitelist組みを通じての文字数である。の クロスサイト-スクリプティングチートシート 例えばどのように多様なベクターでき
ご利用の場合でも htmlspecialchars($string)
外部のHTMLタグ、まだ脆弱であるマルチバイト文字セットパロアルトネットワークス.
最も効果的なまでの利用を組み合わせmb_convert_encodingとhtmlentitiesとしております。
$str = mb_convert_encoding($str, 'UTF-8', 'UTF-8');
$str = htmlentities($str, ENT_QUOTES, 'UTF-8');
でもこの葉IE6脆弱なので、取り扱い方をUTF.しかし、バックは、限られたエンコードなど、ISO-8859-1でIE6の使用が減少。
より深い研究にマルチバイトの問題、 https://stackoverflow.com/a/12118602/1820
他のヒント
のほか、Cheekysoftの優れた答え:
- になっているので使用した安全なものだけを使用は絶対に正しく使用して正しく使うものがなお脆弱性を抱えたものであるとしていてもよいその他の問題(例えばデータの破損)
- ご利用くださいparameterisedのクエリではなくて述べます。利用できるよ例PDOまたはラッパーのよう梨DB
- いmagic_quotes_gpcとmagic_quotes_runtimeはoffになり、この偶発的にonになっています。これらを早期に深く間違った方向に誘導されたこちらをクリックするとPHPの開発を防ぐセキュリティ上の問題を破壊データ)
がんの新し防止のためのHTMLインジェクション(例えばクロスサイトスクリプティング)ですが、実現できるのでより簡単に使用している場合は、図書館または孔のシステム出力します。読ドキュメンテーションにするための脱出方法も適切に表す
HTMLにおける、エスケープする必要はありによって異なる。この文字列に配置されます。
思いのだが、今ではもうほとんどの小さなものを追加わせCheekysoftの答えは、具体的には:
そのデータベースクエリ、 ようにしてい利用準備 parameterisedます。のmysqliと PDO図書館を支援す。この 無限により脱出 などの機能を mysql_real_escape_string.
あmysql_real_escape_stringは 効果的にただの文字列の脱出 機能です。な魔法の弾です。●すべてまたは脱出の危険 文字を可能にすること 使用単一クエリ文字列です。しかし、ない場合はsanitiseお 入力前に、その 脆弱であるパロアルトネットワークス.
想像以下のSQL:
$result="SELECT分野からテーブル WHERE id= ".mysql_real_escape_string($_POST['id']);
対応することができるでしょうめいこ 脆弱なを.想像のid に含まれるパラメータの攻撃 ベクトル:
1または1=1
が危険な文字数である エンコードでパスを直進 を通じて逃げます。退 :
選択分野からテーブルid=1 1=1
私はコードまで、迅速に少しの機能に込めた私のデータベースのクラスとしてもイマイチ。このpreg_replace、prob少を最適化機能することが明らかピンチ...
function Numbers($input) {
$input = preg_replace("/[^0-9]/","", $input);
if($input == '') $input = 0;
return $input;
}
その代わりに
$result="SELECT分野からテーブルid=".mysqlrealescapestring("1または1=1");
混雑して待たされること
$result="SELECT分野からテーブルid=".数字("1または1=1");
での安全走行のクエリ
選択分野からテーブルid=111
いることもで表示するに正しい行があまりないと思いますようとっても大きな問題となだれようとしていsql注入にお;)
重要なのはこのパズルはコンテキストを共有します。いで送信"1または1=1のIDがない場合は問題などを引用すべ引検索:
SELECT fields FROM table WHERE id='".mysql_real_escape_string($_GET['id'])."'"
る結果、このように表示されます:
SELECT fields FROM table WHERE id='1 OR 1=1'
するあらゆ.からだを逃れて文字列を入力できない、文字列コンテキスト私はこの試験など版5.0.45のMySQLを使用、文字列コンテキスト整数カラムはな影響を与えることはありません。
$result = "SELECT fields FROM table WHERE id = ".(INT) $_GET['id'];
作品は、より良い64ビットのシステム。注のシステムの限界への対応に関する多くのものが、データベースのidをこの作品を大99%の時間を。
使用単一の機能-清掃方法お値です。場合でもこの機能はただのラッパーのためのmysql_real_escape_string().なぜですか?いつの日時にお好きな清掃法を用いてクリーニングデータが見つかっただけ更新するとともに一つの場所ではなく、システム全体の見取り外して交換できます。
なぜ、なぜいただけますでしょう ない などのクオートで囲のユーザー入力におsql。うしゃない!を含む引用符にsql文像"1または1=1"のfruitless試いもんです。
そんなまえ"の場合はユーザーを含む引用符(またはダブルクォート)です。
やすい問題の修正る:けを削除ユーザー入力います。例: input =~ s/'//g;
.今となっているように思いそのユーザー入力が確保される...