由于某些重要原因,我无法使用ZF提供的标准方法来阻止sql注入.我刚刚写了(我在用户的每个POST/GET数据上使用它):
$filter = new Zend_Filter_PregReplace();
$filter->setMatchPattern(array("/[';`]/"))
->setReplacement(array(''));
Run Code Online (Sandbox Code Playgroud)
我只使用MySQL数据库.够了吗?现在安全吗?
我有一个.NET应用程序,它使用SqlCommand运行以下语句:
DECLARE @SQL VARCHAR(100)
SELECT @SQL = 'CREATE DATABASE ' + @DB
EXEC(@SQL)
Run Code Online (Sandbox Code Playgroud)
@DB参数来自用户输入,因此很明显应用程序容易受到"X DROP DATABASE Y"之类的攻击.我敢肯定一定有一种我想念的明显方式......
编辑:使用参数化语句无法工作,因为您无法在CREATE DATABASE中使用参数(CREATE DATABASE @DB返回语法错误).
以下是否暴露了Sql Injection攻击向量?如果它确实如何防止它?
@bookId = '1234;' + 'Drop table Books;'
Select * from Books where bookId = @bookId
Run Code Online (Sandbox Code Playgroud)
不会这样执行吗?:
Select * from Books where bookId = 1234; Drop table Books;
Run Code Online (Sandbox Code Playgroud) 我现在已经阅读了很多有关 SQL 注入并试图阻止它的内容。我读过几篇关于如何以及为何使用的文章
Command.Parameters.Add()
Run Code Online (Sandbox Code Playgroud)
但我仍在寻找它如何以及为何防止 SQL 注入的答案。
MSDN 没有太多这方面的信息。
这是我如何使用它的示例:
SqlCommand myCommand = new SqlCommand("SELECT * FROM table WHERE name = @name ", myConnection);
myCommand.Parameters.Add("@name", SqlDbType.NVarChar, 20).Value = "MaMu2";
Run Code Online (Sandbox Code Playgroud)
我的代码对于 SQL 注入是否安全,还是我错了?
编辑:主要问题是:它内部如何工作?
就像我在$_SESSION['userid']这里做的一样:
function changeEmail($newEmail){
$stmt = $mysqli->prepare("update `users` set `email`=? where `userid`={$_SESSION['userid']} limit 1");
$stmt->bind_param('s',$newEmail);
return $stmt->execute();
}
Run Code Online (Sandbox Code Playgroud)
因为: 的值$_SESSION['userid']是从数据库生成的(通过 auto_increment 整数)所以没有 SQL 注入的风险。另外,我假设连接值比绑定快一点。
我是初学者。我写了这篇文章,我被告知我的 find() 方法存在安全漏洞。我认为我的 queryType 方法的 if else 阻止了 Sql 注入尝试。
public function queryType(string $sql, array $attributes = null)
{
## instance of Database singleton
$this->Database = Database::getInstance();
if($attributes !== null) {
## if attr, prepared request
$query = $this->Database->prepare($sql);
$query->execute($attributes);
return $query;
}else{
## else, simple request
return $this->Database->query($sql);
}
}
## SECURITY ISSUE /!\ ?? queryType if/else doesn't prevent ??
public function find(int $id)
{
return $this->queryType("SELECT * FROM {$this->table} WHERE id = $id")->fetch();
}
Run Code Online (Sandbox Code Playgroud)
我该如何解决它?
我总是对黑客感兴趣,我理解SQL注入和跨站点脚本的概念.但是,我不知道的是如何检测可能的SQL注入.我检查了一些书,但我没有得到太多的信息.黑客是手工进行检测工作还是拥有更智能的自动工具?
所以,我正在考虑编写一个简单的工具来进行自动注入检查(使用qwebkit).我想在发送之前捕获http请求,并用SQL注入命令替换http头的一些表单数据.该程序检查http响应并将其与正常响应进行比较并报告任何差异.
问题是我自己从未发现过SQL注入,这个想法是否有效?
比如,如果我成功升级到某个网站的管理员,返回的http响应应该看起来正常.所以我不能用我的程序自动报告?
我在Laravel的页面中有一些表格.根据文档,三重括号 - {{{}}}可以逃避输出.所以当我使用时:
{{{ Form::text('name') }}}
Run Code Online (Sandbox Code Playgroud)
我可以100%确定不可能将SQL注入命令插入此表单输入吗?
研发之后,我没有针对此缺陷的解决方案。请指导我解决此缺陷
说明
此数据库查询包含一个SQL注入漏洞。函数调用使用从用户提供的输入派生的变量构造动态SQL查询。攻击者可能利用此漏洞对数据库执行任意SQL查询。
建议
避免动态构造SQL查询。而是使用参数化的预处理语句来防止数据库将绑定变量的内容解释为查询的一部分。始终使用集中的数据验证例程来验证用户提供的输入,以确保其符合预期格式。
public void EditUser(User f)
{
string connectionString
= ConfigurationSettings.AppSettings["ConnectionString"];
SqlConnection conn = new SqlConnection(connectionString);
SqlCommand cmd = conn.CreateCommand();
string adm = (f.IsAdmin?"1":"0");
string phone="",email="";
if(f.PhoneList.Count > 0)
phone = f.PhoneList[0].ToString();
if(f.EmailList.Count > 0)
email = f.EmailList[0].ToString();
for(int i = 1; i < f.PhoneList.Count; i++)
phone = phone + ";" + f.PhoneList[i].ToString();
for(int i = 1; i < f.EmailList.Count; i++)
email = email + ";" + f.EmailList[i].ToString();
cmd.CommandText = "UPDATE Users SET is_admin="+adm+",login='"+f.Login+"',passwd='"+f.Password+
"',firstname='"+f.FirstName+"',lastname='"+f.LastName+"',email='"+email+"',phone='"+phone+"',address='"+f.Address+"' where user_id="+f.UserId; …Run Code Online (Sandbox Code Playgroud) sql-injection ×10
sql ×4
c# ×2
php ×2
security ×2
.net ×1
asp.net-mvc ×1
forms ×1
input ×1
laravel ×1
mysql ×1
mysqli ×1
sql-server ×1
veracode ×1