2

要求された他のスクリプトをフェッチする「go」スクリプトが1つあります。これは、ユーザー入力をサニタイズするために作成したものです。

foreach ($_REQUEST as $key => $value){
    if (get_magic_quotes_gpc()) 
    $_REQUEST[$key] = mysql_real_escape_string(stripslashes($value));  
    else
    $_REQUEST[$key] = mysql_real_escape_string($value); 
}

私は他の誰もこのアプローチを使用しているのを見たことがありません。そうしない理由はありますか?

編集-配列で機能するように修正されました:

function mysql_escape($thing) {
  if (is_array($thing)) {
    $escaped = array();
    foreach ($thing as $key => $value) {
      $escaped[$key] = mysql_escape($value);
    }          
    return $escaped;
  }
  // else
  if (get_magic_quotes_gpc()) $thing = stripslashes($thing);
  return mysql_real_escape_string($thing);
}

foreach ($_REQUEST as $key => $value){
    $_REQUEST[$key] = mysql_escape($value); 
}
4

5 に答える 5

9

途中ではなく、使用時にデータをエスケープする方がはるかに良いと思います。そのデータをJSON、XML、シェル、MySQL、Curl、またはHTMLで使用すると、それぞれに独自の方法があります。データをエスケープします。


さまざまな状況でエスケープが必要な理由を簡単に確認しましょう。

引用符で区切られた文字列を使用している場合は、引用符をエスケープできる必要があります。xmlを使用している場合は、「コンテンツ」を「マークアップ」から分離する必要があります。SQLを使用している場合は、「コマンド」を「データ」から分離する必要があります。コマンドラインを使用している場合は、「コマンド」を分離する必要があります。 「データ」から

これは、一般的なコンピューティングの非常に基本的な側面です。データを区切る構文はDATA内で発生する可能性があるため、DATAをSYNTAXと区別する方法が必要であり、したがってエスケープする必要があります。

Webプログラミングでは、一般的なエスケープケースは次のとおりです。1。テキストをHTMLに出力する2.データをHTML属性に出力する3.HTMLをHTMLに出力する4.データをJavascriptに挿入する5.データをSQLに挿入する6.データをシェルコマンドに挿入する

正しく処理されない場合、それぞれに異なるセキュリティ上の影響があります。これは本当に重要です!PHPのコンテキストでこれを確認しましょう:

  1. HTMLへのテキスト:htmlspecialchars(...)

  2. HTML属性へのデータhtmlspecialchars(...、ENT_QUOTES)

  3. HTMLからHTMLへHTMLPurifierなどのライブラリを使用して、有効なタグのみが存在することを確認します。

  4. 私が好むJavascriptへのデータjson_encode。属性に配置する場合でも、次のような#2を使用する必要があります。

  5. SQLへのデータの挿入各ドライバーには、ある種のescape()関数があります。最高です。通常のlatin1文字セットで実行している場合は、addslashes(...)が適しています。addlashes()呼び出しの周りの引用符を忘れないでください。

    "INSERT INTO table1 SET field1='"。addlashes($ data)。"'"

  6. コマンドラインのデータescapeshellarg()およびescapeshellcmd()-マニュアルを読む

-これらを心に留めてください。そうすれば、一般的なWebセキュリティリスクの95%*を排除できます。(*推測)

于 2009-11-28T06:52:19.760 に答える
3

配列が含まれている場合、$_REQUESTそれらの値はサニタイズされません。

于 2009-11-28T06:55:25.263 に答える
3

私はこれを作成して使用しました:

<?php
function _clean($var){
    $pattern = array("/0x27/","/%0a/","/%0A/","/%0d/","/%0D/","/0x3a/",
                     "/union/i","/concat/i","/delete/i","/truncate/i","/alter/i","/information_schema/i",
                     "/unhex/i","/load_file/i","/outfile/i","/0xbf27/");
    $value = addslashes(preg_replace($pattern, "", $var));
    return $value;
}

if(isset($_GET)){
    foreach($_GET as $k => $v){
        $_GET[$k] = _clean($v);
    }
}

if(isset($_POST)){
    foreach($_POST as $k => $v){
        $_POST[$k] = _clean($v);
    }
}
?>
于 2010-06-07T09:19:14.563 に答える
2

あなたのアプローチは、データベースに挿入するためにすべてのリクエストデータをサニタイズしようとしますが、それを出力したいだけの場合はどうでしょうか。出力には不要な円記号が含まれます。また、エスケープは、とにかくSQL例外から保護するための良い戦略ではありません。パラメータ化されたクエリ(PDOやMySQLiなど)を使用することで、エスケープの問題を抽象化レイヤーに「渡す」ことができます。

于 2009-11-28T06:54:04.150 に答える
2

配列への再帰の欠如と、たとえば整数の不必要なエスケープは別として、このアプローチは、サニタイズの前にSQLステートメントで使用するためにデータをエンコードします。mysql_real_escape_string()データをエスケープしますが、サニタイズしません。エスケープとサニタイズは同じではありません。

サニタイズは、多くのPHPスクリプトが、入力データを使用する前に受け入れ可能かどうかを精査するタスクです。これは、エスケープされていないデータに対して行う方がよいと思います。私は通常、SQLに入るまでデータをエスケープしません。プリペアドステートメントを使用することを好む人は、同じ方法で同じことを達成します。

もう1つ、入力データにutf8文字列を含めることができる場合は、エスケープする前にこれらを検証する必要があるようです。消毒する前に、$_POSTで再帰的なutf8クリーナーをよく使用します。

于 2009-11-28T16:02:11.823 に答える