使用javascript、PHP、MySQL处理html表单时的安全注意事项

使用javascript、PHP、MySQL处理html表单时的安全注意事项,php,javascript,regex,forms,Php,Javascript,Regex,Forms,我不是一个专业的网络开发人员,但我喜欢网络开发作为一种爱好。。 我是一名学生,我被要求制作一个系级活动网站。我需要创建用于用户注册的HTML表单。我知道XSS脚本攻击和SQL注入。但我不知道它们到底是怎么工作的。我在服务器端使用PHP和MySQL 我正在考虑: 不要接受空值 验证数字字段是否仅由整数值组成 电子邮件身份验证。等等 所有这些我都是使用正则表达式检查来完成的——包括javascript和PHP 现在我的问题是: 哪些字符是我不允许进入数据库的 如果我用他们的和替代方案转换,可以

我不是一个专业的网络开发人员,但我喜欢网络开发作为一种爱好。。 我是一名学生,我被要求制作一个系级活动网站。我需要创建用于用户注册的HTML表单。我知道XSS脚本攻击和SQL注入。但我不知道它们到底是怎么工作的。我在服务器端使用PHP和MySQL

我正在考虑:

  • 不要接受空值
  • 验证数字字段是否仅由整数值组成
  • 电子邮件身份验证。等等
所有这些我都是使用正则表达式检查来完成的——包括javascript和PHP

现在我的问题是:

  • 哪些字符是我不允许进入数据库的
  • 如果我用他们的
    替代方案转换,可以吗
  • 在输入时,我还应该考虑什么?
我不想限制用户输入无害的符号。那么,在将值存储到数据库之前,是否需要过滤任何特定的字符集,以便正确地为表单字段编写正则表达式检查


我在谷歌上搜索过,但没有找到正确的答案(

为了防止SQL注入,您应该使用该语言的escape函数。对于PHP,这是
mysql\u real\u escape\u string
。或者更好的是,使用PDO来限制用户可以放入数据库的内容

HTML注入/XSS攻击是不同的;您可以在数据库中存储原始HTML而不会出现问题,但在显示任何源自用户的HTML之前,请在其上调用
htmlspecialcharacters
,以防止客户端的web浏览器对其进行解释


不要编写你自己的自定义检查代码。你会错过一些东西。

为了防止SQL注入,你应该使用该语言的转义函数。对于PHP,这是
mysql\u real\u escape\u string
。或者,更好的是,使用PDO来限制用户可以放入数据库的内容

HTML注入/XSS攻击是不同的;您可以在数据库中存储原始HTML而不会出现问题,但在显示任何源自用户的HTML之前,请在其上调用
htmlspecialcharacters
,以防止客户端的web浏览器对其进行解释


不要为自己的自定义检查编写代码。

对于usename,这应该可以完成以下工作:

if (preg_match('/^[a-z\d_\-<>]{5,20}$/i', $username)) {
    echo "Your username is ok."; 
    // Note that you still have to do something with <>
    // Though, personally I'd advise sticking to /^[a-z\d_]{5,20}$/i
} else {
    echo "Wrong username format.";
}
if(preg_匹配('/^[a-z\d_ \-]{5,20}$/i',$username)){
echo“您的用户名正常。”;
//请注意,您仍然需要对
//不过,我个人建议坚持/^[a-z\d{5,20}$/I
}否则{
回显“错误的用户名格式”;
}


对于SQL注入,在输入数据库的所有内容上使用mysql\u real\u escape\u字符串或mysqli\u real\u escape\u字符串

if (preg_match('/^[a-z\d_\-<>]{5,20}$/i', $username)) {
    echo "Your username is ok."; 
    // Note that you still have to do something with <>
    // Though, personally I'd advise sticking to /^[a-z\d_]{5,20}$/i
} else {
    echo "Wrong username format.";
}
if(preg_匹配('/^[a-z\d_ \-]{5,20}$/i',$username)){
echo“您的用户名正常。”;
//请注意,您仍然需要对
//不过,我个人建议坚持/^[a-z\d{5,20}$/I
}否则{
回显“错误的用户名格式”;
}


至于SQL注入,在数据库中输入的所有内容上都使用mysql_real_escape_string或mysqli_real_escape_string

,如果在将数据输入数据库之前使用一次htmlspecialcharacters,而不是在输出时使用它,那么性能会有所提高:)@idlecool但它的设计并不好。在视图中实际使用数据之前,不应对数据进行处理。@Idlecool:是的,但您不知道数据将在什么上下文中使用。如果您想解析用户发送的HTML并在某处使用它而不显示它,该怎么办?那你就得取消特价了。哦!对我明白了。。。所以我必须在输入数据之前使用mysql\u real\u escape\u字符串,而在输入数据之后使用htmlspecialcharacters。当我也在读有关PDO的文章时:如果在将数据输入数据库之前只使用一次htmlspecialcharacters,而不是在输出时使用它,那么性能会有所提高:)@idlecool,但它的设计并不好。在视图中实际使用数据之前,不应对数据进行处理。@Idlecool:是的,但您不知道数据将在什么上下文中使用。如果您想解析用户发送的HTML并在某处使用它而不显示它,该怎么办?那你就得取消特价了。哦!对我明白了。。。所以我必须在输入数据之前使用mysql\u real\u escape\u字符串,而在输入数据之后使用htmlspecialcharacters。当我也在读有关PDO的文章时: