我试图弄清楚如何在将其交给执行之前对SQL字符串进行参数化,但遗憾的是我在互联网上发现了很多这样的信息:
sql = "SELECT * FROM table_name WHERE thing LIKE '%#{input}%'"
Run Code Online (Sandbox Code Playgroud)
这是一件坏事......但是,参数化sql查询可以在底层的Sequel库中找到,这就是TinyTDS的基础.所以我知道这是可能的.我只是很难搞清楚.
我真的想这可能是简单,只需这样:
@client = TinyTds::Client.new(
:adapter => 'sqlserver',
:host => host,
:database => db,
:username => username,
:password => password)
sql = "SELECT * FROM table_name WHERE thing LIKE ?"
safe_sql = @client.prepare(sql, input)
result = @client.execute(safe_sql)
Run Code Online (Sandbox Code Playgroud)
我似乎Dataset在源代码中找到了一个叫做类的东西,它有一个prepare方法.问题是,我该如何使用它?在将其交给对象中的execute()方法之前,是否需要创建另一个@client对象?我找不到一个initialize或一个new方法,所以简单的实例化似乎是错误的方法.
如果从SQL查询中删除所有'字符,还有其他方法对数据库进行SQL注入攻击吗?
怎么做到呢?谁能举个例子?
原始问题:
我们的联盟合作伙伴有一个易受SQL注入攻击的网站.
我们意外地注意到了这一点(URL中的拼写错误引发了一个非常有用的错误页面).
现在我们不太了解这个联盟合作伙伴.一周前我们开始与他们做生意.他们自己的技术技能很少; 他们的网站是由第三家"做网站"的公司为他们开发的.
现在很明显我们应该警告他们这个问题.但我们有点担心,如果我们告诉他们这个问题,他们会害怕,不再相信我们(拍摄信使让问题消失).
你有没有遇到过这种情况?你做了什么?
另外一点是:
因为开发网站的公司似乎根本没有进行输入验证/消毒,我们对这家公司没有太大的信心.虽然这不是我们关心的问题,但我们认为我们应该警告我们的联盟合作伙伴,因为他们的系统其他部分可能缺乏安全性和质量.这将使我们与他们的开发人员正面交锋,我们不想让他们参与我们的情况.
我们是否应该通知他们我们的其他问题?或者你建议让它成为现实?
更新:
那么,怎么回事?
我们向他们通报了现有问题,包括背景信息,详细的错误报告,并试图用简单的人类语言解释问题是什么以及为什么它是严重的.
他们感谢我们,将这些信息传递给他们的网站开发人员,后者已修复它.
我们不太确定修复的质量,但我们无能为力,这不是我们的责任.(虽然它确实感觉到我们的责任,但自从我们报告以来更是如此).
然而,这种关系发生了变化.它们不那么开放,之前有更多的保留.我们希望将来会有更好的改变,但是确实报告这个问题会损害这种关系中的信任.
因此,如果您发现自己处于相同的位置,请小心,花些时间来解释问题,并为不太理想的响应做好准备.
我和一群黑客有麻烦.他们几次攻击我的客户的网站,我的客户端变得更生气:(我的客户丢失了他的数据库(有数百条记录),并且不得不输入所有:(
现在我正在进行更多的介绍;
现在正致力于SQL注入问题.我将mysql_real_escape_string添加到管理面板登录参数.那么我应该在哪里使用这个mysql_real_escape_string呢?我在网站上的电子邮件表格很少,我不认为我需要在那里添加...
我有一个index.php作为主页.我应该为这个页面做些什么来阻止任何sql注入攻击通过url index.php?somesql=吗?
请建议我!我很感激!!! :(
例如:
我有这样的代码;
public function showDetails($id) {
// SQL Jobs Details
$this->sql_job = "SELECT * FROM jobs WHERE id=".mysql_real_escape_string($id);
$this->rst_job = mysql_query($this->sql_job);
$this->row_all = mysql_fetch_assoc($this->rst_job);
// SQL State
$this->sql_state = "SELECT title FROM state WHERE id=" . $this->row_all[$this->tbl_jobs['f4']];
$this->rst_state = mysql_query($this->sql_state);
$this->row_state = mysql_fetch_assoc($this->rst_state);
........
Run Code Online (Sandbox Code Playgroud)
是否足以使用mysql_real_escape_string作为$ id.不是$ this-> row_all [$ this-> tbl_jobs ['f4']]
出于性能原因,我需要在我的Rails模型中编写一个执行一些任意SQL的新方法:
UPDATE table
SET col1 = ? AND col2 = ?
WHERE id = ?
Run Code Online (Sandbox Code Playgroud)
我知道我可以使用ActiveRecord::Base.connection.execute或ActiveRecord::Base.connection.update使用一串SQL来获得我需要的结果,但是?使用实际参数值替换参数占位符()的正确步骤是什么?是否有一个Rails方法用于将参数插入到SQL语句中,还是应该通过手动插值来完成?后者似乎不安全......
我在我的网站上检测到一些失败的SQL注入攻击.失败的查询格式如下:
SELECT 6106 FROM(SELECT COUNT(*),':sjw:1:ukt:1'x FROM information_schema.tables GROUP BY x)
该':sjw:1:ukt:1'部分是专门构造的变量连接在一起,给出随机0或1等.
我想知道这些查询是做什么的?
数据库是MySQL.
更新:这是原始注入的SQL:
(SELECT 6106
FROM (SELECT COUNT(*),
CONCAT(
CHAR(58, 115, 106, 119, 58),
(SELECT ( CASE WHEN ( 6106 = 6106 ) THEN 1 ELSE 0 END )),
CHAR(58, 117, 107, 116, 58),
FLOOR(RAND(0) * 2)
) x
FROM INFORMATION_SCHEMA.TABLES
GROUP BY x)a)
Run Code Online (Sandbox Code Playgroud)
它失败了,留言
密钥'group_key'重复输入':sjw:1:ukt:1'
我在这里看到一些人说使用连接查询mysql_real_escape_string不会保护你(完全)免受SQL注入攻击.
但是,我还没有看到一个输入示例,它说明了一种mysql_real_escape_string无法保护你的攻击.大多数示例忘记了mysql_query仅限于一个查询并且使用mysql_real_escape_string不正确.
我能想到的唯一例子如下:
mysql_query('DELETE FROM users WHERE user_id = '.mysql_real_escape_string($input));
Run Code Online (Sandbox Code Playgroud)
这不会保护您免受以下输入:
5 OR 1=1
Run Code Online (Sandbox Code Playgroud)
我认为这是错误的使用mysql_real_escape_string而不是缺点,它是为字符串而不是数值设计的.您应该转换为数字类型,或者如果要在清理时将输入视为字符串,则应在查询中执行相同操作并在其周围加上引号.
任何人都可以提供一个可以绕过的输入示例mysql_real_escape_string,它不依赖于对数值的错误处理或忘记mysql_query只能执行一个查询吗?
编辑:我对它的局限性感兴趣,mysql_real_escape_string而不是将它与替代品进行比较,我意识到新项目有更好的选择,我并不反对.
我负责维护和扩展从2007年开始并使用原始mysql模块的PHP代码库.所有的用户输入是用铸造为预计数值转义,mysql_real_escape_string()使用单引号的字符串,可能正在通过进一步过滤引述in_array()为ENUM字段或array_intersect()用于SET字段.然后,所有无约束的字符串字段都会通过输出HTML htmlspecialchars()或htmlentities()输出HTML.如果值表示外键,则首先验证该键是否存在.
我相信通过严格遵循这些程序,该应用程序可以防止注入和其他形式的攻击.(奖励积分:我是否正确?如果没有,我错过了什么?)
将此应用程序转换为mysqliPDO将是一项相当大的任务(并且,为避免意外破坏,我不希望自动化).最后我的问题是:在使用旧mysql模块时是否存在无法缓解的特定漏洞,这需要迁移到较新的模块?
赏金信息:
为了清楚起见,我希望有一个CVE编号列表或来自PHP开发人员的声明,该mysql模块将针对所有已知漏洞进行补丁.我也假设在使用模块后遵循最佳实践并不会让我接触到额外的攻击向量.BCP在将数据插入新语句之前已经包含从数据库中获取的数据.继续谈论这个并没有真正解决这个问题.
我是PDO的新手,想知道我的查询是否可以安全地从SQL注入.如果是这样的话,我会在整个网站上使用这种方法.
// make connection to DB
$db = new PDO('mysql:host='.$dateBaseHost.';dbname='.$dateBaseName, $dateBaseUsername, $dateBasePassword);
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
//simple query and binding with results
$query = $db->prepare(" SELECT * FROM `profile` WHERE `fullname` = :fullname ");
$search = (isset($_GET['search']) === true) ? $_GET['search'] : '' ; // ? : shorthand for if else
// bind parameters - avoids SQL injection
$query->bindValue(':fullname', $search);
//try... if not catch exception
try {
// run the query
$query->execute();
$rows = $query->fetchAll(PDO::FETCH_ASSOC);
echo '<pre>', print_r($rows, true),'</pre>';
}
catch (PDOException …Run Code Online (Sandbox Code Playgroud) 我正在学习避免SQL注入,我有点困惑.
使用bind_param时,我不明白其目的.在手册页上,我找到了这个例子:
$stmt = mysqli_prepare($link, "INSERT INTO CountryLanguage VALUES (?, ?, ?, ?)");
mysqli_stmt_bind_param($stmt, 'sssd', $code, $language, $official, $percent);
$code = 'DEU';
$language = 'Bavarian';
$official = "F";
$percent = 11.2;
Run Code Online (Sandbox Code Playgroud)
现在,假设这4个变量是用户输入的,我不明白这是如何阻止SQL注入的.根据我的理解,他们仍然可以在那里输入任何他们想要的东西.
我也找不到'sssd'那里的解释.它有什么作用?这是什么使它安全?
最后一个问题:我读到了另一个mysqli_real_escape_string被弃用的问题,但它没有在手册中说明.它是如何弃用的?由于某种原因,它不能再逃避特殊角色吗?
注意:这个问题解释了bind_param的作用,但我仍然不明白为什么它更安全或更受保护. Bind_param解释
sql-injection ×10
php ×5
mysql ×4
sql ×4
security ×3
database ×1
pdo ×1
ruby ×1
tiny-tds ×1
web-services ×1