Search Results for 'number of members is wrong'
-
AuthorSearch Results
-
May 8, 2010 at 11:58 pm #77273
In reply to: Here come the spammers!!!
foxlyParticipantPART 2 – DEFEATING SPAMMERS
In the last post I covered why and how spammers attack BP installations. This post will cover how I propose to counter them.
Fast Attacks -vs- Slow Attacks
There are two basic kinds of spam attacks that get run on social networks: “fast” or “flood” attacks, and “slow” attacks.
In a fast attack, the spammer signs up for an account on the site, then sends thousands of messages as quickly as possible.
Obviously, the site admin will be deluged with complaints about the spam user and quickly delete their account …but in the hours (or days) it takes the admin to respond, hundreds and hundreds of people will read the spam messages. Then the spammer signs up for another account, and repeats the process.
In a “slow” attack, the spammer signs up for *hundreds* of accounts on the system, often over a period of many months, and only sends out spam messages one at a time …often days, weeks, or months apart.
“Slow” attacks are very difficult to counter using automation …at least without annoying legitimate users.
The best way people have come up with so far is just a “report spam” button which, when clicked, reports the member to an admin so they can investigate it and if necessary delete the account. This will be implemented as part of @francescolaffi ‘s BP content moderation plugin in a couple of months.
Unfortunately, a “report spam” button doesn’t work well against “fast” attacks.
This is because:
a) There is a delay while the admin responds to manually submitted spam reports, or,
b) When a consensus scheme is used (if X users report a member their account gets suspended), there is a delay while enough votes are accumulated to flag the member as a spammer.During that time, people are reading the spam messages and the spammer is winning.
Goals of Proposed BP Core Anti-Spam Mods
The goal of the proposed core modifications is to counter “fast” attacks by the following means:
1) To make it difficult for a spammer to create large numbers of member accounts using automated means.
2) To make it difficult for a spammer that already has a member account to use automated means to:
a) send large volumes of PM’s
b) send large numbers of friend requests
c) create large numbers of groups
d) create large numbers of group posts
e) post large numbers of comments
f) post large numbers of status updates3) To accomplish 1) and 2) without being annoying to legitimate users.
4) To make the system configurable, so it can be adapted to the needs of the site …for example: visually impaired users, or display on mobile phones.
5) To make the system “on by default” and “secure by default”
How We Can Accomplish This
1) New User Sign-up
a) Add a captcha on the new account sign-up screen.
b) If the “user” gets the captcha wrong on the first try, require *TWO* captchas to be solved before they can proceed. (If the odds of a bot solving ONE captcha with OCR are 1 in 100, the odds of the bot solving TWO captchas with OCR are 1 in 10,000. This is a technique Gmail uses.)…set X to be a random number on each installation between 3 and 7…
c) If the user gets X captchas wrong in a row, block their IP for a random amount of time (15 minutes to 2 hours). (This is what Craigslist does)
d) If the user fails X captchas *again* after being blocked, permanently ban their IP and post it to akismet.
e) If a locally banned IP tries to sign-up, don’t throw an “error page”. Completely ignore the request and don’t send anything.
f) If an akismet banned IP tries to sign up, require *TWO* captchas to be solved on the first try, and if they get X captchas wrong in a row, permanently ban their IP and repost it to akismet.
g) Add an option field to the admin menu that limits the number of accounts that can be created per IP address. By default, set it at 2.2) Existing User Sign-In
a) Use a “normal” password box on first sign-in attempt.
b) If the member gets their password wrong on the first try, require them to solve a captcha on the second try. Offer password recovery option.
c) If the member gets their password wrong on the second try, require *TWO* captchas to be solved before they can proceed. Offer password recovery option.…set X to be a random number on each installation between 3 and 7…
d) If the user gets X logins / captchas wrong in a row, block the visitor’s IP for a random amount of time (15 minutes to 2 hours).
3) Private Messages
a) Add a field to the user table that allows PM limiting to be bypassed or set to a unique value on a user-per-user basis.
b) Add three option fields on the admin menu: allow “X” messages to be sent every 24 hours, averaged over the past “Y” hours with “Z” hysteresis
…when BP is installed, randomly set X, Y, and Z to allow a daily maximum of between 18 and 24 messages, averaged over between 2 and 24 hours, +/- 3 messages.
c) If the maximum is exceeded, require the member to solve a captcha before they can send another PM.
d) If they get the first captcha wrong, require them to solve two captchas before they can send another PM.…set R to be a random number on each installation between 3 and 7…
e) If the user gets R captchas wrong in a row, block their IP for a random amount of time (15 minutes to 2 hours). (This is what Craigslist does)
f) If the user fails R captchas *again* after being blocked, permanently ban their IP and post it to akismet.
g) If a locally banned IP tries to visit the site, don’t throw an “error page”. Completely ignore the request and don’t send anything.Consider how difficult the algorithm above makes it to send automated messages. A spammer can’t just send “12 messages a day” or “1 message an hour” and avoid triggering the system. Every BP installation will have a unique combination that will cause it to trip. Yet for a “normal” user, the system will hardly ever trip, and if it does, it takes all of 5 seconds to enter a captcha and continue. And the system can be bypassed entirely for edge cases, like paid advertisers or site news.
3) Friend Requests
a) Create a config option in BuddyPress that allows the admin to remove the member’s directory with one click. Disable the member directory by “default” on new installs. In my experience, the only people that use the member’s directory (in its default state, on a socially oriented site) are Spammers, Marketers, and Competitors. There’s a reason Facebook, MySpace, LinkedIn, and Twitter do not have “global” member directories.
b) Implement same scheme as private messages.4) Group Creation
a) Add a field to the user table that allows Group limiting to be bypassed or set to a unique value on a user-per-user basis.
b) Add an option field on the admin menu that sets a maximum number of groups that can be created by a user. By default, set it at 5.5) Group Posts
a) Add a field to the user table that allows group post limiting to be bypassed or set to a unique value on a user-per-user basis.
b) Create a “whitelist” field on the admin page that allows “trusted” media sharing URL’s like YouTube, Revver, Flickr, etc to be bypassed in spam protection.
c) Create an option that automatically “scrubs” URL’s and email addresses from group posts if they are not on the whitelist. Not just “nofollow” …complete removal. This will stop 90% of abuse dead in its tracks, because most spammers are just trying to get traffic to a site or replies to an email.
d) If the system detects a URL or email address embedded in a message, and it’s not on the whitelist, require a captcha to be solved before allowing the post.
e) If they get the first captcha wrong, require them to solve two captchas before approving the post.…set R to be a random number on each installation between 3 and 7…
f) If the user gets R captchas wrong in a row, block their IP for a random amount of time (15 minutes to 2 hours).
g) If the user fails R captchas *again* after being blocked, permanently ban their IP and post it to akismet.
h) If a locally banned IP tries to visit the site, don’t throw an “error page”. Completely ignore the request and don’t send anything.i) For posts that do not contain a URL or email address, run the post through akismet. If it passes, approve the post. If it fails, require a captcha to be solved before allowing the post.
j) If they get the first captcha wrong, require them to solve two captchas before approving the post.
k) If the user gets R captchas wrong in a row, block their IP for a random amount of time (15 minutes to 2 hours).
l) If the user fails R captchas *again* after being blocked, permanently ban their IP and post it to akismet.
m) If a locally banned IP tries to visit the site, don’t throw an “error page”. Completely ignore the request and don’t send anything.6) Comments
a) Create an admin option that only allows users to comment on their *friend’s* items. Activate it by default on new BP installations.
7) Status Updates
a) Add a field to the user table that allows status update limiting to be bypassed or set to a unique value on a user-per-user basis.
b) Create a “whitelist” field on the admin page that allows “trusted” media sharing URL’s like YouTube, Revver, Flickr, etc to be bypassed in spam protection.
c) Create an option that automatically “scrubs” URL’s and email addresses from status updates if they are not on the whitelist. Not just “nofollow” …complete removal. This will stop 90% of abuse dead in its tracks, because most spammers are just trying to get traffic to a site or replies to an email.
d) If the system detects a URL or email address embedded in a message, and it’s not on the whitelist, require a captcha to be solved before allowing the activity stream post.
e) If they get the first captcha wrong, require them to solve two captchas before approving the activity stream post.…set R to be a random number on each installation between 3 and 7…
f) If the user gets R captchas wrong in a row, block their IP for a random amount of time (15 minutes to 2 hours).
g) If the user fails R captchas *again* after being blocked, permanently ban their IP and post it to akismet.
h) If a locally banned IP tries to visit the site, don’t throw an “error page”. Completely ignore the request and don’t send anything.i) For activity stream posts that do not contain a URL or email address, run the post through akismet. If it passes, approve the post. If it fails, require a captcha to be solved before allowing the post.
j) If they get the first captcha wrong, require them to solve two captchas before approving the post.
k) If the user gets R captchas wrong in a row, block their IP for a random amount of time (15 minutes to 2 hours).
l) If the user fails R captchas *again* after being blocked, permanently ban their IP and post it to akismet.
m) If a locally banned IP tries to visit the site, don’t throw an “error page”. Completely ignore the request and don’t send anything.8 ) In All Cases
a) When a member account is banned, or repeatedly triggers spam protection measures, send an alert to the site administrator.
b) Allow admin alerts to be disabled if necessary, example: DDOS attack against the site.9) CONCLUSION
While the list of modifications above may look incredibly complicated, really, it’s not.
I’d say “worst case” it’s about a week of work to research and make these modifications. Then we can push it out into beta testing with all the other new code to give it a proper shakedown.
I’m sure there are plenty of ways the algorithms above could be improved, so please go ahead and post your feedback!
Thanks!
^F^
May 6, 2010 at 6:00 pm #76958In reply to: Here come the spammers!!!
foxlyParticipantAll About BuddyPress Spam
From what I’ve seen over the past few days, the range of knowledge about spam in the BP community ranges from zero to PhD research project. So, to get this thread off to a productive start, I’m going to give everyone some background info on why spammers target our installations, how they do it, and what we can do to reduce or eliminate these kinds of attacks.
1) Why do spammers attack BP communities?
-> Spam is 100% economically motivated. Spammers do what they do because it’s very profitable. Even if only 1 out of a million messages the spammer sends actually reaches somebody, if it cost $2 to send out those million messages and the spammer makes $50 by tricking one person into giving them a credit card number, the spammer is going to throw every resource they have into sending out more messages …because they’re getting a 2500% return on their investment.
-> Given the choice between multiple sites, a spammer will pick the one that gives the largest payout.
Gmail is a “hard” target, with users that are experienced with spam. If a spammer sent a billion spam messages to accounts on Gmail, 99.9% of them would be probably be deleted by automated filters at other ISP’s along the way before even arriving at Gmail. The first thousand messages that arrived at gmail would likely be delivered but would be put in user’s spam folders; and the remaining 999,000 messages would be flat-out refused by Gmail’s servers.
Because anyone with an email account is familiar with spam, probably 999 of those 1000 users would ignore the spam message and 1 user might act on it. So if it cost $20 to send those billion messages and the spammer made $50 by tricking the one person into giving them a credit card number, they’ve only made $30 for all that work.
BP communities are usually “soft” targets that are inexperienced with spam.
Once a spammer gets into a BP community, every single message they send is delivered to a member, and most members are NOT expecting to be attacked by other users on the site.
If a user called “site_news” sends everyone a message that says: “Our site just got featured on Oprah! check out the video! http://www.youtube.com/watch/dQw4w9WgXcQ.cn” every single member is going to get that message, and probably half of them are going to click on the link. (did anyone notice what’s wrong with that “YouTube video” … )
Then, assuming there are 50,000 members on the BP site, half of them click on the link, half of those people are using Internet Explorer, and the attack site the link points to installs a backdoor on computers running IE …at $2 / install the spammer has just made $25,000!
Now, if *you* were a spammer, which site would you attack?
2) How do spammers find BP communities?
Using Google.
Example: http://www.google.ca/search?hl=en&q=%2B”is+proudly+powered+by+WordPress+and+BuddyPress” (front page of every BP site on the net)
Example: http://www.google.ca/search?hl=en&q=inurl:%22/community/members/%22+%2Bbuddypress (members page of every BP site on the net)3) How do spammers attack websites?
-> Most spam attacks are done using robots, because sheer volume of posts is usually the winning factor. In situations where there is a “captcha wall” or other defense blocking registration to a “high value” site (hint: yours), spammers will use people in low-wage countries to break the captcha and sign up on the site. The going rate is about $2 per 1000 captchas.
http://www.decaptcher.com/client/
Once inside the site, they will then use bots to post spam to all the members on the site.
-> There are literally *thousands* of different programs available that spam websites, and they all have *different* venerabilities.
For example, this program: http://forums.digitalpoint.com/showthread.php?t=1124949
a) Will DEFEAT a “hidden fields” challenge,
b) Will DEFEAT a “javascript proof of work” challenge,
c) Will FAIL a “captcha” challenge
d) Will FAIL an “Akismet” challenge
e) Will FAIL a “Hashed Form Field ID” challengeBut this program: http://www.botmasternet.com/more1/ , wikipedia: http://en.wikipedia.org/wiki/XRumer , video of it running: http://www.youtube.com/watch?v=AL2i4SNPJmg
a) Will DEFEAT a “hidden fields” challenge,
b) Will DEFEAT a “javascript proof of work” challenge,
c) Will DEFEAT a “captcha” challenge
d) Will DEFEAT an “Akismet” challenge (uses proxy networks, never sends the same message twice)
e) Will DEFEAT a “Hashed Form Field ID” challenge
f) Will FAIL a “enter the numbers with a triangle over them” challenge (as used by PlentyOfFish.com)
g) Will FAIL a “click on the photos of cats but not the photos of dogs” challenge4) How do we stop spammers from attacking BP communities?
-> By making it frustrating and unprofitable (but not necessarily impossible) for spammers to target us; while making these tactics invisible to normal users.
I will cover how I propose to do this in the next post.
^F^
May 5, 2010 at 2:08 am #76707peterverkooijenParticipant@jivany (“I don’t understand your BP forum complaints. You don’t use forums because you have basically replicated the forum concept in blog posts/comments”)
Exactly! My point is that integrating an external forum like bbPress into Buddypress is unnecessary and only creates a lot of confusion, undermines the structure. Less is more. KISS.
I would like Buddypress to consolidate on the smallest number of parts, leverage what’s already in WordPress, instead of adding database tables and external scripts that partly overlap/clash with other parts.
But bbPress seems to be taking over Buddypress. Wrong direction imho.
May 4, 2010 at 1:37 pm #76573peterverkooijenParticipantMike Pratt said 1 day ago:
“ @peterverkooijen @hnla I take the other side of your “little diff b/t blogs and forums” opinion. To me, a blog post is a significantly more “deliberate” piece of content … For ex, we have a group called the “12th Man Training Table” which centers on athlete nutrition. Folks want to post recipes for training means. Clearly, forum topics are the wrong vehicle. On the other hand, there are raging debates in that group that definitely belong in the forum construct..not a blog post with comments … So Peter, please keep in mind that what you would do to BP would build a BP that works for Peter, but it’s not necessarily the only use case around, that’s all.”
Mike Pratt, you miss the point. I’m talking about how the script and database is structured, not what you as a user should do with it. Functionally a blog post and a forum topic are the same thing; a piece of content that others can comment on. Similarly there only needs to be one way to store (threaded) comments. There is no need to duplicate that in forum thread, wires, etc. There is no need to have variations of posts and comments in different places in the database.
I’m talking about taking redundancies out, boiling down the architecture to the lowest number of necessary parts, less is more, keep it simple stupid. That does not mean you as a user will have less options. WP blog posts already provides many ways to make very different types of posts. In my P2-based custom theme I have started making a clear distinction between ‘status updates’ and ‘blog posts’ using categories. Apparently WP 3.0 will have more sophisticated hooks to do different things with different types of content.
Same for comments. There are already lots of different things you can do with comments, from IntenseDebate and other plugins to built-in threaded options, inline Ajax commenting and styling possibilities via your theme. Buddypress should leverage basic WordPress building blocks as much as possible instead of adding new database tables and third scripts like BBpress. Ultimately a lot of this is for the theme developers to develop. They could develop out-of-the-box themes for different use cases; schools, companies, sport clubs, etc. BP should focus on a solid core and flexible API.
April 28, 2010 at 1:11 am #75591stwcParticipantAlso, also, thanks for the new standard most-recently-bumped view of forum threads, @apeatling.
Enhancements I’d suggest would be
1) a link to the last post in the thread (easy to do, I know)
2) pagination in the most-recently-bumped view to see older bumped threads (or maybe a dropdown to select number of threads shown, but that would break the standard navigation paradigm being used, so probably suboptimal). Things move fast, and even visiting several times a day, stuff I want to track gets bumped off the front page, and is then very hard indeed to find, because I (and I assume other people) find it hard to remember in many cases which Group a thread was posted to (and threads are often posted in the ‘wrong’ Group, which makes it even harder).April 27, 2010 at 7:55 am #75425stwcParticipant@djpaul I spoke too soon, I think.
If I’m right, I’ve finally figured out how and when things were going wrong.
If I use bp_has_forum_topics(‘per_page=30′) in groups/forum/single/topic.php in my child theme, on pages that have less than 30 posts (or possibly 15, the default in bp-forums-templatetags.php), I get duplicated thread posts — in other words all the posts in a thread show up, then all of them show up again.
If I hack the bp-forums-templatetags.php file as described above, though, it seems to work fine. No duplicates, no matter the number of posts in a thread.
Weird. Possibly a bug?
December 18, 2009 at 10:52 am #59056komsParticipantI’ve displayed members in home page.For that, passing the parameter did not work . It only works for the member directory listing.
Correct me if I’m wrong.
August 4, 2009 at 3:32 pm #50592TheEasyButtonParticipantI apologize for not coming back sooner to say this is solved. Been having lots of computer issues. The reason the other code didn’t work was we were reading from the wrong table. Another table had the info we needed so I swapped it out and here’s what I’m using now. Hopefully this will come in handy for a lot of people.
This goes in the head
<!-- drop down search -->
<SCRIPT LANGUAGE="JavaScript">
function formHandler(form){
var URL = document.form.site.options[document.form.site.selectedIndex].value;
window.location.href = URL;
}
</SCRIPT>
<!-- end drop down search -->And this goes in the body
<!-- drop down search -->
<form name="form">
<select name="site" size=1>
<option value="">Blah Blah</option>
<?php
$field_id = 2; // this should be the id of the
// field you want, see your wp_bp_xprofile_fields
// database table to find it
global $wpdb;
$sql = "SELECT name FROM {$wpdb->base_prefix}bp_xprofile_fields WHERE parent_id = {$field_id} ORDER BY id DESC";
$result = $wpdb->get_col($wpdb->prepare($sql));
foreach($result as $row){
if(strlen($row) > 0){
$values[$row]++;
}
}
foreach($values as $key => $value){
echo "<option value=\"members/?s=$key\">$key</option>";
}
?>
</select>
<input type=button value="Go!" onClick="javascript:formHandler(this)">
</form>
<!-- end drop down search -->Don’t forget to change the number of the field. Thanks for all of your help
-
AuthorSearch Results