在PHP中清理发往数据库的用户输入

时间:2009-06-05 17:03:23

标签: php sql-injection code-injection sanitization sanitize

我有这段代码:

$query = "select id from votes where username = '$user' and article_id  = $this->id";

我尝试使用此代码来清理它:

$query = sprintf("select id from votes where username = '$user' and article_id = $this->id", 
    mysql_real_escape_string($user), 
    mysql_real_escape_string($password));

但我收到了mysql_real_escape行的错误:

Warning: mysql_real_escape_string() [function.mysql-real-escape-string]: Access denied for user 'mexautos'@'localhost' (using password: NO) in /home/mexautos/public_html/kiubbo/data/article.php on line 145 Warning: mysql_real_escape_string() [function.mysql-real-escape-string]: A link to the server could not be established in /home/mexautos/public_html/kiubbo/data/article.php on line 145 Warning: mysql_real_escape_string() [function.mysql-real-escape-string]: Access denied for user 'mexautos'@'localhost' (using password: NO) in /home/mexautos/public_html/kiubbo/data/article.php on line 146 Warning: mysql_real_escape_string() [function.mysql-real-escape-string]: A link to the server could not be established in /home/mexautos/public_html/kiubbo/data/article.php on line 146

我在这里得到了用户名,我不知道它是否足够安全:

function getUsername(){ return $this->username; }

THX

7 个答案:

答案 0 :(得分:8)

在使用mysql_real_escape_string之前,您需要一个mysql连接。

答案 1 :(得分:7)

我建议使用prepared statements代替sprintf

答案 2 :(得分:3)

不确定这是否是导致您出现问题的原因,但我相信您的sprintf语句中的变量不应该是'$ user'和'$ this-> id',但它们应该是'%s'

http://us2.php.net/sprintf

答案 3 :(得分:3)

  

警告:mysql_real_escape_string()   [function.mysql实时逃逸字符串]:   用户拒绝访问   'mexautos'@'localhost'(使用   密码:否)

     

警告:mysql_real_escape_string()   [function.mysql-real-escape-string]:A   链接到服务器不能   建立

您检查了链接吗?它活跃吗?您需要先连接才能使用mysql_real_escape_string() 你不忘记设置密码吗?

尝试:

mysql -u mexautos -p

(如果没有密码则输入Enter)

另外,请查看您的sprintf()功能,您需要使用%s来绑定您的变量

$a = 'Foo';
$b = 'Bar';
$foo = sprintf('Foo Bar %s %s', $a, $b);

答案 4 :(得分:2)

您需要连接才能使用mysql_real_escape_string(),因为它使用服务器的编码类型来帮助缩小。

sprintf()也应该看起来像这样

$query = sprintf("SELECT id FROM votes WHERE username = '%s' and article_id = %d", 
    mysql_real_escape_string($user), 
    mysql_real_escape_string($password));

答案 5 :(得分:1)

我建议使用像Zend_Db这样的成熟数据库抽象层(其中有很多)。实施自己的自制软件解决方案并不是我为生产系统推荐的。

答案 6 :(得分:0)

就像其他人说的那样,不是'$ user'而是'%s',你需要一个开放的连接。

@Tomalak sprintf更快 - 这就是使用它的原因 - 它是一个原生的C函数。