有人建议我为我正在设计的项目使用ORM,但是我无法找到有关它是什么或它是如何工作的信息.任何人都可以给我一个简短的解释或链接,我可以在哪里了解更多信息吗?
我一直在研究PDO bindValue().我知道用PDO准备我的SQL语句会阻止SQL注入的发生.
代码示例:
$stmt = $dbh->prepare('SELECT * FROM articles WHERE id = :id AND title = :title');
$stmt->bindValue(':id', PDO::PARAM_INT);
$stmt->bindValue(':title', PDO::PARAM_STR);
$stmt->execute();
Run Code Online (Sandbox Code Playgroud)
通过将ID绑定为数字,并且Title是一个字符串,我们可以限制当有人尝试在代码中执行SQL注入时所造成的损害.
我们是否应该始终将我们的值绑定在一起,PDO::PARAM_以便我们可以限制SQL注入中可以从数据库中提取的内容?这样做是否会增加PDO的安全性bindValue()?
我刚从Visual Studio 2005收到此消息,当我点击删除命令时,我使用界面配置网格添加到我的gridview:
除非指定了DeleteCommand,否则数据源'transactionsSqlDataSource'不支持删除.
我怎么能激活它?我希望我的用户在单击"删除"按钮时能够删除一行.
我已经将我的SQLDataSource的属性DeleteCommandType更改为StoredProcedure.我还需要做什么?
UPDATE
这就是我所做的,但我遗漏了一些东西,我无法编译:
这就是我在.cs所做的:
public string DeleteCommand { get; set; }
Run Code Online (Sandbox Code Playgroud)
我怎么能解决这个问题,它说得到的是身体缺失.我不习惯使用ASP.NET.你能帮我修一下这部分代码吗?
这就是我在.aspx所做的:
<asp:SqlDataSource ID="transactionsSqlDataSource" runat="server" ConnectionString="<%$ ConnectionStrings:membershipsDBConnectionString %>"
SelectCommand="SELECT [brukerId], [kjoptekvoten], [pengeneutbetalt], [fyringsolje], [biltype], [kjoptid] FROM [Informasjon]" DeleteCommandType="StoredProcedure"
DeleteCommand="DELETE FROM [Informasjon] WHERE fyringsolje='Kull: 2,42 kg';">
</asp:SqlDataSource>
Run Code Online (Sandbox Code Playgroud)
数据源的配置是否正确?不要担心,如果你看到删除命令不使用上面的参数,它只是一个功课(我只需要通过查询).
更新2 我一直在尝试,但我无法解决它.我是ASP.NET的新手,我对所有术语都不是很熟悉.到底发生了什么?我如何知道我的商店程序的名称?:
CS:
public string DeleteCommand { get { return DeleteCommand; } set { DeleteCommand = "";}
Run Code Online (Sandbox Code Playgroud)
ASPX:
<asp:SqlDataSource ID="SqlDataSource" runat="server" ConnectionString="<%$ ConnectionStrings:membershipsDBConnectionString %>"
DeleteCommandType="StoredProcedure" SelectCommand="SELECT [id], [kjoptekvoten], [pengeneutbetalt], [fyringsolje], [biltype], [kjoptid] FROM [Informasjon]"
DeleteCommand="StoredProcedureName">
</asp:SqlDataSource>
Run Code Online (Sandbox Code Playgroud)
当我单击Delete时,需要从表 …
如果存储过程旨在缓解SQL注入攻击,为什么在存储过程中允许EXECUTE IMMEDIATE?以下问题的接受答案是将它们作为抵御此类攻击的一步:
什么是存储过程? /sf/answers/32167201/
"存储过程还具有安全性,因为您可以向存储过程授予执行权限,但用户不需要对基础表具有读/写权限.这是针对SQL注入的良好的第一步."
...除非存储过程使用EXECUTE IMMEDIATE.
此PL/SQL代码返回产品的描述(第二个参数).
CREATE OR REPLACE PROCEDURE prodDescr(vname IN VARCHAR2, vresult OUT VARCHAR2) AS
vsql VARCHAR2(4000);
BEGIN
vsql := 'SELECT description FROM products WHERE name=''' || vname || '''';
EXECUTE IMMEDIATE vsql INTO vresult;
END;
Run Code Online (Sandbox Code Playgroud)
恶意用户输入.
A' AND 1=2 UNION SELECT password FROM members WHERE username='admin
Run Code Online (Sandbox Code Playgroud)
生成的查询.
SELECT description FROM products WHERE name='A' OR 1=2 UNION SELECT password FROM members WHERE username='admin'
Run Code Online (Sandbox Code Playgroud)
执行查询时,攻击者获取管理员密码.
正如您所看到的,虽然我们使用了存储过程,但是攻击者仍然可以像使用PHP中的某些SELECT语句连接而不是清理输入那样轻松地利用漏洞.对我来说,向开发人员说存储过程有助于保护数据库安全,这似乎是非常误导的.