标签: sql-injection

MongoDB如何避免SQL注入混乱?

我正在阅读我信赖的O'Reilly书,并发现了一篇关于Mongo本质上是如何避免SQL注入式漏洞的消息.

在我的直觉中,我想我理解这一点.如果unsanitized瓦尔传递到查询,他们无法攻破了面向文档的查询结构的出UNION,JOIN,查询翻评论,等等.

MongoDB如何避免SQL注入混乱?这只是本质查询语法吗?

sql sql-injection mongodb

62
推荐指数
4
解决办法
4万
查看次数

CodeIgniter会自动阻止SQL注入吗?

我刚刚继承了一个项目,因为最后一个开发人员离开了 该项目由Code Igniter构建.我之前从未使用Code Igniter.

我快速浏览一下代码,然后在控制器中看到数据库调用,如下所示:

$dbResult = $this->db->query("SELECT * FROM users WHERE username = '".$_POST['user_name']."'");
Run Code Online (Sandbox Code Playgroud)

或者这样的电话:

$dbResult = $this->db->query("SELECT * FROM users WHERE username = '".$this->input->post('username')."'");
Run Code Online (Sandbox Code Playgroud)

代码点火器是否会自动清理这些查询以防止sql注入?

sql-injection codeigniter

60
推荐指数
3
解决办法
8万
查看次数

参考:什么是使用MySQL扩展的完美代码示例?

这是为了创建社区学习资源.目标是获得良好代码的示例,这些代码不会重复在复制/粘贴的PHP代码中经常出现的可怕错误.我已经要求它成为社区维基.

不是一个编码竞赛.这不是要找到最快或最紧凑的查询方式 - 它是为新手提供一个好的,可读的参考.

每天都有大量的问题与使用Stack Overflow上的函数系列的非常糟糕的代码片段大量涌现mysql_*.虽然通常最好将这些人引向PDO,但它有时既不可能(例如继承的遗留软件)也不是现实的期望(用户已经在他们的项目中使用它).

使用该mysql_*库的代码的常见问题包括:

  • SQL注入值
  • LIMIT子句和动态表名中的SQL注入
  • 没有错误报告("为什么此查询不起作用?")
  • 报告错误报告(即,即使代码投入生产,也会发生错误)
  • 跨值脚本(XSS)注入值输出

让我们编写一个PHP代码示例,使用mySQL_*系列函数执行以下操作:

  • 接受两个POST值,id(数字)和name(一个字符串)
  • 对表执行UPDATE查询tablename,name使用ID 更改行中的列id
  • 失败时,请优雅退出,但仅在生产模式下显示详细错误.trigger_error()就足够了; 或者使用您选择的方法
  • 输出消息" $name已更新".

没有显示上面列出的任何弱点.

它应该尽可能简单.理想情况下,它不包含任何函数或类.目标不是创建一个复制/可粘贴的库,而是显示为使数据库查询安全所需要做的最少的事情.

好评如有好处.

目标是使这个问题成为用户在遇到问题提供者时可以链接到的资源(即使它根本不是问题的焦点),或者遇到错误的查询而不是知道如何解决它.

要抢先讨论PDO讨论:

是的,将这些问题的个人指向PDO往往更为可取.如果是一种选择,我们应该这样做.然而,这并不总是可能的 - 有时,提问者正在处理遗留代码,或者已经在这个库中走了很长一段路,并且现在不太可能改变它.此外,mysql_*如果正确使用,功能系列是完全安全的.所以请不要在这里"使用PDO".

php mysql security sql-injection

60
推荐指数
2
解决办法
2650
查看次数

通过addslashes()进行SQL注入的示例?

在PHP中,我知道它mysql_real_escape比使用更安全addslashes.但是,我找不到一个addslashes让SQL注入发生的情况的例子.

谁能举一些例子?

php sql security sql-injection

58
推荐指数
1
解决办法
5万
查看次数

最终的清洁/安全功能

我有很多用户输入$_GET$_POST...目前我总是写mysql_real_escape_string($_GET['var'])..

我想知道你是否可以创建一个能够立即保护,转义和清理$_GET/ $_POST数组的函数,因此每次使用用户输入时都不必处理它.

我在想一个功能,例如cleanMe($input),和它里面,它应该做的mysql_real_escape_string,htmlspecialchars,strip_tags,stripslashes(我想这是所有做它的清洁与安全),然后返回$input.

这可能吗?使得对所有工作的功能$_GET$_POST,所以你会做只有这个:

$_GET  = cleanMe($_GET);
$_POST = cleanMe($_POST);
Run Code Online (Sandbox Code Playgroud)

那么在以后的代码中,当您使用eg $_GET['blabla']或者$_POST['haha']它们时,它们是安全的,剥离的等等?

试了一下自己:

