今天早些时候,有人询问有关网络应用中输入验证策略的问题.
在撰写本文时,最重要的答案建议PHP只使用htmlspecialchars和mysql_real_escape_string.
我的问题是:这总是足够的吗?还有更多我们应该知道的吗?这些功能在哪里崩溃?
我已经看过这个问题了很多次,但是没有看到一个很好的例子,当参数化查询真的不是一个选项时...但我认为我有一个.
我正在使用Cisco Call Manager AXL API.它的后端是一个Informix DB.通常,只要有可能,我使用提供的SOAP方法来获取结果,因为我使用WSDL创建的接口类并在实际对象属性中传递参数,因此它负责通过SOAP库进行必要的转义.
然而:
我必须对数据库使用直接SQL调用,并且API提供了一种方法,您可以传入SQL查询(作为字符串)并获取结果行.不幸的是,这种方法不能为参数化查询提供任何便利.所以,是的,我实际上需要自己逃避.
那么,当然我可以制作自己的正则表达式,但是A:我很容易错过一些东西,而且B:真的吗?这没有实用工具类?我可以以某种方式使用SQL参数化引擎来吐出转义的查询吗?显然我知道你必须处理',但我已经阅读了关于退格字符注入方法,我确信还有其他我还不知道的......当然其他人已经编写了一个非常安全的版本?
范围:
我正在阅读网络安全性,一个明显的主题是SQL注入.我正在尝试建立一个基本的php页面,我可以在其中执行sql注入(它是一个本地服务器).但是,似乎我的代码(或服务器)自动转义单引号.这是一个新标准还是我的服务器上激活了一个我不知道的设置?是否需要清理输入?
这是我的服务器端代码的示例:
$foo = $_POST['foo'];
$sql = "SELECT * FROM bar WHERE foo='" . $foo . "'";
connectoTo("database");
query($sql);
Run Code Online (Sandbox Code Playgroud)
其中connectTo()连接到数据库服务器并选择数据库,query()是执行查询时使用的常用过程.什么都没有清洁.但是,当我发送时
$_POST['foo'] = "' OR 1=1 #"
Run Code Online (Sandbox Code Playgroud)
php页面收到这个
$_POST['foo'] = "\' OR 1=1 #"
Run Code Online (Sandbox Code Playgroud)
所以foo已经逃脱了?这与$ _GET相同.
有什么想法吗?我们不再需要清理用户输入了吗?
干杯
埃里克
我们继承了一个旧网站,其中包含近2000个不同的手工构建的SQL字符串,直接从httprequests中获取变量.该站点经常受到SQL注入攻击的攻击.显然,这个站点应该使用SQL参数进行编码,以避免这种安全噩梦,但是由于涉及的工作量有所改变,我们正在寻找另一种"清理"传入请求的方法.
主要清洁功能: -
Public Function myRequest(ByRef Request As HttpRequest, ByVal param As String) As String
Return CleanRequest(Request(param))
End Function
Public Function CleanRequest(ByVal requestString As String) As String
Dim badChars() As String = {"select", "drop", ";", "--", "insert", "delete", "xp_", "update"}
Dim newChars As String = requestString
For i = 0 To UBound(badChars)
newChars = Replace(newChars, badChars(i), "", 1, -1, vbTextCompare)
Next
CleanRequest = Replace(newChars, "'", "''")
End Function
Run Code Online (Sandbox Code Playgroud)
这样称呼: -
Dim details As DataSet
detailsSQL = "select * from mytable …Run Code Online (Sandbox Code Playgroud)