0

目前我正在使用;

<html>
<head>
</head>
<body>
<form name="frmSearch" method="get" action="<?=$_SERVER['SCRIPT_NAME'];?>">
  <table width="599" border="1">
    <tr>
      <th>Keyword
        <input name="txtKeyword" type="text" id="txtKeyword" value="<?=$_GET["txtKeyword"];?>">
        <input type="submit" value="Search"></th>
    </tr>
  </table>
</form>
<?
if($_GET["txtKeyword"] != "")
    {


    $objConnect = mysql_connect("XXXXX","XXXX","XXXX") or die(mysql_error());
    $objDB = mysql_select_db("XXXX");
    // Search By Name or Email
    $strSQL = "SELECT * FROM blogs WHERE (title LIKE '%".$_GET["txtKeyword"]."%' or metadescription LIKE '%".$_GET["txtKeyword"]."%')";
    $objQuery = mysql_query($strSQL) or die ("Error Query [".$strSQL."]");
    $Num_Rows = mysql_num_rows($objQuery);


    $Per_Page = 2;   // Per Page

    $Page = $_GET["Page"];
    if(!$_GET["Page"])
    {
        $Page=1;
    }

    $Prev_Page = $Page-1;
    $Next_Page = $Page+1;

    $Page_Start = (($Per_Page*$Page)-$Per_Page);
    if($Num_Rows<=$Per_Page)
    {
        $Num_Pages =1;
    }
    else if(($Num_Rows % $Per_Page)==0)
    {
        $Num_Pages =($Num_Rows/$Per_Page) ;
    }
    else
    {
        $Num_Pages =($Num_Rows/$Per_Page)+1;
        $Num_Pages = (int)$Num_Pages;
    }


    $strSQL .=" order  by id ASC LIMIT $Page_Start , $Per_Page";
    $objQuery  = mysql_query($strSQL);

    ?>
<table width="600" border="1">
  <tr>
    <th width="91"> <div align="center">CustomerID </div></th>
    <th width="98"> <div align="center">Name </div></th>
    <th width="198"> <div align="center">Email </div></th>
  </tr>
  <?
    while($objResult = mysql_fetch_array($objQuery))
    {
    ?>
  <tr>
    <td><div align="center">
        <?=$objResult["id"];?>
      </div></td>
    <td><?=$objResult["title"];?></td>
    <td><?=$objResult["metadescription"];?></td>
  </tr>
  <?
    }
    ?>
</table>
<br>
Total
<?= $Num_Rows;?>
Record :
<?=$Num_Pages;?>
Page :
<?
    if($Prev_Page)
    {
        echo " <a href='$_SERVER[SCRIPT_NAME]?Page=$Prev_Page&txtKeyword=$_GET[txtKeyword]'><< Back</a> ";
    }

    for($i=1; $i<=$Num_Pages; $i++){
        if($i != $Page)
        {
            echo "[ <a href='$_SERVER[SCRIPT_NAME]?Page=$i&txtKeyword=$_GET[txtKeyword]'>$i</a> ]";
        }
        else
        {
            echo "<b> $i </b>";
        }
    }
    if($Page!=$Num_Pages)
    {
        echo " <a href ='$_SERVER[SCRIPT_NAME]?Page=$Next_Page&txtKeyword=$_GET[txtKeyword]'>Next>></a> ";
    }

    mysql_close($objConnect);

    }   
?>
</body>
</html>

这很好用,但我想让它更安全,这样它就可以承受注入和 xss 攻击等。基本上我需要让它 100% 安全。

我正在尝试将其更改为 PDO,到目前为止我已经获得了以下内容;

$stmt = $pdo->prepare('SELECT * FROM blogs WHERE title LIKE = ?');
$stmt->execute($_POST['txtKeyword']);

我认为这是正确的,因为它与数据库的两个独立交互应该是安全的(我认为?)

问题是;1)我不知道如何实现这个和 2)还需要什么来确保搜索是安全的

我真的很感激任何帮助

4

1 回答 1

-1

首先,execute()构造只需要一个数组,所以你必须这样做

$stmt = $pdo->prepare('SELECT * FROM blogs WHERE title LIKE = ?');
$stmt->execute(array($_POST['txtKeyword']));

其次,如果你想防止 XXS 攻击,你应该只使用htmlspecialchars()函数来清理你的数据,在从数据库输出所有内容的过程中,使用htmlspecialchars()它会转换所有标签,这样你就安全了。

于 2013-07-14T18:16:24.197 回答