需要一些重要提示: - 针对不同查询的SQL注入..

时间:2012-05-21 06:37:30

标签: php mysql sql cakephp-1.3

如何防止我的代码和sql架构从sql注入.. ??

我正在使用Php进行编码..

我有一些登录表格。我读了一些sql注入查询

string sql = "SELECT * FROM table_name WHERE smth='" + UserInput + "'";
ExecuteSql(sql);

SELECT fieldlist
  FROM table
 WHERE field = 'steve@unixwiz.net'';

我知道sql注入是因为我们的编码错误和从数据库中检索数据的错误查询...我做了一些谷歌从sql注入器安装我的项目,但我没有得到一些正确的信息..

我也使用了cakephp框架进行编码,我知道在cakephp sql注入非常困难,因为它清理查询..是真的吗?

我得到了这方面的信息: -

CakePHP already protects you against SQL Injection if you use CakePHP's ORM methods (such as find() and save()) and proper array notation (ie. array('field' => $value)) instead of raw SQL. For sanitization against XSS its generally better to save raw HTML in database without modification and sanitize at the time of output/display.

有人会指导我吗?

谢谢!!

4 个答案:

答案 0 :(得分:2)

任何输入都应该正确消毒以防止注射:

$UserInput = mysql_real_escape_string($_REQUEST['inputfield']);
$sql = "SELECT * FROM table_name WHERE smth='". $UserInput ."'";
ExecuteSql(sql);

您可以随时清理输入。如果你有一些实际的代码,那将有助于看到。只需应用函数" mysql_real_escape_string"在将其添加到查询之前的任何字符串。

更新:

我不是肯定的我正确地从你的评论中读到了这个,但这就是你的代码应该是这样的:

<?php 
$username = mysql_real_escape_string($_POST['username']); 
$password = mysql_real_escape_string($_POST['password']);
$query = "SELECT * FROM users WHERE user='".$username."' AND password='".$password."'";
echo $query;
if($result = mysql_query($query)) {
    // matching user + password found
    $row = mysql_fetch_assoc($result);
    print_r($row); //This will show you the results of the query.
}
else {
    // no matching user and password -- login not granted
    echo "you fail.";
}
?>

因为我添加了&#34; mysql_real_escape_string&#34;功能,字符如&#39;和&#34;将被转义,以便数据库不会将它们视为查询的一部分。

答案 1 :(得分:2)

@Learner专门讨论CakePHP框架中的查询,而不是一般注入(尽管知道这一点也很重要。

当CakePHP说

  

如果您使用CakePHP的ORM方法(例如find()和save())以及正确的数组表示法(即数组(&#39;字段&#39; =&gt;),CakePHP已经保护您免受SQL注入攻击; $ value))而不是原始SQL。对于XSS的清理,通常最好将原始HTML保存在数据库中而不进行修改,并在输出/显示时进行清理。

你需要做的就是它所说的。当您对数据库运行任意查询时,它不会保护您 - 它不能,因为您绕过CakePHP。当它确实保护你时,是通过框架运行的查询:

$result = $this->Article->find(
    'first', array(
    'conditions' => array('Article.id' => $articleIDtoFind)));

在此示例中,$articleIDtoFind来自哪里并不重要,查询是安全的。 (如果它充满了垃圾可能就行不通了)

答案 2 :(得分:1)

可能的sql注入方法之一是输入具有不同条件的数据。 例如:您的aboue查询可能会输入以下字符串。

 a' or '1=1

要避免此注入,您可以使用以下方法 1.mysql_real_escape_string();    例如:在执行查询之前

使用,      $的user_data = mysql_real_escape_string($的user_data); 2. addslashes()

eg : $user_data=addslashes($user_data)

答案 3 :(得分:-1)

没有方法是100%全面的,恕我直言。但是,清理输入以及正确处理表单数据(99%的攻击来自哪个,您忘记注意的文本框)将减少事件的发生。

当涉及将数据放入数据库时​​,大多数人清理字符串,寻找要逃脱的字符。互联网上有一个关于“小鲍比; DROP TABLES”的笑话。这使得这个问题变得轻松。我个人的方法是对进入数据库的字符串进行base64编码,并在它们离开时对它们进行解码。为什么不使用内置插件?你可以,而且可能应该。但是,就我而言,我使用不同的数据库/文件格式执行了大量工作,并且在处理任何数据/文件格式时,base64非常有用。

至于表格,这是处理潜在攻击者时乐趣的一部分,你可能希望尽可能多地使用POST / SESSION。为什么?因为一般情况下,您希望尽可能少地向攻击者提供有关您网站/数据库内部的信息。想象一个页面,它接受了一个Get请求,它直接执行从它获取的参数:“accounts.php?ACCOUNTID = 2347289”。懒惰的程序员将在表中有一个字段,该字段匹配该字符的变量字符。然而,正如许多人所指出的那样,这部分并不严格处理SQL注入攻击,但我觉得值得提出,因为你看起来很新。