function cleanMe($input) {
   $input = mysql_real_escape_string($input);
   $input = htmlspecialchars($input, ENT_IGNORE, 'utf-8');
   $input = strip_tags($input);
   $input = stripslashes($input);
   return $input;
}
Run Code Online (Sandbox Code Playgroud)

php security xss sql-injection

57
推荐指数
3
解决办法
6万
查看次数

Python最佳实践,最安全,可连接MySQL并执行查询

什么是在mysql上运行查询的最安全的方法,我知道MySQL和SQL注入涉及的危险.

但是我不知道如何运行查询以防止注入其他用户(webclients)可以操作的变量.我曾经写过自己的转义函数,但显然这是"未完成".

我应该使用什么以及我应该如何使用它来查询并通过python安全地插入MySQL数据库而不会冒险注入mysql?

python mysql sql-injection

56
推荐指数
2
解决办法
4万
查看次数

什么时候最好消除用户输入?

用户等于不值得信任.永远不要相信不值得信任的用户输入.我明白了.但是,我想知道什么时候消毒输入的最佳时间是.例如,您是否盲目存储用户输入,然后在访问/使用它时对其进行清理,或者您是否立即清理输入然后存储此"已清理"的版本?也许除了这些之外我还有其他一些方法.我更倾向于第一种方法,因为仍然必须谨慎地处理来自用户输入的任何数据,其中"清理的"数据可能仍然在不知不觉中或意外地变得危险.无论哪种方式,人们认为哪种方法最好,原因是什么?

xss sanitization user-input sql-injection

54
推荐指数
5
解决办法
1万
查看次数

JSF中的CSRF,XSS和SQL注入攻击防范

我有一个基于JSF的Web应用程序,MySQL作为DB.我已经实现了代码来防止我的应用程序中出现CSRF.

现在,由于我的底层框架是JSF,我想我不必处理XSS攻击,因为它已经被处理了UIComponent.我没有在任何视图页面中使用任何JavaScript.即使我使用,我真的需要实现代码来防止XSS攻击?

对于DB,我们在所有数据库交互中使用预准备语句和存储过程.

是否还需要处理其他任何事情以防止这3种常见攻击?我已经通过了OWASP网站和他们的备忘单.

我是否需要处理任何其他潜在的攻击媒介?

xss jsf sql-injection csrf owasp

54
推荐指数
2
解决办法
4万
查看次数

将表名作为参数传递给psycopg2

我有以下代码,使用pscyopg2:

sql = 'select %s from %s where utctime > %s and utctime < %s order by utctime asc;'
data = (dataItems, voyage, dateRangeLower, dateRangeUpper)
rows = cur.mogrify(sql, data)
Run Code Online (Sandbox Code Playgroud)

这输出:

select 'waterTemp, airTemp, utctime' from 'ss2012_t02' where utctime > '2012-05-03T17:01:35+00:00'::timestamptz and utctime < '2012-05-01T17:01:35+00:00'::timestamptz order by utctime asc;
Run Code Online (Sandbox Code Playgroud)

当我执行它时,它会失败 - 这是可以理解的,因为表名周围的引号是非法的.

有没有办法合法地将表名作为参数传递,或者我是否需要执行(显式警告)字符串连接,即:

voyage = 'ss2012_t02'
sql = 'select %s from ' + voyage + ' where utctime > %s and utctime < %s order by utctime asc;'
Run Code Online (Sandbox Code Playgroud)

为任何见解干杯.

python sql postgresql sql-injection psycopg2

48
推荐指数
3
解决办法
2万
查看次数

具有LIKE和IN条件的参数化查询

.Net中的参数化查询在示例中总是如下所示:

SqlCommand comm = new SqlCommand(@"
   SELECT * 
   FROM   Products 
   WHERE  Category_ID = @categoryid
", 
   conn);
comm.Parameters.Add("@categoryid", SqlDbType.Int);
comm.Parameters["@categoryid"].Value = CategoryID;
Run Code Online (Sandbox Code Playgroud)

但是我碰到了一堵砖墙试图做到以下几点:

SqlCommand comm = new SqlCommand(@"
   SELECT * 
   FROM   Products 
   WHERE  Category_ID IN (@categoryids) 
      OR  name LIKE '%@name%'
", 
   conn);
comm.Parameters.Add("@categoryids", SqlDbType.Int);
comm.Parameters["@categoryids"].Value = CategoryIDs;
comm.Parameters.Add("@name", SqlDbType.Int);
comm.Parameters["@name"].Value = Name;
Run Code Online (Sandbox Code Playgroud)

哪里

  • CategoryID是以逗号分隔的数字列表"123,456,789"(不带引号)
  • Name是一个字符串,可能带有单引号和其他错误字符

什么是正确的语法?

.net sql parameters sql-injection parameterized

47
推荐指数
3
解决办法
3万
查看次数