Php 即使在经过验证的输入上,我也需要检查sql注入吗?

Php 即使在经过验证的输入上,我也需要检查sql注入吗?,php,javascript,mysql,html,security,Php,Javascript,Mysql,Html,Security,这是关于分类广告网站。。。 我使用PHP和MySql将记录插入数据库 我有一个HTML表单,用户必须填写此表单才能继续 下面是表单输入和对每个输入进行的验证(javascript): 名称(仅允许字母) 电话(仅限号码) 电子邮件(特殊电子邮件regexp匹配) 标题(不允许使用特殊字符,其他都可以。我所说的特殊字符是指!(#)等。最大长度为35个字符。) 文本(与标题相同,只是长度没有限制) 价格(只允许数字) 我在标题和文本中使用了mysql\u real\u escape\u string

这是关于分类广告网站。。。 我使用PHP和MySql将记录插入数据库

我有一个HTML表单,用户必须填写此表单才能继续

下面是表单输入和对每个输入进行的验证(javascript):
名称(仅允许字母)
电话(仅限号码)
电子邮件(特殊电子邮件regexp匹配)
标题(不允许使用特殊字符,其他都可以。我所说的特殊字符是指
!(#)
等。最大长度为35个字符。)
文本(与标题相同,只是长度没有限制)
价格(只允许数字)

我在标题和文本中使用了
mysql\u real\u escape\u 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åäöÅÄÖ&()+%\/*$€é:,.'"-]*$/;

你根本不应该使用。现在是2010年,这是一条路。

用户可以绕过Javascript中实现的所有安全措施,例如关闭它、删除侦听器或修改代码。不要依赖那里的客户

要检查的用户提供的所有信息。在用户发送之前执行JavaScript。我不需要运行JavaScript代码来发送POST请求。

在几乎所有情况下,当涉及到安全问题时,“我真的需要…”的默认答案是“是的,绝对需要”


上面的代码来自PHP库。不要再为
mysql\u real\u escape\u string()
操心了,试着将准备好的语句与SQL查询结合起来

我没有其他任何安全措施

安全性必须分层实现。很多时候,程序员不理解这一点,因为这超出了他们的权限(大多数人都有“如果它编译了,就发布它”的口号)。您必须在每个合理的点实施安全性。你永远都不能相信用户的输入,尤其是当它在WildWeb上看到的时候。正则表达式检查、已知注入检查以及服务器和应用程序强化是必不可少的


请注意,随附了合理性标准。有时很容易出现安全问题或过度杀伤力。由您和其他项目干系人决定需要实施哪些级别的预防措施。时间和材料都与之相关,因此如果你在安全实现上花费100000美元,但只得到80000美元的回报,那么这是自欺欺人的。

这里很多人都在谈论绕过javascript,但我想更进一步,向你展示它是如何做到的,因为上下文决定了一切。这里有一个Firefox插件,我喜欢在进行渗透测试或类似测试时使用它:


正如已经说过无数次的那样,客户端验证是好的,因为您可以使用它们来防止行为良好的用户用错误的请求攻击您的服务器,但是每个验证客户端也必须镜像到服务器端。是的,准备好的声明是你的朋友。此外,还要清理数据库中的任何内容,因为这是很多人忘记的步骤。

如果用户关闭JavaScript怎么办?“特殊电子邮件regexp匹配”让我害怕,因为很多人都搞错了。名称中只允许使用字母是不正确的。regexp正在更新中。。。我的意思是一般来说,但检查regexp是否正确请…+1,甚至完全绕过JavaScript代码,手工制作一个带有虚假输入值的POST请求。
<?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();
?>