PHP 清理数据

标签 php sanitize

我是编码和 PHP 领域的新手,因此想了解清理表单数据以避免页面格式错误、代码注入(inject)等的最佳方法。我在下面找到的示例脚本是一个很好的例子吗?

代码最初发布于 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;
}

最佳答案

该脚本有一些不错的功能,但它在清理方面做得不好!

根据您的需要(和想要接受的),您可以使用:

  • abs()对于正数(请注意它也接受 float )

  • preg_replace ('/[^a-zA-Z0-9 .-]/','',$var) 用于清除字符串中的任何特殊字符或 preg_replace('/\D/','',$var) 删除所有非数字字符

  • ctype_* functions例如。 ctype_digit($var)

  • filter_var()filter_input()功能

  • type-cast例如。 (int)$_GET['id']

  • 转换例如。 $id=$_GET['id']+0;

关于PHP 清理数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5863508/

相关文章:

php - 向多个设备发送推送消息

html - 如何清理除图像 url 之外的 html 字符串?

ruby-on-rails-4 - Rails 4.2 - 如何正确使用 rails sanitize 来防止跨脚本漏洞

C# 清理文件名

php - 使用 PHP post 函数时遇到奇怪的问题

php - 用户排名算法

php - php 上的超链接

php - 如何从公用文件夹中获取图像文件作为 Laravel 中的响应?

php - 通过 PHP 访问 Webmail

sql - 清理原始 sql 的帮助