即使在经过验证的输入上,我是不是也需要检查 sql 注入?
Posted
技术标签:
【中文标题】即使在经过验证的输入上,我是不是也需要检查 sql 注入?【英文标题】:Do I need to check for sql injection even on validated inputs?即使在经过验证的输入上,我是否也需要检查 sql 注入? 【发布时间】:2011-05-21 03:22:24 【问题描述】:这是关于分类广告网站... 我使用 php 和 mysql 将记录插入数据库。
我有一个 html 表单,用户必须填写此表单才能继续。
以下是表单输入和对每个输入进行的验证(javascript):姓名(只允许使用字母)电话(仅允许数字)电子邮件(特殊电子邮件-正则表达式匹配)标题(不允许特殊字符,其他都可以。通过特殊字符,我的意思是 !(#)<>
等。最大长度为 35 个字符。)文本(与标题相同,只是没有长度限制)价格(仅限数字允许)
我在标题和文本上写mysql_real_escape_string()
,但没有别的。
我的问题很简单,这够了吗?
我没有任何其他安全措施。
更新
var alphaExp = /^[a-zA-ZåäöÅÄÖ\s\-]+$/;
var numExp = /^(?=(?:\D*\d)0)[\d -]0,20$/;
var num_only = /^[0-9]+$/;
var emailExp = /^[\w\-\.\+]+\@[a-zA-Z0-9\.\-]+\.[a-zA-z0-9]2,4$/;
var textExp = /^\s*([\wåäö\-\*][^\w]*)3.*$/gmi;
var headlineExp = /^[\s\da-zA-ZåäöÅÄÖ&()+%\/*$€é:,.'"-]*$/;
【问题讨论】:
如果用户关闭 javascript 会怎样? “特殊的电子邮件正则表达式匹配”让我害怕,因为很多人都弄错了。并且只允许名称中的字母是不正确的。 正则表达式在更新中...我的意思是一般,但请检查正则表达式是否正确... 【参考方案1】:在 Javascript 中实现的所有安全措施都可以被用户规避,例如通过关闭它、删除侦听器或弄乱代码。不要依赖那里的客户!
【讨论】:
+1 甚至完全绕过您的 JavaScript 代码并使用虚假输入值手工制作 POST 请求。【参考方案2】:我没有任何其他安全措施。
安全必须分层实施。很多时候,程序员不理解这一点,因为它超出了他们的权限(大多数人都有“如果它编译,就发布它”的口头禅)。您必须在每个合理的点实施安全措施。您永远不会相信用户输入,尤其是当它使用 Wild Wild Web 时。正则表达式检查、已知注入检查以及服务器和应用程序强化是必不可少的。
请注意,附有合理性标准。有时很容易拥有安全剧院或矫枉过正。由您和其他项目利益相关者决定实施哪些级别的预防措施。时间和材料是有成本的,所以如果你在安全实施上花费了 100,000 美元,却只获得了 80,000 美元的回报,那就是弄巧成拙了。
【讨论】:
【参考方案3】:来自用户的所有内容都将被检查。 JavaScript 在用户发送之前执行。我不需要运行您的 JavaScript 代码来发送 POST 请求。
【讨论】:
【参考方案4】:您根本不应该使用MySQL Extension。现在是 2010 年,PDO 是要走的路。
【讨论】:
【参考方案5】:在几乎所有情况下,当涉及安全问题时,“我真的需要...”的默认答案是“是的,绝对是”。
<?php
/* Execute a prepared statement by passing an array of values */
$sql = 'SELECT name, colour, calories
FROM fruit
WHERE calories < :calories AND colour = :colour';
$sth = $dbh->prepare($sql, array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY));
$sth->execute(array(':calories' => 150, ':colour' => 'red'));
$red = $sth->fetchAll();
$sth->execute(array('calories' => 175, 'colour' => 'yellow'));
$yellow = $sth->fetchAll();
?>
以上代码来自 PHP 库中的this page。不要再为mysql_real_escape_string()
操心了,尝试将准备好的语句与您的 SQL 查询结合起来。
【讨论】:
【参考方案6】:这里很多人都在谈论绕过你的 javascript,但我想更进一步,向你展示它是如何完成的,因为上下文决定了一切。这是我在进行渗透测试或类似的事情时喜欢使用的一个 Firefox 插件:Groundspeed。
正如一百万次所说的那样,客户端验证很好,因为您可以使用它们来防止表现良好的用户向您的服务器发出错误请求,但是每个验证客户端也必须镜像服务器端.是的,准备好的陈述是你的朋友。此外,还要清理从数据库中流出的任何内容,因为这是很多人忘记的步骤。
【讨论】:
以上是关于即使在经过验证的输入上,我是不是也需要检查 sql 注入?的主要内容,如果未能解决你的问题,请参考以下文章
如何检查用户是不是经过身份验证以访问特定路径(MEAN STACK)