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