0

我在插入 MySql 时的方法

我想我在 stackoverflow.com 中读到“如果您需要转义或类似操作,请及时执行”,因此在验证页面中我验证了用户输入(空或不检查、长度检查和结构检查(例如:邮件结构,自定义标签结构);我使用$_POST['']变量作为输入。在验证期间,即使在自定义错误打印部分,我的错误消息也不包含$_POST['']消息文本中的任何值。

作为临时说明:我使用准备好的语句和php-MySql 交互期间的参数化查询。如果验证输入;就在 INSERT'ing INTO MySql 之前,我从输入中删除标签,因为我不允许除自定义结构化标签以外的任何 html 标签。(例如**bold text** === <strong>bold text</strong>) 然后我将用户输入插入 MySql 数据库。

从 MySql 获取并将输出打印到屏幕时的我的方法

我只应用 htmlspecialchars() 命令从 MySql db 打印到屏幕

我的问题

我不确定自己。我的方法有什么明显或隐藏的弱点吗?提前感谢 php 大师的宝贵意见。BR

更新

在插入 MySql 数据库期间我不会剥离标签。原因请参考下方 ÁlvaroG.Vicario 的评论。BR。

4

2 回答 2

1

到目前为止的讨论都是关于防止 SQL 注入和持久性跨站点脚本。听起来你在正确的轨道上。

  • 您使用准备好的语句是对抗 SQL 注入的“最佳实践”。
  • htmlspecialchars() 是防止 XSS 的良好开端,但您必须在适合您输出数据的位置的编码方案中转义数据。OWASP 有一个全面的页面来讨论这个问题:XSS(跨站点脚本)预防备忘单。简短的回答:确保您使用的是“ the escape syntax for the part of the HTML document you're putting untrusted data into.
于 2013-04-01T15:44:35.987 回答
0

我在 trial.php 中尝试了下面的代码

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" lang="tr"> 
<head> 
<title>trial</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 
<meta http-equiv="Content-Language" content="tr" /> 
<meta name="Description" content="trial page." /> 
<meta name="Robots" content="noindex, nofollow" />
</head>
<body>
<?php
$str1 = '<script>alert(\'inside of input with quote\')</script>';
$str2 = '<script>alert("inside of input with quote")</script>';
$str3 = "<script>alert(\"inside of input with quote\")</script>";
$str4 = '<script>alert("outside of form")</script>';
?>
<form method="post" action="">
    <fieldset>
        <legend>alert attempts inside form inputs</legend>
        <label for="input1">label 1:</label><br />
        <input type="text" value="<?php echo htmlspecialchars($str1) ; ?>" name="input1" id="input1" /><br /><br />

        <legend>attempt 2</legend>
        <label for="input2">label 2:</label><br />
        <input type="text" value="<?php echo htmlspecialchars($str2) ; ?>" name="input2" id="input2" /><br /><br />

        <label for="input3">Label 3:</label><br />
        <input type="text" value="<?php echo htmlspecialchars($str3) ; ?>" name="input3" id="input3" />
    </fieldset>
</form>    
<?php echo htmlspecialchars($str4) ; ?>
</body>
</html>

trial.php 的结果

  1. 用户关心的内容没有中断,因此用户数据没有损坏
  2. 我确切地看到了用户关心在屏幕上输入的内容
  3. 脚本警报不起作用

插入 MySQL 并从 MySQL 获取并将输出打印到屏幕时产生的过程

  1. 在 php-MySQL 交互期间利用准备好的语句和参数查询。在 INSERT'ing INTO MySQl db 时,这种方法已经防止了 SQL 注入,因此无需额外的转义。额外的努力strip_tags()会破坏用户真正关心的打字,就像htmlspecialchars()ORhtmlentities()也会做的那样。
  2. 在从 MySQL 数据库中获取数据的同时也利用准备好的语句和参数查询
  3. 在将用户输入的数据打印到屏幕上时,使用 htmlspecialchars()这样用户完全关心的输入不会中断,并且可能的恶意特殊字符将被转换为相应的 HTML 实体
于 2013-04-01T12:23:53.590 回答