2012-05-11 57 views
1

我有这样一行:SQL注入:这行是否安全?

$sql = "UPDATE votes SET up=up+1 WHERE id='{$p}'"; 

现在从我读过的SQL注入的一种方式是通过不“收”的SQL查询正确,它允许黑客添加额外的信息造成的。

所以我的问题是,这条线对我来说是安全的up=up+1还没有“封闭”,但如果我把它设置为这样up='up+1'这让我“关闭”它不起作用。

排队类型是int(11)如果这有什么区别。

更新:

$p被消毒与函数

function sanitize($foo) { 
if(get_magic_quotes_gpc() == true) { 
$foo = stripslashes($foo); 
} 
return mysql_real_escape_string(htmlspecialchars($foo)); 
} 
+1

这个声明对我来说看起来很安全,除非你只需要确保$ p在这个声明之前总是数字。 –

+2

千万不要消毒。逃逸。消毒取决于你是否知道每一种可能的攻击途径和专门针对它的过滤。任何时候发现新的攻击途径,你的功能都是没用的。转义处理所有攻击。 –

+1

如果您担心SQL注入攻击,那么您应该通过存储过程和视图来限制数据库访问。也就是说,特定的查询看起来非常安全,特别是因为$ p被函数检查。 –

回答

4

up=up+1不容易,因为它不通过可变接受用户输入。它只是增加数据库中已有的INT值。

WHERE id='{$p}'可以,是脆弱的,但如果变量$p没有正确过滤和转义,但是您在上面添加,它已经被函数消毒。希望sanitize函数能够检查变量的适当类型(无论是int还是string),并检查适当的边界。

一如既往,最安全的方法是使用预准备语句和参数化查询,而不是直接将任何变量传递给SQL字符串。大多数数据库API都可以在PHP中用于各种RDBMS的支持准备语句。 (然而,不是mysql_*()功能)。

+0

谢谢,就像我在op $ p中所说的,已经使用函数sanitize $(foo){ if(get_magic_quotes_gpc()== true) { $ foo = stripslashes($ foo); } return mysql_real_escape_string(htmlspecialchars($ foo)); }' –

1

这是不安全的,除非$p正确逃脱。否则想象......

$ P =“富 '; DROP TABLE票;选择' 1"

那么你最终执行类似:

UPDATE votes SET up=up+1 WHERE id='foo'; DROP TABLE votes; SELECT '1'; 

那会不会很漂亮......