以下代码是通过SQL和PHP将数据传递到远程数据库时对卫生方法的建议。
$name = strtr(mysqli_real_escape_string($connector_obj, $_POST['name']), '/''', ' ');
我的问题是 MSQLI 运算符会清理输入,然后 strtr 运算符附加使代码仍然安全,还是字段仍然容易受到攻击?此清理是在初始查询之后进行的,因此另一种选择是将值传递给经过净化的数据库,然后在事后执行 strtr 操作以将信息输出到面向客户的页面。
在更高级别的观点上,用户对 MSQLI 转义字符串中的斜杠的观察程度如何?我认为它看起来不那么吸引人,并为那些声誉不佳的人提供对应用程序结构的深入了解,但对这个想法的任何意见将不胜感激。
mysqli_real_escape_string
只转义字符。 它不会消毒。
发布值时,就是清理时间了。
我更喜欢使用整数值。 我请求电话号码,而不是电子邮件地址作为用户名。然后使用正则表达式删除除数值之外的所有值。
$number = preg_replace('/[^'d]/','',$_POST['number']);
如果我正在寻找一个没有空格、逗号、破折号的整数,我只使用:
$number = intval($_POST['number']);
应限定查询中使用的值。
$sql = sprintf("SELECT * FROM `Client` WHERE `Number` = %d", $id);
我还会查看提交的所有内容。寻找通常用于SQL注入攻击的符号和单词。
$strike1 = 1 + preg_match_all('/'x3F/',$SAVE_ID,$matches, PREG_SET_ORDER); // )
$strike2 = preg_match_all('/['x21-'x2F]|['x3A-'x40]|['x5B-'x60]|['x7B-'x7F]/',$SAVE_ID,$matches, PREG_SET_ORDER);
$strike3 = preg_match_all('/'x28/',$SAVE_ID,$matches, PREG_SET_ORDER); // )
$strike4 = preg_match_all('/'x29/',$SAVE_ID,$matches, PREG_SET_ORDER); // (
$strike5 = preg_match_all('/COALESCE|0x|like|regex|mid|select|delete|drop|insert|do|call|replace|update|infile|lock|set|from|into|show|table|kill|reset/i',$SAVE_ID,$matches, PREG_SET_ORDER);
当我看到太多违规行为时,我会禁止IP地址。
@mysql_unbuffered_query("INSERT INTO `Banned` (`ip`, `TimeStamp`,`Strike3`, `Attributes`) VALUES ('$ip', CURRENT_TIMESTAMP, $alert);");
我还监视密码失败。 如果我在短时间内看到太多失败的尝试,或者两次尝试之间的时间太短(不是人为的),我会禁止该IP。