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%正确。准备好的发言是对此唯一全面的答复。