在哪里使用mysql_real_escape_string来阻止SQL注入?

时间:2010-02-22 15:50:02

标签: php mysql security sql-injection

我遇到了一群黑客的麻烦。他们几次攻击我客户的网站,我的客户更生气:(我的客户丢失了他的数据库(有数百条记录),并且不得不输入所有:(

现在我正在进行更多介绍;

  • 修复了文件权限
  • 更改了ftp和主机登录信息
  • 清除了所有远程mysql访问

正在处理SQL注入问题。我将mysql_real_escape_string添加到管理面板登录参数。那么我应该在哪里使用这个mysql_real_escape_string呢?我在网站上的电子邮件表格很少,我不认为我需要添加...

我有一个index.php作为主页。我是否应该为此页面执行任何操作以防止通过index.php?somesql=等网址进行任何sql注入攻击?

请告诉我!我很感激!!! :(


例如:

我有这样的代码;

public function showDetails($id) {

    // SQL Jobs Details
    $this->sql_job = "SELECT * FROM jobs WHERE id=".mysql_real_escape_string($id);
    $this->rst_job = mysql_query($this->sql_job);           
    $this->row_all = mysql_fetch_assoc($this->rst_job);     

    // SQL State
    $this->sql_state = "SELECT title FROM state WHERE id=" . $this->row_all[$this->tbl_jobs['f4']];
    $this->rst_state = mysql_query($this->sql_state);   
    $this->row_state = mysql_fetch_assoc($this->rst_state);
........

将$ mysql_real_escape_string用于$ id就足够了。不是$ this-> row_all [$ this-> tbl_jobs ['f4']]

4 个答案:

答案 0 :(得分:13)

基本上,每次你使用一些不安全的数据(用户输入,数据库,文件或外部网站的价值,即你不是 100%的任何数据确保它是安全的)在SQL查询中,您应该使用mysql_real_escape_string对其进行转义。请注意according to OWASP,此函数对于转义动态表名称是不安全的(但这远不如“基本”用户输入插入那么常见)。

我建议您查看整个OWASP article on SQL injection,并浏览网站的其余部分。它是有关Web应用程序安全性的重要信息来源。

IMO,防止SQL注入的首选方法是使用prepared statements

请记住,如果您确实选择使用mysql_real_escape_string(),那么它只适用于 在由引号分隔的字符串中使用。永远不要使用它 任何不带引号的值。这包括数值;相反,验证用户输入实际上是数字。

答案 1 :(得分:4)

用户输入的两个最重要的事情是

  1. 输入过滤
  2. 输出转义
  3. 输入过滤是转换数据/ [之前] /它存储在数据库中的过程。执行mysql_real_escape_string()属于此步骤(尽管有更好的方法可以清理数据库插入的用户数据),但此步骤还可以包括修剪空白区域,亵渎过滤,标记转换等。

    输出转义在将用户内容发送到您不允许恶意行为的浏览器时要小心。这意味着执行htmlentities()或其他一些选择性筛选过程。

    您还可以执行其他操作,例如资源限制(DOS预防),表单令牌(CSRF保护)等。转到OWASP并开始阅读。

答案 2 :(得分:3)

Web开发的黄金法则之一是永远(永远!)信任用户输入。因此,只要有数据进入数据库,就应该调用mysql_real_escape_string()。

此外,为了防止将来生气的客户,您应该定期备份您的数据库。如果我是你的客户,我现在会非常愤怒。

祝您网站安全。

答案 3 :(得分:3)

防止SQL注入的最佳方法是使用预准备语句和绑定变量。您使用的是哪个版本的MySQL?准备好的声明可在4.1及更高版本中获得。