我让用户输入一些信息(姓名,出生日期等)。然后我必须将这些值插入数据库。我应该使用mysql_real_escape_string()
来阻止mysql注入和htmlspecialchars()
来处理html标签吗?他们都需要或者其中一个会这样做吗?
如果我只使用其中一个,那么哪一个? 如果我应该同时使用两者,那么首先使用哪一个,哪一个最后?
答案 0 :(得分:4)
我应该使用mysql_real_escape_string来阻止mysql注入
没有。 Use prepared statements and parameterized queries。这将要求您停止使用过时的mysql_*
库,以支持更现代的东西(如PDO)。
和htmlspecialchars来处理html标签,或者其中一个可以完成工作吗?
使用htmlspecialchars
将protect against XSS attacks when数据插入HTML文档。数据库不是HTML文档。 (您可能稍后将数据从数据库中取出以将其放入HTML文档中,这是使用htmlspecialchars
)的时间。
答案 1 :(得分:1)
否mysql_real_escape_string()
!您应该使用PDO。它使用预处理语句,它不会受到注入攻击的攻击,因为MySQL先被赋予了未参数化的SQL,然后才能插入数据。
例如:
$dbh = new PDO();
$stmt = $dbh->prepare('INSERT INTO data (something) VALUE(:userInput)');
// No mysql_real_escape_string necessary
$stmt->execute(array(
':userInput' => $_POST['userInput']
));
htmlspecialchars()
不应该用于所有输入,但应该使用它!尽管通常在从数据库中检索数据之后应用(尽管之后如果之后忘记它可能是一个好主意),但是对于用户输入而言,它将回显到HTML页面中。它可以保护您免受XSS(跨站点脚本)攻击,恶意用户可以将包含恶意代码的<script>
标记添加到您站点的输入字段中。当其他用户访问此恶意用户发布的页面时,他们的浏览器将解释恶意脚本,这可能会执行诸如窃取会话ID或尝试CSRF(跨站点请求伪造)之类的事情。
底线:您应该在将任何用户内容回显到您的网页之前使用它。除非该内容已通过严格的过滤器验证(例如,对于仅接受mm / dd / yy的出生日期)。如果你不确定,那么无论如何都要使用它。它不会受伤。它只会有所帮助!
进一步阅读: