PHP 清理数据

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/5863508/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-25 22:43:42  来源:igfitidea点击:

PHP Sanitize Data

phpsanitize

提问by PeanutsMonkey

I am new to the world of coding and PHP hence would like to learn what's the best way to sanitize form data to avoid malformed pages, code injections and the like. Is the sample script I found below a good example?

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

Code originally posted at http://codeassembly.com/How-to-sanitize-your-php-input/

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

采纳答案by Oliver Emberton

Your example script isn't great - the so called sanitisation of a string just trims whitespace off each end. Relying on that would get you in a lot of trouble fast.

您的示例脚本不是很好 - 所谓的字符串消毒只是修剪每一端的空格。依赖它会让你很快陷入很多麻烦。

There isn't a one size fits all solution. You need to apply the right sanitisation for your application, which will completely depend on what input you need and where it's being used. And you should sanitise at multiple levels in any case - most likely when you receive data, when you store it and possibly when you render it.

没有一刀切的解决方案。您需要为您的应用程序应用正确的清理,这将完全取决于您需要什么输入以及它在何处使用。在任何情况下,您都应该在多个级别进行消毒 - 最有可能是在您接收数据、存储数据以及渲染数据时。

Worth reading, possible dupes:

值得一读,可能的骗局:

What's the best method for sanitizing user input with PHP?

使用 PHP 清理用户输入的最佳方法是什么?

Clean & Safe string in PHP

PHP 中的清洁和安全字符串

回答by CS?

That script has some nice functions but it doesn't do a good job at sanitizing!

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

Depending on what you need (and want to accept) you can use:

根据您的需要(并希望接受),您可以使用:

  • abs()for positive numbers (note that it accepts floats also)

  • preg_replace('/[^a-zA-Z0-9 .-]/','',$var)for cleaning out any special characters from strings or preg_replace('/\D/','',$var)to remove all non-digit characters

  • ctype_* functionseg. ctype_digit($var)

  • filter_var()and filter_input()functions

  • type-casteg. (int)$_GET['id']

  • convert eg. $id=$_GET['id']+0;

回答by David

As a general rule if you are using PHP & MySQL you will want to sanitize data going into MySQL like so:

作为一般规则,如果您使用 PHP 和 MySQL,您需要像这样清理进入 MySQL 的数据:

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

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

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

回答by Lightness Races in Orbit

It's not bad.

不算太差。

For SQL, it'd be best to avoid the need to risk the scenario at all, by using PDO to insert parameters into your queries.

对于 SQL,最好通过使用 PDO 将参数插入到您的查询中来完全避免需要冒险的场景。