0

我在网页上有一个搜索表单,我将从放入的内容创建一个动态页面。我已经让它工作了,但还有另一种形式,还有可选择的数据。我希望它只在设置 sku、sku2、txtKeyword2 时显示隐藏字段行。请在下面找到我迄今为止尝试过的内容。

<form name="frmSearch" method="get" action="<?=$_SERVER['SCRIPT_NAME']?>">
  <table width="100%">
    <tr>
      <th><h3>Search    </h3>
            <div class="alert-box">Insert Text for alert box</div>
        <input name="txtKeyword" type="text" id="txtKeyword" value="<?=$_GET["txtKeyword"];?>" size="40">
        <?php if(isset($_GET['sku'])) echo '<input type="hidden" name="sku" value="'.$_GET['sku'].'">'?>
        <?php if(isset($_GET['sku2'])) echo '<input type="hidden" name="sku2" value="'.$_GET['sku2'].'">'?>
        <?php if(isset($_GET['txtKeyword2'])) echo '<input type="hidden" name="txtKeyword2" value="'.$_GET['txtKeyword2'].'">'?>
        <input class="alert button" type="submit" value="Search"></th>
    </tr>
  </table>
</form>

我想要的是它不显示输入行,如果它们没有设置。我认为我做得对,但我不确定我正在学习 php。

我也尝试了以下代码,它确实有效,但它输出了以下网址。

index.php?txtKeyword=giro%25skyline&sku=%09%09<input+type%3D

我知道这不应该发生,但它使我的页面正常工作,但是当我将数据输入到另一个搜索表单时,它会将输入行的一部分添加到 url。这是我尝试过的代码:

<form name="frmSearch" method="get" action="<?=$_SERVER['SCRIPT_NAME']?>">
  <table width="100%">
    <tr>
      <th><h3>Search    </h3>
            <div class="alert-box">Insert text for the alert box</div>
        <input name="txtKeyword" type="text" id="txtKeyword" value="<?=$_GET["txtKeyword"];?>" size="40">
        <input type="hidden" name="sku" value="<?php if(isset($_GET['sku'])) echo ''.$_GET['sku'].'">'?>
        <input type="hidden" name="txtKeyword2" value="<?php if(isset($_GET['txtKeyword2'])) echo ''.$_GET['txtKeyword2'].'">'?>
        <input type="hidden" name="sku2" value="<?php if(isset($_GET['sku2'])) echo ''.$_GET['sku2'].'">'?>
        <input class="alert button" type="submit" value="Search"></th>
    </tr>
  </table>
</form>

我真的很想知道发生了什么,我该如何解决它。

谢谢瑞恩

4

1 回答 1

0
<?php echo isset($_GET['sku']) ? '<input type="hidden" name="sku" value="'.$_GET['sku'].'">' : ''; ?>

但是,仅供参考,这根本不安全。

首先,该代码中可能存在 2 个漏洞:

  1. XSS:如果$_GET['sku']是这样的:"><script>alert('XSS');</script>那么你会在你的页面上看到一个警告框,理论上它可以用于网络钓鱼、cookie 窃取、创建蠕虫(如 SamiWorm)。解决/防止这种情况的一个好方法是使用htmlentities将所有 html 字符编码到它们的关联实体中。

  2. SQL 注入:如果$_GET['sku']是这样的' UNION ALL SELECT id,username,password FROM users LIMIT 0,1--话,您的数据库可能会被盗(特别是如果有人决定使用 SQLMap 之类的工具,它是一种自动 SQL 注入工具)。解决此问题的一个好方法是在转义任何不允许的字符的参数上使用mysql_real_escape_string()

所以更好的方法是这样的:

 <?php echo isset($_GET['sku']) ? '<input type="hidden" name="sku" value="'.htmlentities(mysql_real_escape_string($_GET['sku'])).'">' : ''; ?>

这就是您的代码不起作用的原因:

  1. 您试图让 PHP 评估您的结束 html 标记:">在您的 php echo 内部将不起作用,因为它不知道如何解析它。

  2. 与short-if相比,使用三元运算符更容易,因为恕我直言,它们更容易被其他人读/写。

这是我的完整版本:

<form name="frmSearch" method="get" action="<?php echo $_SERVER['SCRIPT_NAME']; ?>">
  <table width="100%">
    <tr>
      <th><h3>Search    </h3>
        <div class="alert-box">Insert text for the alert box</div>
        <input name="txtKeyword" type="text" id="txtKeyword" value="<?php echo isset($_GET["txtKeyword"]) ? htmlentities(mysql_real_escape_string($_GET["txtKeyword"]))) : ''; ?>" size="40">
        <input type="hidden" name="sku" value="<?php echo isset($_GET['sku']) ? htmlentities(mysql_real_escape_string($_GET['sku'])) : ''; ?> ">
        <input type="hidden" name="txtKeyword2" value="<?php echo isset($_GET['txtKeyword2'])) ? htmlentities(mysql_real_escape_string($_GET['txtKeyword2'])); ?>">
        <input type="hidden" name="sku2" value="<?php echo isset($_GET['sku2']) ? htmlentities(mysql_real_escape_string($_GET['sku2'])); ?> ">
        <input class="alert button" type="submit" value="Search"></th>
    </tr>
  </table>
</form>
于 2013-07-22T09:49:21.217 回答