我知道这是一个简单的问题,但在我读过的所有内容中,我从来没有见过这个具体的拼写.
如果您在页面上进行查询,是否需要担心SQL注入攻击?或者,当您要求用户输入时,这只是一个问题吗?
谢谢!
我看过几篇关于L2E是否容易受到SQL注入影响的文章.
来自MSDN:
尽管在LINQ to Entities中可以进行查询组合,但它是通过对象模型API执行的.与实体SQL查询不同,LINQ to Entities查询不是使用字符串操作或连接组成的,并且它们不易受传统SQL注入攻击的影响.
这是否意味着存在可能有效的"非传统"攻击? 本文有一个非参数化查询的例子 - 可以安全地假设,如果通过变量传入用户提供的数据,它将被参数化吗?
如果我做:
from foo in ctx.Bar where foo.Field = userSuppliedString select foo;
Run Code Online (Sandbox Code Playgroud)
我安全吗?
该脚本使用PHP,而DB则使用MySQL.这是脚本本身.
$unsafe_variable = $_GET["user-input"];
$sql=sprintf("INSERT INTO table (column) VALUES('%s')",$unsafe_variable);
mysql_query($sql);
Run Code Online (Sandbox Code Playgroud)
有人说如果用户将;DROP TABLE blah;字符串分配给变量$ unsafe_variable,则会删除该表.
但我试过这个例子,
http://localhost/test.php?user-input=DROP%20TABLE%20my_table
Run Code Online (Sandbox Code Playgroud)
但它没有删除表,而是在表中插入了一个新行(;DROP TABLE blah;).
有人可以解释一下如何用sql注入来攻击这个脚本吗?
根据"如果它像鸭子走路,它听起来像鸭子"的原则,亚马逊的SimpleDB支持的SQL风格的查询似乎应该容易受到SQL注入式攻击.这是一个简单的例子,假设攻击者的输入进入变量$ category,并且他可以猜测列名:
$category = "Clothes' OR Category LIKE '%";
$results = $sdb->select("SELECT * FROM `{$domain}` WHERE Category = '$category'");
Run Code Online (Sandbox Code Playgroud)
如果您正在玩主游戏,这些行可以是html-sdb_create_domain_data.php亚马逊PHP SDK(1.2)示例代码中文件第119行的原位替换.
亚马逊发布了引用规则,我想我可以编写一些东西来确保用户输入中的任何"或"被加倍......但我一直都知道转义基本上是一场军备竞赛,这使得参数化成为我选择的武器.例如,使用MySQL.
其他人用来保护SimpleDB查询的是什么?
我使用shell脚本与MySQL数据库进行通信.MySQL支持将查询指定为shell参数,如下所示:
mysql my_db -B -N -e "select id from Table"
Run Code Online (Sandbox Code Playgroud)
但是,如果我有一个参数,我想在查询中使用,我如何获得针对注入攻击的保护?
一种天真的方法是将变量值粘贴到请求中,但它不是很安全:
mysql my_db -B -N -e "select id from Table where name='$PARAM'"
Run Code Online (Sandbox Code Playgroud)
是否有任何技巧或记录的接口可以从命令行进行注入安全查询?
我已经使用hibernate与我的数据库交互,现在我想使我的数据库层对SQL注入安全,所以我做了一些研究,我发现我的查询应该参数化,所以这是否意味着我只是构建我的HQL查询如:
List mothers = session.createQuery(
"select mother from Cat as cat join cat.mother as mother where cat.name = ?")
.setString(0, name)
.list();
Run Code Online (Sandbox Code Playgroud)
然后它被参数化并受到SQL注入的保护,或者还有其他我需要做的事情......
另外一件事是提到 - " 总是逃避你的数据 "怎么能实现?
我想知道是否有可能只需my_sql_escape字符串整个$ _POST和$ _GET数组,所以你不会错过任何变量?
不知道如何测试它或我会自己.谢谢!
我想允许用户使用一些相当灵活的标准查询数据库.我可以使用以下内容:
String slqCmdTxt = "SELECT * FROM TheTable WHERE " + userExpression;
Run Code Online (Sandbox Code Playgroud)
但是,我知道这对SQL注入是开放的.使用参数是好的,但我没有看到允许非常灵活的查询的方法.
如何在不打开SQL注入的情况下允许灵活的数据库查询?
更多细节:
实际上有两个表,一个主表和一个具有属性的辅助表.一个主记录可能具有许多属性.我们想查询两个表中的值.结果将被处理成一个报告,该报告比简单的表格视图更具可读性.数据由C#程序编写,但当前的方向是从用Java编写的组件查询表.
所以我需要一种方法来提供用户输入然后安全地构建查询.对于一组有限的输入,我编写了代码来构建一个带有给定输入和参数值的查询字符串.然后我查看并添加输入值作为参数.这导致复杂的字符串捕捉,难以改变/扩展.
现在我正在使用Java,一些搜索已经发现了像jOOQ这样的SQL语句构建库......
请考虑以下代码段:
import MySQLdb
def get_data(id):
db = MySQLdb.connect(db='TEST')
cursor = db.cursor()
cursor.execute("SELECT * FROM TEST WHERE ID = '%s'" % id)
return cursor.fetchall()
print(get_data(1))
Run Code Online (Sandbox Code Playgroud)
代码中存在一个主要问题 - 它容易受到SQL注入攻击,因为查询不是通过DB API参数化的,而是通过字符串格式化构建的.如果以这种方式调用函数:
get_data("'; DROP TABLE TEST -- ")
Run Code Online (Sandbox Code Playgroud)
将执行以下查询:
SELECT * FROM TEST WHERE ID = ''; DROP TABLE TEST --
Run Code Online (Sandbox Code Playgroud)
现在,我的目标是分析项目中的代码并检测可能容易受到SQL注入攻击的所有位置.换句话说,查询是通过字符串格式构造的,而不是在单独的参数中传递查询参数.
在静态代码分析软件包的帮助下pylint,它是否可以静态解决pyflakes?
我知道sqlmap流行的渗透测试工具,但据我所知,它正在对抗Web资源,通过HTTP请求将其作为黑盒进行测试.
对于Spring,传递给@Query注释的字符串的参数是否被视为纯数据,例如,如果您使用的是PreparedStatement类或任何旨在阻止SQL注入的方法?
final String MY_QUERY = "SELECT * FROM some_table WHERE some_column = ?1";
@Query(value=MY_QUERY, nativeQuery = true)
List<SomeEntity> findResults(String potentiallyMaliciousUserInput);
Run Code Online (Sandbox Code Playgroud)
结论:上面的代码是否容易受到SQL注入的影响?