我有一些代码利用参数化查询来防止注入,但我还需要能够动态构造查询,而不管表的结构如何.这样做的正确方法是什么?
这是一个例子,说我有一个表名列,地址,电话.我有一个网页,我在其中运行显示列并使用它们作为选项填充选择下拉列表.
接下来,我有一个名为Search的文本框.此文本框用作参数.
目前我的代码看起来像这样:
result = pquery('SELECT * FROM contacts WHERE `' + escape(column) + '`=?', search);
不过,我从中得到了一种icky的感觉.我使用参数化查询的原因是为了避免使用转义.此外,转义可能不是为逃避列名而设计的.
我怎样才能确保这个按照我的意图运作?
编辑: 我需要动态查询的原因是架构是用户可配置的,我不会修复任何硬编码的东西.
什么是保护MySQL注入的最佳方法?我应该注意哪些弱点?
我知道它是什么,但我真的不知道我有多脆弱.虽然我采取了(我认为是)保护自己和我的数据库的步骤.
是否有任何阻止某人的确定方法?
顺便说一句......我用PHP写的:)
实际上有2个问题
我知道我必须尽可能多地使用存储过程,但我想知道以下内容.
答:我可以从SELECT语句中获取SQL注入攻击,例如(Select*from MyTable)吗?
B: 另外,当我在ASP.NET中使用SQLDataSource时,我能获得SQL注入攻击吗?
我们都知道参数化SQL是处理用户输入和动态SQL时的方法,但是如果您要搜索的输入是数字,则从字符串转换为int(或double,或long,或其他)是有效的?
我想我要问的是,如果单独使用这种技术在SQL注入方面是绝对可靠的吗?
问题:防止XSS(跨站点脚本)strip_tags在任何已保存的输入字段上使用并htmlspecialchars在任何显示的输出上运行...并使用PHP PDO预处理语句阻止SQL注入?
这是一个例子:
// INPUT: Input a persons favorite color and save to database
// this should prevent SQL injection ( by using prepared statement)
// and help prevent XSS (by using strip_tags)
$sql = 'INSERT INTO TABLE favorite (person_name, color) VALUES (?,?)';
$sth = $conn->prepare($sql);
$sth->execute(array(strip_tags($_POST['person_name']), strip_tags($_POST['color'])));
// OUTPUT: Output a persons favorite color from the database
// this should prevent XSS (by using htmlspecialchars) when displaying
$sql = 'SELECT …Run Code Online (Sandbox Code Playgroud) 我们有一个遗留应用程序不使用位置参数进行查询,并且到处都有SQL.决定(在我开始之前)由于用户输入可以包含撇号,因此应该为这些撇号手动转义每个字符串输入.
这是必要的原始代码(不是由我编写的),翻译成C#以便于使用:
private string _Escape(string input)
{
return input.Replace("'", "''");
}
private bool _IsValidLogin(string userName, string password)
{
string sql =
string.Format
(
@"SELECT COUNT(*) FROM UserAccounts
WHERE UserName = '{0}' AND Password = '{1}'",
_Escape(userName),
_Escape(password)
);
// ...
}Run Code Online (Sandbox Code Playgroud)
这看起来似乎可以在某种程度上被打破,但我不知道它是如何被用户输入利用的.假设用户输入未经过滤直到它命中_IsValidLogin,并忘记密码似乎以纯文本形式存储.
支持它的解决方案是显而易见的 - 使用位置参数 - 但是我需要一些弹药来向管理人员证明这个代码为什么/如何不安全所以可以分配时间/ $来修复它.
注意:我假设这可能会被打破,但实际情况可能并非如此.我不是SQL巨星.
注2:我已将此问题表达为与数据库无关,但如果您可以将此代码用于某个引擎,我欢迎您的贡献.
我工作的网站最近试图被以下SQL注入脚本攻击
boys' and 3=8 union
select 1,
concat(0x232425,ifnull(`table_name`,0x30),char(9),ifnull(`table_rows`,0x30), char(9),0x252423),
3,4,5,6,7,8,9
from `information_schema`.`tables`
where table_schema=0x62646B3032 limit 44,1 -- And '8'='8
Run Code Online (Sandbox Code Playgroud)
这个注入返回了mysql表名.这是由该网站上的错误报告系统报告的,我们设法修复了该部分但是我无法理解上述注入意味着什么?
有谁能解释一下?
努伊勒
我听过有人说(关于C#/ SQL Server,但也与PHP/MySql有关):不要手动转义字符串 - 而是使用存储过程.
好的,我可以接受这个建议,但为什么呢?很多人说(包括SO)mysql_real_escape_string()就足够了,mysql_real_escape_string()很好,mysql_real_escape_string()是第一种保护方式.
为什么?有mysql_real_escape_string()可能失败的情况吗?至少一个......我不需要很多:)
我正在实现一个简单的搜索功能,它应检查username,last_name和first_name中的字符串.我在旧的RailsCast上看过这个ActiveRecord方法:
http://railscasts.com/episodes/37-simple-search-form
find(:all, :conditions => ['name LIKE ?', "%#{search}%"])
Run Code Online (Sandbox Code Playgroud)
但是我如何设置它以便在name,last_name和first name中搜索关键字并返回记录,如果其中一个字段与该术语匹配?
我也想知道RailsCast上的代码是否容易进行SQL注入?
非常感谢!
search activerecord sql-injection ruby-on-rails ruby-on-rails-3
我正在为涉及SQL注入的安全类做一些功课.我发现我可以比典型的' OR '1'=1例子做更短的SQL注入.相反,我可以做到'='.输入这个是在典型登录框的密码字段中给出一个SQL查询,如下所示:
SELECT * FROM Users WHERE username='user' AND password=''='';
Run Code Online (Sandbox Code Playgroud)
事实证明,password=''=''求值1,允许SQL注入工作.
做了一些测试后,我看到如果我测试一个字符串是否等于0,它返回1:
SELECT 0='a';
Run Code Online (Sandbox Code Playgroud)
所以在我的例子中,password=''将评估为0并0=''最终评估为1.
我的测试向我展示了这是如何发生的,但我想知道为什么会发生这种情况(即为什么是0='a'真的?