如果插入用户输入而不修改SQL查询,则应用程序容易受到SQL注入的攻击,如下例所示:
$unsafe_variable = $_POST['user_input'];
mysql_query("INSERT INTO `table` (`column`) VALUES ('$unsafe_variable')");
Run Code Online (Sandbox Code Playgroud)
这是因为用户可以输入类似的内容value'); DROP TABLE table;--,查询变为:
INSERT INTO `table` (`column`) VALUES('value'); DROP TABLE table;--')
Run Code Online (Sandbox Code Playgroud)
可以采取哪些措施来防止这种情况发生?
如何在SQLAlchemy中执行原始SQL?
我有一个python web应用程序,它运行在烧瓶上,并通过SQLAlchemy与数据库连接.
我需要一种方法来运行原始SQL.该查询涉及多个表连接以及内联视图.
我试过了:
connection = db.session.connection()
connection.execute( <sql here> )
Run Code Online (Sandbox Code Playgroud)
但我不断收到网关错误.
维基百科说:
准备好的语句对SQL注入具有弹性,因为稍后使用不同协议传输的参数值无需正确转义.如果原始语句模板不是从外部输入派生的,则不能进行SQL注入.
我看不清楚原因.简单的英语和一些例子中有什么简单的解释?
据我所知,预备语句(主要)是一个数据库功能,允许您将参数与使用此类参数的代码分开.例:
PREPARE fooplan (int, text, bool, numeric) AS
INSERT INTO foo VALUES($1, $2, $3, $4);
EXECUTE fooplan(1, 'Hunter Valley', 't', 200.00);
Run Code Online (Sandbox Code Playgroud)
参数化查询替代手动字符串插值,因此不是这样做
cursor.execute("SELECT FROM tablename WHERE fieldname = %s" % value)
Run Code Online (Sandbox Code Playgroud)
我们可以做的
cursor.execute("SELECT FROM tablename WHERE fieldname = %s", [value])
Run Code Online (Sandbox Code Playgroud)
现在,似乎准备好的语句大部分都用在数据库语言中,参数化查询主要用于连接数据库的编程语言,尽管我已经看到了这个规则的例外.
问题在于询问预准备语句和参数化查询之间的区别会带来很多混乱.他们的目的无疑是相同的,但他们的方法似乎是截然不同的.然而,有消息表明两者都是相同的.MySQLdb和Psycopg2似乎支持参数化查询,但不支持预处理语句(例如,这里是MySQLdb和postgres驱动程序的TODO列表或sqlalchemy 组中的这个答案).实际上,有一个实现psycopg2游标的要点,支持准备好的语句和关于它的最小解释.还有一个建议是在psycopg2中继承游标对象以手动提供准备好的语句.
我想得到以下问题的权威答案:
预准备语句和参数化查询之间是否存在有意义的区别?这在实践中是否重要?如果使用参数化查询,是否需要担心预处理语句?
如果存在差异,Python生态系统中预准备语句的当前状态是什么?哪些数据库适配器支持预处理语
python database sql-injection prepared-statement parameterized-query
我使用此查询将所有值插入此数据库:
INSERT INTO products ($fields) VALUES ($values)
Run Code Online (Sandbox Code Playgroud)
但是,我尝试使用相同的格式进行更新:
UPDATE products SET ($fields) VALUES ($values) WHERE sku = '$checksku'
Run Code Online (Sandbox Code Playgroud)
...而且我遇到了语法错误:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '('product,make,model,' at line 1
Run Code Online (Sandbox Code Playgroud)
我无法弄清楚.非常感谢任何帮助.谢谢.
我正在使用此查询从数据库中获取数据.
string nfc = "53f8372c";
var temp = db.tempTable.AsNoTracking().Where(
x =>
x.uid.Equals(nfc, StringComparison.CurrentCultureIgnoreCase)
&& x.ENDED == null
&& x.STATUS.Equals(Constants.ACTIVE)
);
Run Code Online (Sandbox Code Playgroud)
从此查询生成的sql是:
{SELECT
"Extent1"."ID" AS "ID",
"Extent1"."uid" AS "uid",
"Extent1"."ENDED" AS "ENDED",
"Extent1"."STATUS" AS "STATUS",
FROM "tempTable" "Extent1"
WHERE (("Extent1"."uid" = :p__linq__0) AND ("Extent1"."ENDED" IS NULL) AND ('Active' = "Extent1"."STATUS"))}
Run Code Online (Sandbox Code Playgroud)
为什么它将53f8372c转换为:p__linq__0?