1

我有这条线:

$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)); 
}
4

2 回答 2

4

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

但是,如果变量未正确过滤和转义,则可能很容易受到攻击,但WHERE id='{$p}' 正如$p您在上面添加的那样,它已被函数清理。希望 sanitize 函数能够检查变量的适当类型(无论是 int 还是 string 或其他)并检查它的适当边界。

与往常一样,最安全的方法是使用准备好的语句和参数化查询,而不是将任何变量直接传递到 SQL 字符串中。PHP 中用于各种 RDBMS 的大多数数据库 API 都支持预准备语句。(但值得注意的是,不是mysql_*()函数)。

于 2012-05-11T01:47:49.417 回答
1

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

$p = "foo'; DROP TABLE 投票;SELECT '1"

然后你最终会执行类似的东西:

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

那不会很漂亮...

于 2012-05-11T01:51:39.350 回答