代码之家  ›  专栏  ›  技术社区  ›  foobarfuzzbizz

如何确保用户的数据在php和mysql中有效?

  •  0
  • foobarfuzzbizz  · 技术社区  · 15 年前

    我有一个Web表单,它从用户那里获取2个字符串值和2个整数值,并将它们存储在数据库中。

    我如何确保ints实际上是ints和sanitze输入,以便 Bobby Tables 不来看我吗?

    这是我的表单代码:

    if(isset($_POST['submit']))
    {
        $formTitle = $_POST['title'];
        $formAuthor = $_POST['author'];
        $formPagecount = $_POST["pagecount"];
        $formCurrentpage = $_POST["currentpage"];   
    }
    
    <form method="post" action="index.php">
        Title: <input type="text" size="25" maxlength="250" name="title" />
        <br/>
        Author: <input type="text" size="25" maxlength="250" name="author" />
        <br/>
        Page Count: <input type="text" size="25" maxlength="25" name="pagecount" />
        <br/>
        Current Page: <input type="text" size="25" maxlength="25" name="currentpage" />
        <br />
        <input type="submit" value="Add new book" name="submit" />
    </form>
    
    5 回复  |  直到 15 年前
        1
  •  3
  •   Steven    15 年前

    清理数据库的输入可以使用 prepared statements

    您可以使用 type checking functions

        2
  •  1
  •   Pascal MARTIN    15 年前

    您可能需要检查/执行以下几项:

    • 确认已提交表单: isset $_POST 组件将有帮助
    • 检查您的数据是否“有效”:
      • 用户是否在每个字段中输入了数据?
      • 所需字段是否包含数据?
      • 别忘了 trim 在检查之前,因此包含“”的字段不算作包含数据的字段
    • 检查您的数据实际上是您想要的方式:
      • 标题和作者是否包含字符串?超过x个字符?缩短Y字符?有“Fordibben”字符或值吗?
      • 其他两个字段是否包含数字数据?积极的?只有数字(没有什么像3e5或类似的)不大于你认为可以吗?

    有些框架可以帮助您完成所有这些工作。
    例如:

    (您重复使用现有的伟大代码越多,对您的应用程序越好,我会说:使用新的、未经测试的代码引入bug的风险越小;-)


    一旦确定数据是正常的,就可以将其插入数据库。
    这意味着你必须正确地逃离它。
    根据您使用的函数/类,您将了解


    最后,如果数据没有成功验证,您可能需要重新回送表单,其中的字段已经包含用户第一次键入的内容。

    在这里,您需要将数据转义为HTML格式,以避免XSS。看一看 htmlspecialchars

    同样,顺便说一句,如果您想在应用程序的其他地方的另一个屏幕上显示这些数据…

        4
  •  0
  •   Till Theis    15 年前

    检查用户输入数据是否仅由数字组成的唯一安全方法是(1)使用正则表达式或(2)使用 ctype-extension (最好)。

    if (ctype_digit($_POST['pagecount'])) {
        // ...
    }
    

    如果将整数值插入数据库,则不必转义它们,但要确保它们确实是整数(强制转换);对于字符串,应使用 mysql_real_escape_string 但使用准备好的语句从来都不是错误的(但通常更好)。

    顺便说一句 :检查提交按钮是不安全的,因为ie<=6仅在单击提交表单时发送(如果通过Enter键提交表单,则不发送)。

        5
  •  0
  •   A B    15 年前

    PDO及其准备好的声明将使您省去头痛,即使它们一开始看起来更复杂。对于整数,您可以使用intval($input),但请记住,以其无限的智慧,PHP将把非数字输入转换为0。