我正在阅读我信赖的O'Reilly书,并发现了一篇关于Mongo本质上是如何避免SQL注入式漏洞的消息.
在我的直觉中,我想我理解这一点.如果unsanitized瓦尔传递到查询,他们无法攻破了面向文档的查询结构的出UNION,JOIN,查询翻评论,等等.
MongoDB如何避免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注入?
这是为了创建社区学习资源.目标是获得良好代码的示例,这些代码不会重复在复制/粘贴的PHP代码中经常出现的可怕错误.我已经要求它成为社区维基.
这不是一个编码竞赛.这不是要找到最快或最紧凑的查询方式 - 它是为新手提供一个好的,可读的参考.
每天都有大量的问题与使用Stack Overflow上的函数系列的非常糟糕的代码片段大量涌现mysql_*.虽然通常最好将这些人引向PDO,但它有时既不可能(例如继承的遗留软件)也不是现实的期望(用户已经在他们的项目中使用它).
使用该mysql_*库的代码的常见问题包括:
让我们编写一个PHP代码示例,使用mySQL_*系列函数执行以下操作:
id(数字)和name(一个字符串)tablename,name使用ID 更改行中的列idtrigger_error()就足够了; 或者使用您选择的方法$name已更新".并没有显示上面列出的任何弱点.
它应该尽可能简单.理想情况下,它不包含任何函数或类.目标不是创建一个复制/可粘贴的库,而是显示为使数据库查询安全所需要做的最少的事情.
好评如有好处.
目标是使这个问题成为用户在遇到问题提供者时可以链接到的资源(即使它根本不是问题的焦点),或者遇到错误的查询而不是知道如何解决它.
要抢先讨论PDO讨论:
是的,将这些问题的个人指向PDO往往更为可取.如果是一种选择,我们应该这样做.然而,这并不总是可能的 - 有时,提问者正在处理遗留代码,或者已经在这个库中走了很长一段路,并且现在不太可能改变它.此外,mysql_*如果正确使用,功能系列是完全安全的.所以请不要在这里"使用PDO".
在PHP中,我知道它mysql_real_escape比使用更安全addslashes.但是,我找不到一个addslashes让SQL注入发生的情况的例子.
谁能举一些例子?
我有很多用户输入$_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) 什么是在mysql上运行查询的最安全的方法,我知道MySQL和SQL注入涉及的危险.
但是我不知道如何运行查询以防止注入其他用户(webclients)可以操作的变量.我曾经写过自己的转义函数,但显然这是"未完成".
我应该使用什么以及我应该如何使用它来查询并通过python安全地插入MySQL数据库而不会冒险注入mysql?
用户等于不值得信任.永远不要相信不值得信任的用户输入.我明白了.但是,我想知道什么时候消毒输入的最佳时间是.例如,您是否盲目存储用户输入,然后在访问/使用它时对其进行清理,或者您是否立即清理输入然后存储此"已清理"的版本?也许除了这些之外我还有其他一些方法.我更倾向于第一种方法,因为仍然必须谨慎地处理来自用户输入的任何数据,其中"清理的"数据可能仍然在不知不觉中或意外地变得危险.无论哪种方式,人们认为哪种方法最好,原因是什么?
我有以下代码,使用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)
为任何见解干杯.
.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)
哪里
什么是正确的语法?
sql-injection ×10
sql ×4
php ×3
security ×3
xss ×3
mysql ×2
python ×2
.net ×1
codeigniter ×1
csrf ×1
jsf ×1
mongodb ×1
owasp ×1
parameters ×1
postgresql ×1
psycopg2 ×1
sanitization ×1
user-input ×1