我有这样的查询:
SELECT name FROM mytable WHERE id = $id
其中$id
来自用户。
我为输入变量添加了斜线。
仅使用(int)$id
来阻止SQL注入是否足够?或者,在将$id
传递给查询之前,我是否必须先检查is_numeric
?
编辑:脚本语言是PHP。
答案 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