This topic has been archived. It cannot be replied.
-
工作学习 / 专业技术讨论 / 存储过程(stored procedure)在web应用中如何避免攻击
-newkid(newkid);
2007-8-14
{1077}
(#3867944@0)
-
good
-win(秋天的菠菜);
2007-8-14
(#3867954@0)
-
俺也贡献一下吧。补充一个,不仅限于SP,适合所有Web Application中的query。
-bdbs(不多不少);
2007-8-14
{553}
(#3868271@0)
-
开始抬杠我看不太懂语法,但你的正确方法似乎没有用绑定变量,还是在拼装SQL.
假如攻击者穿入这个东西呢?
0' DELETE TABLE product WHERE ID = '123
那么你拼装后变成:
SELECT id, name FROM product WHERE id = '0' DELETE TABLE product WHERE ID = '123'
-newkid(newkid);
2007-8-14
{250}
(#3868312@0)
-
这single quote自打到了服务器开始就应该过滤掉了。
-canadiantire(轮胎-Fumb Ducks);
2007-8-14
(#3868338@0)
-
现在大部分AS在准备query的时候,都会自动对变量中的特殊字符qualify。你的例子最后送到DB的query是:SELECT id, name FROM product WHERE id = '0'' DELETE TABLE product WHERE ID = ''123' 。所以DB仍旧是安全的。是的,我说的是拼装SQL,这也是大多数Web Application用到query的情况。该不会一个简单的SELECT也要通过SP来实现吧?
-bdbs(不多不少);
2007-8-14
{109}
(#3868366@0)
-
拼装SQL就有可能注入。也许还有什么东西没有过滤掉但现在没考虑到。而且你交给SQL引擎的全是不一样的SQL,它会不停地解释、生成同样的计划,浪费资源。用绑定变量 SELECT ... FROM ... WHERE id = ? 以后只要传入不同的变量,DB就知道这是同一个SQL没有必要再解释。
-newkid(newkid);
2007-8-14
(#3868415@0)
-
问题是,难道要把Web Application(WA)里面的所有Query都用一个对应的SP来取代么?High Traffic WA对DB的访问应该都用简单query,我不认为会多花多少系统资源来”不停地解释、生成同样的计划“。
-bdbs(不多不少);
2007-8-14
(#3868546@0)
-
我第一点已经说了:哪怕不用存储过程也要坚持用绑定变量。SQL引擎不能辨认 WHERE ID=123 和 WHERE ID=456,它会认为是两个不同SQL。试想如果几万个用户同时在线会产生多少类似的SQL.如果你不想用垃圾把SQL CACHE塞满就必须用绑定变量。请GOOGLE bind variable
-newkid(newkid);
2007-8-14
(#3868574@0)
-
bind variable 又叫 Placeholders,这下该听说过了吧。B大虾有些言论让我大跌眼镜……跑一个你的例子,让你们DBA检查一下SQL的CACHE,看是不是在重复地解释。
-newkid(newkid);
2007-8-14
(#3868600@0)
-
你真的是来抬杠的呀。这里是在讨论performance还是在讨论sql injection的问题?我也没有否认DB Engine会”重复地解释“呀。我说的是,对于简单query,用bind variable不见得能有什么performance gain。这是就MS SQL来说的。如果一定要用bind variable,对于MS SQL来说实际上还是当SP来处理,省了Bind Variable的一点点好处,但多了处理SP的开销。还要定义变量,给变量赋值。这些都有开销。不知道Oracle是如何处理的。另外,你好好狗一下,bind variable用的比较多的还是Oracle和Oracle developer。这本不是新的东西,不知道为什么其它vendor不跟进,应该是有理由的吧。
-bdbs(不多不少);
2007-8-14
{321}
(#3868706@0)
-
拼装SQL就会有sql injection问题,虽然我一下子举不出例子(咱也不是黑客出身)。performance是附带谈到的。我不是没有狗过的,SQL SERVER仍然应该用BIND VARIABLE(或PLACEHOLDER),为了安全和性能。如果我是你的话,我会搞几个压力测试来比较一下结果。
-newkid(newkid);
2007-8-14
(#3868733@0)
-
用我那方法,绝对可以杜绝sql injection。那是经过实际检验的。
-bdbs(不多不少);
2007-8-14
(#3868755@0)
-
Relying on application server? You must be kidding. Do you mind tell us which application server you are using and what is the data access layer?
-liquid(avaya);
2007-8-14
(#3868907@0)
-
You must be kidding.
-bdbs(不多不少);
2007-8-14
(#3869372@0)
-
Always replace single quote with double single quote of parameters user entered is efficient approach to prevent from SQL injection and attack.
-deep_blue(BLUE);
2007-8-14
(#3868430@0)
-
那要是客户要求输入的数据确实有单引号(而且是合法数据,比如非英语姓名拼写)怎么办?你不能私自篡改数据。用绑定变量就可以把这个数据正确传入了。
-newkid(newkid);
2007-8-14
(#3868442@0)
-
I do not know SQL server... is there bind variable in SQL Server too?
-win(秋天的菠菜);
2007-8-14
(#3868458@0)
-
随便google一下就知道了:http://www.akadia.com/services/ora_bind_variables.html
Bind variables - The key to application performance
...Support for bind variables isn't just limited to Oracle - it's common to other RDBMS platforms such as Microsoft SQL Server...
-newkid(newkid);
2007-8-14
{242}
(#3868484@0)
-
great! thanks for infoing me this
-win(秋天的菠菜);
2007-8-14
(#3868491@0)
-
In SQL server, if there is single quote in user's input and you don't replace it with two quote, it causes sql injection. Actually the first quote escape the second one.
-deep_blue(BLUE);
2007-8-14
(#3868504@0)
-
BTW, how do you enter quote in Oracle?
-deep_blue(BLUE);
2007-8-14
(#3868512@0)
-
如果写在常量里就是两个单引号。如果从变量传进来,我并不需要escape.为了安全和提高性能请坚持使用绑定变量,哪怕不用存储过程。
-newkid(newkid);
2007-8-14
(#3868560@0)
-
auto qualified by AS. #3868366
-bdbs(不多不少);
2007-8-14
(#3868550@0)