我遇到了一群黑客的麻烦。他们几次攻击我客户的网站,我的客户更生气:(我的客户丢失了他的数据库(有数百条记录),并且不得不输入所有:(
现在我正在进行更多介绍;
正在处理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']]
答案 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)
用户输入的两个最重要的事情是
输入过滤是转换数据/ [之前] /它存储在数据库中的过程。执行mysql_real_escape_string()
属于此步骤(尽管有更好的方法可以清理数据库插入的用户数据),但此步骤还可以包括修剪空白区域,亵渎过滤,标记转换等。
输出转义在将用户内容发送到您不允许恶意行为的浏览器时要小心。这意味着执行htmlentities()
或其他一些选择性筛选过程。
您还可以执行其他操作,例如资源限制(DOS预防),表单令牌(CSRF保护)等。转到OWASP并开始阅读。
答案 2 :(得分:3)
Web开发的黄金法则之一是永远(永远!)信任用户输入。因此,只要有数据进入数据库,就应该调用mysql_real_escape_string()。
此外,为了防止将来生气的客户,您应该定期备份您的数据库。如果我是你的客户,我现在会非常愤怒。
祝您网站安全。
答案 3 :(得分:3)
防止SQL注入的最佳方法是使用预准备语句和绑定变量。您使用的是哪个版本的MySQL?准备好的声明可在4.1及更高版本中获得。