Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Sql注入攻击洞察_Php_Sql_Security_Sql Injection - Fatal编程技术网

Php Sql注入攻击洞察

Php Sql注入攻击洞察,php,sql,security,sql-injection,Php,Sql,Security,Sql Injection,以下代码正在添加到我们的站点。下面是它对页面的影响,基本上是打开一个iframe到一个恶意软件站点。上周,我们的网站遇到了这个问题,为了解决这个问题,我们刚刚回滚了数据库和代码库来解决这个问题,它确实做到了。我有一个腐败的版本,我可以与之合作,并正在搜索代码的来源和方式,但我没有想出什么。如果它是通过网站上的某个表单输入的,那么该条目在数据库中会是什么样子?如果它修改了代码库中的文件,为什么我找不到它?我应该找什么?对这一点的任何洞察都会非常有用。我在想我们应该在哪里安上电源 注意:原始脚本没有

以下代码正在添加到我们的站点。下面是它对页面的影响,基本上是打开一个iframe到一个恶意软件站点。上周,我们的网站遇到了这个问题,为了解决这个问题,我们刚刚回滚了数据库和代码库来解决这个问题,它确实做到了。我有一个腐败的版本,我可以与之合作,并正在搜索代码的来源和方式,但我没有想出什么。如果它是通过网站上的某个表单输入的,那么该条目在数据库中会是什么样子?如果它修改了代码库中的文件,为什么我找不到它?我应该找什么?对这一点的任何洞察都会非常有用。我在想我们应该在哪里安上电源

注意:原始脚本没有换行符。此处显示换行符以使代码可读:


站点上的表单如何与数据库交互?他们是创建到DB的直接连接还是使用web服务?如果您直接在数据库上执行查询,那么应该参数化查询

我应该找什么

假设这是一个sql注入问题,而且听起来确实正确,那么您应该在web应用程序代码中查找以下内容:

sql = "SELECT columns FROM SomeTable WHERE SomeColumn=" + someVariable
sql = "SELECT columns" + " FROM SomeTable WHERE SomeColumn= ?"
// Other code to define and set a parameter for SomeColumn goes here
如果您让我们知道您使用的语言,我可能会给出一个更具代表性的示例,但最重要的是,无论您在何处使用字符串连接将来自用户的信息放入sql查询,即使您通过一个函数对其进行清理、清除或转义,您都很容易受到攻击。请注意,这甚至不是insert/update/delete语句。这只是一个select,语义表明sql甚至需要一个数字类型。这无关紧要:攻击者仍然可以使用它来更改数据中的内容

如果您使用的是ORM,您甚至可能只是在构建WHERE子句的一部分,因此它甚至可能是这样的:

filter = "SomeDataField='" + someVariable + "'"
正确的处理方法是使用所谓的参数化查询或预先准备好的语句,这取决于你在操场上和哪个孩子一起玩。它们使用的代码更像这样:

sql = "SELECT columns FROM SomeTable WHERE SomeColumn=" + someVariable
sql = "SELECT columns" + " FROM SomeTable WHERE SomeColumn= ?"
// Other code to define and set a parameter for SomeColumn goes here
请注意,我在那里使用字符串连接只是为了显示,以演示您可以通过这种方式构建查询,但我没有使用它来替代查询中的用户输入。这里需要理解的重要一点是,如果正确地实现了这个方案,用户输入永远不会被直接替换到查询中,甚至在数据库服务器上也不会。相反,它被单独传输,并被数据库引擎当作变量处理

同样,如果我知道您使用的是什么语言/平台,我可能能够提供更好的表示。作为一个例子,我这次将使用一个更新,这里有一种方法可以在使用Sql Server的C中安全地进行更新:

string sql = "UPDATE table SET column= @SomeVariable WHERE ID= @UserID";
using (var cn = new SqlConnection("connection string here"))
using (var cmd = new SqlCommand(sql, cn))
{
    cmd.Parameters.Add("@SomeVariable", SqlDbType.VarChar, 50).Value = someVariable;
    cmd.Parameters.Add("@UserID", SqlDbType.Int).Value = UserID;

    cn.Open();
    cmd.ExecuteNonQuery();
}

有多个网站漏洞扫描程序,用于测试网站上的SQL注入和其他漏洞。 以下是一个简短列表-请查看更大的列表:

此外,还可以查看以下链接:


通常,还需要搜索代码库中的每个SQL命令,并验证没有未初始化的输入发送到数据库

你是如何阻止代码中的sql注入的?互联网上有渗透测试人员-也许会注册他们的服务,让他们在你的web应用程序上试一试?他们会让你知道漏洞在哪里。可能很简单,只要有人知道你的FTP用户名/密码,你的网站就不一定有问题。你也可以检查日志文件。什么数据库和客户端语言?我们可以用这些信息给出更好的例子
string sql = "UPDATE table SET column= @SomeVariable WHERE ID= @UserID";
using (var cn = new SqlConnection("connection string here"))
using (var cmd = new SqlCommand(sql, cn))
{
    cmd.Parameters.Add("@SomeVariable", SqlDbType.VarChar, 50).Value = someVariable;
    cmd.Parameters.Add("@UserID", SqlDbType.Int).Value = UserID;

    cn.Open();
    cmd.ExecuteNonQuery();
}