Php 传递数值变量并防止SQL注入

Php 传递数值变量并防止SQL注入,php,sql,sql-injection,validation,Php,Sql,Sql Injection,Validation,我有这样一个问题: SELECT name FROM mytable WHERE id = $id 其中,$id由用户提供。 我确实为输入变量添加了斜线。 仅使用(int)$id来阻止SQL注入是否足够?或者,在将其传递到查询之前,我是否必须使用is\u numeric检查$id 编辑:脚本语言是PHP function mysql_prep( $value ) { $magic_quotes_active = get_magic_quotes_gpc(); $new_enou

我有这样一个问题:

SELECT name FROM mytable WHERE id = $id
其中,
$id
由用户提供。 我确实为输入变量添加了斜线。 仅使用
(int)$id
来阻止SQL注入是否足够?或者,在将其传递到查询之前,我是否必须使用
is\u numeric
检查
$id

编辑:脚本语言是PHP

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

是,使用
(int)
intval()
强制转换变量将确保其结果仅为一个数字,没有其他字符。这是抵御SQL注入攻击的好方法,但它当然只适用于数值变量


有关SQL注入防御方法的更多详细信息,请参阅我的演示文稿或我书中的章节。

询问$id是否为整数,是否等于或大于0。否则,用户输入注入尝试很可能会起作用

例如:


$id=(false!==(int)$\u GET['id']>=0)?(int)$_GET['id']:die(标题(“Location:./index.php”)

我不再考虑如何安全地将数字附加到查询字符串中,而是继续考虑始终使用准备好的语句。它们写起来更加冗长乏味,但更安全——如果你养成了这种习惯,你就不必担心在这种或那种情况下是否正确,有时可能是数字,有时是字符串,你是否使用了正确的转义机制?

我建议在传递的值上加0,以确保它是数字的。可能
$value=$id+0
,然后将
$value
传递给查询。当您希望用户的原始数据是数字时,确保其不被视为字符串的任何操作。顺便说一句,添加斜杠对该变量没有帮助。任何人都可以猜测,当参数应该是数字时,这有多大帮助,这正是用户所问的问题?当参数用作数值时,不需要对其进行转义…数值??Sql注入不能通过输入数字来完成!这可以通过输入易受攻击的字符串而不是数字来完成。这是函数处理的。用户特别要求SQL注入,这就是为什么此函数有帮助。提交的参数用作数字。如果将此类参数连接到查询,并且提交的值不仅是一个数字,而且是一个sql命令,则解决方案不会保护该参数。在此处插入此命令不需要引号,因为参数的使用方式与数字相同。true!但我的代码有助于从整体上防止SQL注入。我想担心SQL注入中的数字是微不足道的。是的,我同意。数字输入不需要引号。如果OP发布了关于SQL注入的文章,那么您的代码就不能防止SQL注入。在这种情况下,它会转义执行SQL注入根本不需要的某些字符。在这种情况下,OP需要确保提交的数据是数字的,以防止注入。在这种情况下,转义符/引号是不相关的。完全正确,100%正确。准备好的发言是对此唯一全面的答复。