web-dev-qa-db-ja.com

PHPデータのサニタイズ

私はコーディングの世界に慣れていないので、PHPしたがって、フォームデータをサニタイズして、不正な形式のページやコードインジェクションなどを回避するための最良の方法を学びたいと思います。以下で見つけたサンプルスクリプトです。良い例ですか?

もともと投稿されたコード http://codeassembly.com/How-to-sanitize-your-php-input/

/**
 * Sanitize only one variable .
 * Returns the variable sanitized according to the desired type or true/false 
 * for certain data types if the variable does not correspond to the given data type.
 * 
 * NOTE: True/False is returned only for telephone, pin, id_card data types
 *
 * @param mixed The variable itself
 * @param string A string containing the desired variable type
 * @return The sanitized variable or true/false
 */

function sanitizeOne($var, $type)
{       
    switch ( $type ) {
    case 'int': // integer
        $var = (int) $var;
        break;

    case 'str': // trim string
        $var = trim ( $var );
        break;

    case 'nohtml': // trim string, no HTML allowed
        $var = htmlentities ( trim ( $var ), ENT_QUOTES );
        break;

    case 'plain': // trim string, no HTML allowed, plain text
        $var =  htmlentities ( trim ( $var ) , ENT_NOQUOTES )  ;
        break;

    case 'upper_Word': // trim string, upper case words
        $var = ucwords ( strtolower ( trim ( $var ) ) );
        break;

    case 'ucfirst': // trim string, upper case first Word
        $var = ucfirst ( strtolower ( trim ( $var ) ) );
        break;

    case 'lower': // trim string, lower case words
        $var = strtolower ( trim ( $var ) );
        break;

    case 'urle': // trim string, url encoded
        $var = urlencode ( trim ( $var ) );
        break;

    case 'trim_urle': // trim string, url decoded
        $var = urldecode ( trim ( $var ) );
        break;

    case 'telephone': // True/False for a telephone number
        $size = strlen ($var) ;
        for ($x=0;$x<$size;$x++)
        {
            if ( ! ( ( ctype_digit($var[$x] ) || ($var[$x]=='+') || ($var[$x]=='*') || ($var[$x]=='p')) ) )
            {
                return false;
            }
        }
        return true;
        break;

    case 'pin': // True/False for a PIN
        if ( (strlen($var) != 13) || (ctype_digit($var)!=true) )
        {
            return false;
        }
        return true;
        break;

    case 'id_card': // True/False for an ID CARD
        if ( (ctype_alpha( substr( $var , 0 , 2) ) != true ) || (ctype_digit( substr( $var , 2 , 6) ) != true ) || ( strlen($var) != 8))
        {
            return false;
        }
        return true;
        break;

    case 'sql': // True/False if the given string is SQL injection safe
        //  insert code here, I usually use ADODB -> qstr() but depending on your needs you can use mysql_real_escape();
        return mysql_real_escape_string($var);
        break;
    }       
    return $var;
}
13
PeanutsMonkey

あなたのサンプルスクリプトは素晴らしいものではありません-いわゆる文字列のサニタイズは、両端の空白を削除するだけです。それに頼ると、すぐに多くのトラブルに巻き込まれます。

ワンサイズですべてのソリューションに対応できるわけではありません。アプリケーションに適切なサニタイズを適用する必要があります。これは、必要な入力とそれが使用されている場所に完全に依存します。また、どのような場合でも、複数のレベルでサニタイズする必要があります。ほとんどの場合、データを受信したとき、データを保存したとき、場合によってはレンダリングしたときにです。

読む価値がある、重複の可能性:

PHPでユーザー入力をサニタイズするための最良の方法は何ですか?

PHPのクリーンで安全な文字列

10
Oliver Emberton

そのスクリプトにはいくつかの素晴らしい機能がありますが、サニタイズにはうまくいきません!

必要なもの(および受け入れたいもの)に応じて、次のものを使用できます。

  • abs() 正の数の場合(浮動小数点数も受け入れることに注意してください

  • _preg_replace_ _('/[^a-zA-Z0-9 .-]/','',$var)_は文字列から特殊文字を削除するか、preg_replace('/\D/','',$var)は数字以外のすべての文字を削除します

  • _ctype_* functions_ 例: ctype_digit($var)

  • filter_var() および filter_input() 関数

  • 型キャスト 例: _(int)$_GET['id']_

  • 変換します。 _$id=$_GET['id']+0;_

18
CSᵠ

原則として、PHP&MySQLを使用している場合は、次のようにMySQLに入るデータをサニタイズする必要があります。

$something = mysql_real_escape_string($_POST['your_form_data']);

http://php.net/manual/en/function.mysql-real-escape-string.php

7
David

悪くない。

SQLの場合、PDOを使用してパラメーターをクエリに挿入することにより、シナリオを危険にさらす必要性をまったく回避するのが最善です。