传递数字变量并阻止SQL注入

时间:2012-01-29 05:46:38

标签: php sql sql-injection validation

我有这样的查询:

SELECT name FROM mytable WHERE id = $id

其中$id来自用户。 我为输入变量添加了斜线。 仅使用(int)$id来阻止SQL注入是否足够?或者,在将$id传递给查询之前,我是否必须先检查is_numeric

编辑:脚本语言是PHP。

4 个答案:

答案 0 :(得分:6)

是的,使用(int)intval()投射变量将确保结果只是一个数字,并且没有其他字符。这是防御SQL注入攻击的好方法,但它当然只适用于数值变量。

有关SQL注入防御方法的更多详细信息,请参阅我的演示文稿SQL Injection Myths and Fallacies或我的书SQL Antipatterns: Avoiding the Pitfalls of Database Programming中的章节。

答案 1 :(得分:3)

我放弃了解决如何安全地在查询字符串中附加数字的想法,而只是转向始终使用预准备语句的想法。它们写起来更加冗长乏味,但它们更安全 - 如果你养成这种习惯,你就不必担心你是否在这种情况下做得对,或许有时这是一个数字,其他时候它是一个字符串,你使用正确的转义机制吗?

答案 2 :(得分:2)

请求$ id是一个整数,是否等于或大于0.否则用户输入注入尝试很可能正在发挥作用。

示例:

$ id =(false!==(int)$ _ GET ['id']> = 0)? (int)$ _ GET ['id']:die(header(“Location:./ index.php”));

答案 3 :(得分:-3)

function mysql_prep( $value ) {
    $magic_quotes_active = get_magic_quotes_gpc();
    $new_enough_php = function_exists( "mysql_real_escape_string" ); // i.e. PHP >= v4.3.0
    if( $new_enough_php ) { // PHP v4.3.0 or higher
        // undo any magic quote effects so mysql_real_escape_string can do the work
        if( $magic_quotes_active ) { $value = stripslashes( $value ); }
        $value = mysql_real_escape_string( $value );
    } else { // before PHP v4.3.0
        // if magic quotes aren't already on then add slashes manually
        if( !$magic_quotes_active ) { $value = addslashes( $value ); }
        // if magic quotes are active, then the slashes already exist
    }
    return $value;
}   

$username = trim(mysql_prep($_POST['username']));   

使用该功能是安全的! :d