13

私はコーディングと 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;
}
4

4 に答える 4

18

このスクリプトにはいくつかの優れた機能がありますが、サニタイズはうまくいきません!

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

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

  • 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;

于 2011-05-02T23:24:17.197 に答える
10

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

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

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

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

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

于 2011-05-02T23:41:55.927 に答える
7

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

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

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

于 2011-05-02T23:25:43.863 に答える
4

悪くない。

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

于 2011-05-02T23:20:46.777 に答える