0

如何防止我的代码和 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

4 回答 4

2

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

当 CakePHP 说

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

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

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

在这个例子中,不管$articleIDtoFind来自哪里,查询都是安全的。(如果它充满垃圾,它可能无法正常工作)

于 2012-05-21T09:15:22.997 回答
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.";
}
?>

由于我添加了“mysql_real_escape_string”函数,像'和'这样的字符将被转义,以便数据库不会将它们视为查询的一部分。

于 2012-05-21T06:43:55.237 回答
1

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

 a' or '1=1

为避免这种注入,您可以使用以下方法 1.mysql_real_escape_string(); eg:在执行查询之前

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

eg : $user_data=addslashes($user_data)
于 2012-05-21T13:35:58.957 回答
-1

恕我直言,没有任何方法是 100% 完全证明的。但是,清理输入以及正确处理表单数据(这是 99% 的攻击的来源,您忘记提防的文本框)将减少此类事件的发生。

在将数据放入数据库时​​,大多数人都会清理字符串,寻找要转义的字符。互联网上有一个关于“小鲍比;放下桌子;”的笑话。这说明了这个问题。我个人的方法是对进入数据库的字符串进行base64编码,并在它们离开时对其进行base64解码。为什么不使用内置插件?你可以,而且可能应该。但是,就我而言,我已经使用不同的数据库/文件格式执行了很多工作,并且 base64 在处理它们中的任何一个时都很有用。

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

于 2012-05-21T06:43:20.780 回答