繁体   English   中英

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

[英]Where to use mysql_real_escape_string to prevent SQL Injection?

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

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

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

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

我有一个index.php作为主页。 我是否应该为此页面做任何事情以防止任何sql注入攻击通过url如index.php?somesql=

请建议我! 我很感激!!! :(


例如:

我有这样的代码;

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']]

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

我建议你看一下关于SQL注入的整篇OWASP文章 ,还要浏览网站的其他部分。 它是有关Web应用程序安全性的重要信息来源。

IMO,防止SQL注入的首选方法是使用预准备语句

请记住,如果您确实选择使用mysql_real_escape_string()它只能在由引号分隔的字符串中使用时才有效。 切勿在任何未引用的值上使用它。 这包括数值; 相反,验证用户输入实际上是数字。

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

  1. 输入过滤
  2. 输出转义

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

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

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

Web开发的黄金法则之一是永远(永远!)信任用户输入。 因此,在数据进入数据库的任何地方,都应该调用mysql_real_escape_string()。

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

祝你的网站安全。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM