Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/283.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 更新查询以打击谷歌机器人黑客攻击_Php_Mysql_Sql - Fatal编程技术网

Php 更新查询以打击谷歌机器人黑客攻击

Php 更新查询以打击谷歌机器人黑客攻击,php,mysql,sql,Php,Mysql,Sql,我在php中有一段代码,我在其中剪辑女性产品或任何其他产品的链接。单击该代码,我将进入下一页,并在querystring中传递产品名称。 然后在下一页中,我将使用我的sql查询,它将为我提供您在第一页上单击的产品列表。在我的项目中有很多类似于此的查询。此查询很容易被Google bots通过sql注入进行黑客攻击。下面是代码 <html> <head> </head> <body> <ul id="list">

我在php中有一段代码,我在其中剪辑女性产品或任何其他产品的链接。单击该代码,我将进入下一页,并在querystring中传递产品名称。 然后在下一页中,我将使用我的sql查询,它将为我提供您在第一页上单击的产品列表。在我的项目中有很多类似于此的查询。此查询很容易被Google bots通过sql注入进行黑客攻击。下面是代码

<html>
<head>
</head>
<body>
<ul id="list">
            <li><h3><a href="search.php?name=women-top">tops</a></h3></li>
            <li><h3><a href="#">suits</a></h3></li>
            <li><h3><a href="#">jeans</a></h3></li>
            <li><h3><a href="search.php?name=women">more</a></h3></li>
            </ul>
</body>
</html

“width=“200px”height=“200px”/>

我上面使用的查询很容易被Google Bot攻击。请指导我应该在这个查询中更改什么,这样Google Bot就不能用mysql注入攻击我的应用程序。我的应用程序中还有一些类似的查询。请大家帮我解决这个问题。

这对SQL注入开放的原因是你没有跳过输入

例如,您有以下行:-

$parts[] = '`PNAME` LIKE "%'.$lcSearchWord.'%"';
如果有人使用了如下链接(忽略编码以使其在URL中工作):-

您将使用的SQL类似于:-

SELECT * FROM xml WHERE  (`PNAME` LIKE "%fred%' UNION SELECT * FROM users #%")limit '.$offset.', '.$limit1.'
然后,他们可以执行一个查询,从另一个表(可能包含密码的表等)获取数据,只需耐心地获取正确的列数等

如果您切换到mysqli,您可以使用参数化查询,但是当SQL本身发生变化时,这些都是一个小问题(就像您在本例中使用数量可变的LIKE语句时所做的那样)

简单的解决方案是对SQL中使用的变量使用mysql\u real\u escape\u string()/mysqli\u real\u escape\u string()

foreach( $lcSearcharr as $lcSearchWord )
{
    $parts[] = '`PNAME` LIKE "%'.mysql_real_escape_string($lcSearchWord).'%"';
    $parts1[] = '`TAGS` LIKE "%'.mysql_real_escape_string($lcSearchWord).'%"';
    //$parts[] = '`CATEGORY` LIKE "%'.mysql_real_escape_string($lcSearchWord).'%"';
}
如果可以的话,切换到mysqli是值得的

编辑

使用mysqli_389;()和一个类和函数来处理变量数量的参数来使用脚本

<?php
session_start();

$mysqli = new mysqli('localhost', 'root', '', 'shop');

if(mysqli_connect_errno()) 
{
    echo "Connection Failed: " . mysqli_connect_errno();
}

?>
<html>
<head>
</head>
<body>
<?php

if (array_key_exists('name', $_GET))
{
    $lcSearchVal = $_GET['name'];

    $lcSearcharr = explode("-",$lcSearchVal);
    $result = count($lcSearchVal);

    $parts = array();
    foreach( $lcSearcharr as $lcSearchWord ){
        $parts[] = "%$lcSearchWord%";
    }

    $bindParam = new BindParam(); 

    $parms = array();
    foreach($parts as $aPart)
    {
        $parms[] = ' PNAME LIKE ? '; 
        $bindParam->add('s', $aPart); 
    }

    $query = 'SELECT IMAGEURL FROM xml where '.implode(' OR ', $parms); 

    $stmt = $mysqli->prepare($query);

    if ($stmt)
    {

        call_user_func_array(array($stmt, "bind_param"), refValues($bindParam->get())); 

        if ($stmt->execute()) 
        {
            while ($row = $stmt->fetch()) 
            {
                echo '<div class="image"><img src="'.$row['IMAGEURL'].'" width="200px" height="200px"/></a>';
            }
        }
        else
        {
            echo $mysqli->error;
        }

        $stmt->close();

        $mysqli->close();
    }
    else
    {
        echo $mysqli->error;
    }
}
else
{
?>
<ul id="list">
    <li><h3><a href="search.php?name=women-top">tops</a></h3></li>
    <li><h3><a href="#">suits</a></h3></li>
    <li><h3><a href="#">jeans</a></h3></li>
    <li><h3><a href="search.php?name=women">more</a></h3></li>
</ul>
<?php
}
?>
</div>
</body>
</html>

<?php

function refValues($arr)
{ 
    if (strnatcmp(phpversion(),'5.3') >= 0) //Reference is required for PHP 5.3+ 
    { 
        $refs = array(); 
        foreach($arr as $key => $value) $refs[$key] = &$arr[$key]; 
        return $refs; 
    } 
    return $arr; 
} 

class BindParam
{ 

    private $values = array(), $types = ''; 

    public function add( $type, $value )
    { 
        $this->values[] = $value; 
        $this->types .= $type; 
    } 

    public function get()
    { 
        return array_merge(array($this->types), $this->values); 
    } 
} 
?>


首先,你应该停止使用
mysql
。它已被弃用,这意味着没有更多的支持,在最新版本的PHP中也不可用。其次,你应该将
mysqli
PDO
与准备好的语句一起使用。它们有助于防止SQL注入。'k.代替mysql,我应该使用mysqli,ryt?,我也应该使用准备好的语句为此…是的,请用准备好的语句查看这篇nice for
mysqli.*
。@ICanHasCheezburger-我将在几分钟后用您的文章更新我的代码片段。请检查它是否是来自谷歌机器人攻击的安全代码…StackOverflow是用于解决问题,而不是检查代码。有一个专门用于此目的的网站-。我建议您将升级您的mysql代码,并在该网站上发布一个新问题。他们会告诉您您的代码是否足够安全。请查看我更新的代码一次。这是一个安全的sql命令还是仍然有问题看起来是这样的,尽管这将取决于是否从用户输入中获取$limit、$limit1和$offset。即使删除了t这些变量也不起作用。您的意思是脚本不起作用(脚本存在问题-例如,您在底部循环$nameArray2的内容,但没有循环的右括号-在输出部分页面后,您还有会话_start()),或者您的意思是人们仍然可以使用sql注入攻击该页面?我编辑了我的帖子,但prepare语句中仍然存在一些错误。我无法发现错误。请更正错误,先生。。
foreach( $lcSearcharr as $lcSearchWord )
{
    $parts[] = '`PNAME` LIKE "%'.mysql_real_escape_string($lcSearchWord).'%"';
    $parts1[] = '`TAGS` LIKE "%'.mysql_real_escape_string($lcSearchWord).'%"';
    //$parts[] = '`CATEGORY` LIKE "%'.mysql_real_escape_string($lcSearchWord).'%"';
}
<?php
session_start();

$mysqli = new mysqli('localhost', 'root', '', 'shop');

if(mysqli_connect_errno()) 
{
    echo "Connection Failed: " . mysqli_connect_errno();
}

?>
<html>
<head>
</head>
<body>
<?php

if (array_key_exists('name', $_GET))
{
    $lcSearchVal = $_GET['name'];

    $lcSearcharr = explode("-",$lcSearchVal);
    $result = count($lcSearchVal);

    $parts = array();
    foreach( $lcSearcharr as $lcSearchWord ){
        $parts[] = "%$lcSearchWord%";
    }

    $bindParam = new BindParam(); 

    $parms = array();
    foreach($parts as $aPart)
    {
        $parms[] = ' PNAME LIKE ? '; 
        $bindParam->add('s', $aPart); 
    }

    $query = 'SELECT IMAGEURL FROM xml where '.implode(' OR ', $parms); 

    $stmt = $mysqli->prepare($query);

    if ($stmt)
    {

        call_user_func_array(array($stmt, "bind_param"), refValues($bindParam->get())); 

        if ($stmt->execute()) 
        {
            while ($row = $stmt->fetch()) 
            {
                echo '<div class="image"><img src="'.$row['IMAGEURL'].'" width="200px" height="200px"/></a>';
            }
        }
        else
        {
            echo $mysqli->error;
        }

        $stmt->close();

        $mysqli->close();
    }
    else
    {
        echo $mysqli->error;
    }
}
else
{
?>
<ul id="list">
    <li><h3><a href="search.php?name=women-top">tops</a></h3></li>
    <li><h3><a href="#">suits</a></h3></li>
    <li><h3><a href="#">jeans</a></h3></li>
    <li><h3><a href="search.php?name=women">more</a></h3></li>
</ul>
<?php
}
?>
</div>
</body>
</html>

<?php

function refValues($arr)
{ 
    if (strnatcmp(phpversion(),'5.3') >= 0) //Reference is required for PHP 5.3+ 
    { 
        $refs = array(); 
        foreach($arr as $key => $value) $refs[$key] = &$arr[$key]; 
        return $refs; 
    } 
    return $arr; 
} 

class BindParam
{ 

    private $values = array(), $types = ''; 

    public function add( $type, $value )
    { 
        $this->values[] = $value; 
        $this->types .= $type; 
    } 

    public function get()
    { 
        return array_merge(array($this->types), $this->values); 
    } 
} 
?>